mirror of
https://github.com/redphx/better-xcloud.git
synced 2025-08-02 03:16:42 +02:00
Add option to show wait time in game card
This commit is contained in:
@@ -14,10 +14,12 @@ const userAgentHasTouchSupport = !isTv && !isVr && browserHasTouchSupport;
|
||||
|
||||
export const STATES: BxStates = {
|
||||
supportedRegion: true,
|
||||
serverRegions: {},
|
||||
selectedRegion: {},
|
||||
gsToken: '',
|
||||
|
||||
isPlaying: false,
|
||||
appContext: {},
|
||||
serverRegions: {},
|
||||
|
||||
browser: {
|
||||
capabilities: {
|
||||
|
@@ -104,6 +104,16 @@ export const createButton = <T=HTMLButtonElement>(options: BxButton): T => {
|
||||
return $btn as T;
|
||||
}
|
||||
|
||||
export function getReactProps($elm: HTMLElement): any | null {
|
||||
for (const key in $elm) {
|
||||
if (key.startsWith('__reactProps')) {
|
||||
return ($elm as any)[key];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export function escapeHtml(html: string): string {
|
||||
const text = document.createTextNode(html);
|
||||
const $span = document.createElement('span');
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { CE } from "@utils/html";
|
||||
import { SUPPORTED_LANGUAGES, t, ut } from "@utils/translation";
|
||||
import { SUPPORTED_LANGUAGES, t} from "@utils/translation";
|
||||
import { SettingElement, SettingElementType } from "@utils/settings";
|
||||
import { UserAgent } from "@utils/user-agent";
|
||||
import { StreamStat } from "@modules/stream/stream-stats";
|
||||
@@ -76,6 +76,7 @@ export enum PrefKey {
|
||||
UI_HIDE_SECTIONS = 'ui_hide_sections',
|
||||
|
||||
UI_HOME_CONTEXT_MENU_DISABLED = 'ui_home_context_menu_disabled',
|
||||
UI_GAME_CARD_SHOW_WAIT_TIME = 'ui_game_card_show_wait_time',
|
||||
|
||||
VIDEO_PLAYER_TYPE = 'video_player_type',
|
||||
VIDEO_PROCESSING = 'video_processing',
|
||||
@@ -581,6 +582,11 @@ export class Preferences {
|
||||
},
|
||||
},
|
||||
|
||||
[PrefKey.UI_GAME_CARD_SHOW_WAIT_TIME]: {
|
||||
label: t('show-wait-time-in-game-card'),
|
||||
default: false,
|
||||
},
|
||||
|
||||
[PrefKey.BLOCK_SOCIAL_FEATURES]: {
|
||||
label: t('disable-social-features'),
|
||||
default: false,
|
||||
|
@@ -212,6 +212,7 @@ const Texts = {
|
||||
"show-stats-on-startup": "Show stats when starting the game",
|
||||
"show-touch-controller": "Show touch controller",
|
||||
"show-wait-time": "Show the estimated wait time",
|
||||
"show-wait-time-in-game-card": "Show wait time in game card",
|
||||
"simplify-stream-menu": "Simplify Stream's menu",
|
||||
"skip-splash-video": "Skip Xbox splash video",
|
||||
"slow": "Slow",
|
||||
|
79
src/utils/xcloud-api.ts
Normal file
79
src/utils/xcloud-api.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
import { NATIVE_FETCH } from "./bx-flags";
|
||||
import { STATES } from "./global";
|
||||
|
||||
export class XcloudApi {
|
||||
private static instance: XcloudApi;
|
||||
|
||||
public static getInstance(): XcloudApi {
|
||||
if (!XcloudApi.instance) {
|
||||
XcloudApi.instance = new XcloudApi();
|
||||
}
|
||||
|
||||
return XcloudApi.instance;
|
||||
}
|
||||
|
||||
#CACHE_TITLES: {[key: string]: XcloudTitleInfo} = {};
|
||||
#CACHE_WAIT_TIME: {[key: string]: XcloudWaitTimeInfo} = {};
|
||||
|
||||
async getTitleInfo(id: string): Promise<XcloudTitleInfo | null> {
|
||||
if (id in this.#CACHE_TITLES) {
|
||||
return this.#CACHE_TITLES[id];
|
||||
}
|
||||
|
||||
const baseUri = STATES.selectedRegion.baseUri;
|
||||
if (!baseUri || !STATES.gsToken) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let json;
|
||||
try {
|
||||
const response = await NATIVE_FETCH(`${baseUri}/v2/titles`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${STATES.gsToken}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
|
||||
// format the data
|
||||
body: JSON.stringify({
|
||||
alternateIds: [id],
|
||||
alternateIdType: 'productId',
|
||||
}),
|
||||
});
|
||||
|
||||
json = (await response.json()).results[0];
|
||||
} catch (e) {
|
||||
json = {}
|
||||
}
|
||||
this.#CACHE_TITLES[id] = json;
|
||||
return json;
|
||||
}
|
||||
|
||||
async getWaitTime(id: string): Promise<XcloudWaitTimeInfo | null> {
|
||||
if (id in this.#CACHE_WAIT_TIME) {
|
||||
return this.#CACHE_WAIT_TIME[id];
|
||||
}
|
||||
|
||||
const baseUri = STATES.selectedRegion.baseUri;
|
||||
if (!baseUri || !STATES.gsToken) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let json;
|
||||
try {
|
||||
const response = await NATIVE_FETCH(`${baseUri}/v1/waittime/${id}`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${STATES.gsToken}`,
|
||||
},
|
||||
});
|
||||
|
||||
json = await response.json();
|
||||
} catch (e) {
|
||||
json = {};
|
||||
}
|
||||
|
||||
this.#CACHE_WAIT_TIME[id] = json;
|
||||
return json;
|
||||
}
|
||||
}
|
@@ -52,6 +52,10 @@ class XcloudInterceptor {
|
||||
const regionName = region.name as keyof typeof serverEmojis;
|
||||
let shortName = region.name;
|
||||
|
||||
if (region.isDefault) {
|
||||
STATES.selectedRegion = Object.assign({}, region);
|
||||
}
|
||||
|
||||
let match = serverRegex.exec(region.baseUri);
|
||||
if (match) {
|
||||
shortName = match[1];
|
||||
@@ -72,8 +76,11 @@ class XcloudInterceptor {
|
||||
tmp.isDefault = true;
|
||||
|
||||
obj.offeringSettings.regions = [tmp];
|
||||
STATES.selectedRegion = tmp;
|
||||
}
|
||||
|
||||
STATES.gsToken = obj.gsToken;
|
||||
|
||||
response.json = () => Promise.resolve(obj);
|
||||
return response;
|
||||
}
|
||||
|
Reference in New Issue
Block a user