This commit is contained in:
redphx 2024-12-07 16:48:58 +07:00
parent 557a38214d
commit 4011eb402a
55 changed files with 181 additions and 139 deletions

View File

@ -38,7 +38,7 @@ try {
if (!BX_FLAGS.DeviceInfo.userAgent) BX_FLAGS.DeviceInfo.userAgent = window.navigator.userAgent; if (!BX_FLAGS.DeviceInfo.userAgent) BX_FLAGS.DeviceInfo.userAgent = window.navigator.userAgent;
BxLogger.info("BxFlags", BX_FLAGS); BxLogger.info("BxFlags", BX_FLAGS);
var NATIVE_FETCH = window.fetch; var NATIVE_FETCH = window.fetch;
var SMART_TV_UNIQUE_ID = "FC4A1DA2-711C-4E9C-BC7F-047AF8A672EA", CHROMIUM_VERSION = "123.0.0.0"; var SMART_TV_UNIQUE_ID = "FC4A1DA2-711C-4E9C-BC7F-047AF8A672EA", CHROMIUM_VERSION = "125.0.0.0";
if (!!window.chrome || window.navigator.userAgent.includes("Chrome")) { if (!!window.chrome || window.navigator.userAgent.includes("Chrome")) {
let match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/); let match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/);
if (match) CHROMIUM_VERSION = match[1]; if (match) CHROMIUM_VERSION = match[1];
@ -2515,6 +2515,7 @@ class ControllerSettingsTable extends BaseLocalTable {
async getControllersData() { async getControllersData() {
let all = await this.getAll(), results = {}; let all = await this.getAll(), results = {};
for (let key in all) { for (let key in all) {
if (!all[key]) continue;
let settings = all[key].data; let settings = all[key].data;
settings.vibrationIntensity /= 100, results[key] = settings; settings.vibrationIntensity /= 100, results[key] = settings;
} }
@ -3085,8 +3086,14 @@ class EmulatedMkbHandler extends MkbHandler {
else this.mouseDataProvider = new PointerLockMouseDataProvider(this); else this.mouseDataProvider = new PointerLockMouseDataProvider(this);
if (this.mouseDataProvider.init(), window.addEventListener("keydown", this.onKeyboardEvent), window.addEventListener("keyup", this.onKeyboardEvent), window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.onPollingModeChanged), window.addEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.onDialogShown), AppInterface) window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this), window.addEventListener(BxEvent.POINTER_LOCK_EXITED, this); if (this.mouseDataProvider.init(), window.addEventListener("keydown", this.onKeyboardEvent), window.addEventListener("keyup", this.onKeyboardEvent), window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.onPollingModeChanged), window.addEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.onDialogShown), AppInterface) window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this), window.addEventListener(BxEvent.POINTER_LOCK_EXITED, this);
else document.addEventListener("pointerlockchange", this.onPointerLockChange), document.addEventListener("pointerlockerror", this.onPointerLockError); else document.addEventListener("pointerlockchange", this.onPointerLockChange), document.addEventListener("pointerlockerror", this.onPointerLockError);
if (MkbPopup.getInstance().reset(), AppInterface) Toast.show(t("press-key-to-toggle-mkb", { key: "<b>F8</b>" }), t("virtual-controller"), { html: !0 }), this.waitForMouseData(!1); if (MkbPopup.getInstance().reset(), AppInterface) {
else this.waitForMouseData(!0); let shortcutKey = StreamSettings.findKeyboardShortcut("mkb.toggle");
if (shortcutKey) {
let msg = t("press-key-to-toggle-mkb", { key: `<b>${KeyHelper.codeToKeyName(shortcutKey)}</b>` });
Toast.show(msg, t("native-mkb"), { html: !0 });
}
this.waitForMouseData(!1);
} else this.waitForMouseData(!0);
} }
destroy() { destroy() {
if (!this.initialized) return; if (!this.initialized) return;
@ -3295,7 +3302,7 @@ class NavigationDialogManager {
if (this.gamepadLastStates[gamepad.index] = null, lastKeyPressed) return; if (this.gamepadLastStates[gamepad.index] = null, lastKeyPressed) return;
if (this.updateActiveInput("gamepad"), this.handleGamepad(gamepad, releasedButton)) return; if (this.updateActiveInput("gamepad"), this.handleGamepad(gamepad, releasedButton)) return;
if (releasedButton === 0) { if (releasedButton === 0) {
document.activeElement && document.activeElement.dispatchEvent(new MouseEvent("click", { bubbles: !0 })); document.activeElement?.dispatchEvent(new MouseEvent("click", { bubbles: !0 }));
return; return;
} else if (releasedButton === 1) { } else if (releasedButton === 1) {
this.hide(); this.hide();
@ -3560,6 +3567,7 @@ class BxSelectElement extends HTMLSelectElement {
$btnPrev.classList.toggle("bx-inactive", disableButtons), $btnNext.classList.toggle("bx-inactive", disableButtons); $btnPrev.classList.toggle("bx-inactive", disableButtons), $btnNext.classList.toggle("bx-inactive", disableButtons);
for (let i = 0;i < optionsList.length; i++) { for (let i = 0;i < optionsList.length; i++) {
let $option2 = optionsList[i], $indicator = indicatorsList[i]; let $option2 = optionsList[i], $indicator = indicatorsList[i];
if (!$option2 || !$indicator) continue;
if (clearDataSet($indicator), $option2.selected) $indicator.dataset.selected = "true"; if (clearDataSet($indicator), $option2.selected) $indicator.dataset.selected = "true";
if ($option2.index === visibleIndex) $indicator.dataset.highlighted = "true"; if ($option2.index === visibleIndex) $indicator.dataset.highlighted = "true";
} }
@ -5489,7 +5497,7 @@ class XcloudInterceptor {
let PREF_STREAM_TARGET_RESOLUTION = getPref("stream.video.resolution"), PREF_STREAM_PREFERRED_LOCALE = getPref("stream.locale"), url = typeof request === "string" ? request : request.url, parsedUrl = new URL(url), badgeRegion = parsedUrl.host.split(".", 1)[0]; let PREF_STREAM_TARGET_RESOLUTION = getPref("stream.video.resolution"), PREF_STREAM_PREFERRED_LOCALE = getPref("stream.locale"), url = typeof request === "string" ? request : request.url, parsedUrl = new URL(url), badgeRegion = parsedUrl.host.split(".", 1)[0];
for (let regionName in STATES.serverRegions) { for (let regionName in STATES.serverRegions) {
let region = STATES.serverRegions[regionName]; let region = STATES.serverRegions[regionName];
if (parsedUrl.origin == region.baseUri) { if (region && parsedUrl.origin === region.baseUri) {
badgeRegion = regionName; badgeRegion = regionName;
break; break;
} }
@ -6307,7 +6315,7 @@ class XboxApi {
let url = `https://displaycatalog.mp.microsoft.com/v7.0/products/lookup?market=US&languages=en&value=${xboxTitleId}&alternateId=XboxTitleId&fieldsTemplate=browse`, productTitle = (await (await NATIVE_FETCH(url)).json()).Products[0].LocalizedProperties[0].ProductTitle; let url = `https://displaycatalog.mp.microsoft.com/v7.0/products/lookup?market=US&languages=en&value=${xboxTitleId}&alternateId=XboxTitleId&fieldsTemplate=browse`, productTitle = (await (await NATIVE_FETCH(url)).json()).Products[0].LocalizedProperties[0].ProductTitle;
return XboxApi.CACHED_TITLES[xboxTitleId] = productTitle, productTitle; return XboxApi.CACHED_TITLES[xboxTitleId] = productTitle, productTitle;
} catch (e) {} } catch (e) {}
return null; return;
} }
} }
class RootDialogObserver { class RootDialogObserver {

View File

@ -40,7 +40,7 @@ try {
if (!BX_FLAGS.DeviceInfo.userAgent) BX_FLAGS.DeviceInfo.userAgent = window.navigator.userAgent; if (!BX_FLAGS.DeviceInfo.userAgent) BX_FLAGS.DeviceInfo.userAgent = window.navigator.userAgent;
BxLogger.info("BxFlags", BX_FLAGS); BxLogger.info("BxFlags", BX_FLAGS);
var NATIVE_FETCH = window.fetch; var NATIVE_FETCH = window.fetch;
var SMART_TV_UNIQUE_ID = "FC4A1DA2-711C-4E9C-BC7F-047AF8A672EA", CHROMIUM_VERSION = "123.0.0.0"; var SMART_TV_UNIQUE_ID = "FC4A1DA2-711C-4E9C-BC7F-047AF8A672EA", CHROMIUM_VERSION = "125.0.0.0";
if (!!window.chrome || window.navigator.userAgent.includes("Chrome")) { if (!!window.chrome || window.navigator.userAgent.includes("Chrome")) {
let match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/); let match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/);
if (match) CHROMIUM_VERSION = match[1]; if (match) CHROMIUM_VERSION = match[1];
@ -2624,6 +2624,7 @@ class ControllerSettingsTable extends BaseLocalTable {
async getControllersData() { async getControllersData() {
let all = await this.getAll(), results = {}; let all = await this.getAll(), results = {};
for (let key in all) { for (let key in all) {
if (!all[key]) continue;
let settings = all[key].data; let settings = all[key].data;
settings.vibrationIntensity /= 100, results[key] = settings; settings.vibrationIntensity /= 100, results[key] = settings;
} }
@ -3200,8 +3201,14 @@ class EmulatedMkbHandler extends MkbHandler {
else this.mouseDataProvider = new PointerLockMouseDataProvider(this); else this.mouseDataProvider = new PointerLockMouseDataProvider(this);
if (this.mouseDataProvider.init(), window.addEventListener("keydown", this.onKeyboardEvent), window.addEventListener("keyup", this.onKeyboardEvent), window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.onPollingModeChanged), window.addEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.onDialogShown), AppInterface) window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this), window.addEventListener(BxEvent.POINTER_LOCK_EXITED, this); if (this.mouseDataProvider.init(), window.addEventListener("keydown", this.onKeyboardEvent), window.addEventListener("keyup", this.onKeyboardEvent), window.addEventListener(BxEvent.XCLOUD_POLLING_MODE_CHANGED, this.onPollingModeChanged), window.addEventListener(BxEvent.XCLOUD_DIALOG_SHOWN, this.onDialogShown), AppInterface) window.addEventListener(BxEvent.POINTER_LOCK_REQUESTED, this), window.addEventListener(BxEvent.POINTER_LOCK_EXITED, this);
else document.addEventListener("pointerlockchange", this.onPointerLockChange), document.addEventListener("pointerlockerror", this.onPointerLockError); else document.addEventListener("pointerlockchange", this.onPointerLockChange), document.addEventListener("pointerlockerror", this.onPointerLockError);
if (MkbPopup.getInstance().reset(), AppInterface) Toast.show(t("press-key-to-toggle-mkb", { key: "<b>F8</b>" }), t("virtual-controller"), { html: !0 }), this.waitForMouseData(!1); if (MkbPopup.getInstance().reset(), AppInterface) {
else this.waitForMouseData(!0); let shortcutKey = StreamSettings.findKeyboardShortcut("mkb.toggle");
if (shortcutKey) {
let msg = t("press-key-to-toggle-mkb", { key: `<b>${KeyHelper.codeToKeyName(shortcutKey)}</b>` });
Toast.show(msg, t("native-mkb"), { html: !0 });
}
this.waitForMouseData(!1);
} else this.waitForMouseData(!0);
} }
destroy() { destroy() {
if (!this.initialized) return; if (!this.initialized) return;
@ -3418,7 +3425,7 @@ class NavigationDialogManager {
if (this.gamepadLastStates[gamepad.index] = null, lastKeyPressed) return; if (this.gamepadLastStates[gamepad.index] = null, lastKeyPressed) return;
if (this.updateActiveInput("gamepad"), this.handleGamepad(gamepad, releasedButton)) return; if (this.updateActiveInput("gamepad"), this.handleGamepad(gamepad, releasedButton)) return;
if (releasedButton === 0) { if (releasedButton === 0) {
document.activeElement && document.activeElement.dispatchEvent(new MouseEvent("click", { bubbles: !0 })); document.activeElement?.dispatchEvent(new MouseEvent("click", { bubbles: !0 }));
return; return;
} else if (releasedButton === 1) { } else if (releasedButton === 1) {
this.hide(); this.hide();
@ -3869,6 +3876,7 @@ class BxSelectElement extends HTMLSelectElement {
$btnPrev.classList.toggle("bx-inactive", disableButtons), $btnNext.classList.toggle("bx-inactive", disableButtons); $btnPrev.classList.toggle("bx-inactive", disableButtons), $btnNext.classList.toggle("bx-inactive", disableButtons);
for (let i = 0;i < optionsList.length; i++) { for (let i = 0;i < optionsList.length; i++) {
let $option2 = optionsList[i], $indicator = indicatorsList[i]; let $option2 = optionsList[i], $indicator = indicatorsList[i];
if (!$option2 || !$indicator) continue;
if (clearDataSet($indicator), $option2.selected) $indicator.dataset.selected = "true"; if (clearDataSet($indicator), $option2.selected) $indicator.dataset.selected = "true";
if ($option2.index === visibleIndex) $indicator.dataset.highlighted = "true"; if ($option2.index === visibleIndex) $indicator.dataset.highlighted = "true";
} }
@ -4329,7 +4337,9 @@ BxEvent.dispatch(window, BxEvent.XCLOUD_POLLING_MODE_CHANGED);
patchXcloudTitleInfo(str) { patchXcloudTitleInfo(str) {
let text = "async cloudConnect", index = str.indexOf(text); let text = "async cloudConnect", index = str.indexOf(text);
if (index < 0) return !1; if (index < 0) return !1;
let backetIndex = str.indexOf("{", index), titleInfoVar = str.substring(index, backetIndex).match(/\(([^)]+)\)/)[1].split(",")[0], newCode = ` let backetIndex = str.indexOf("{", index), params = str.substring(index, backetIndex).match(/\(([^)]+)\)/)[1];
if (!params) return !1;
let titleInfoVar = params.split(",")[0], newCode = `
${titleInfoVar} = window.BX_EXPOSED.modifyTitleInfo(${titleInfoVar}); ${titleInfoVar} = window.BX_EXPOSED.modifyTitleInfo(${titleInfoVar});
BxLogger.info('patchXcloudTitleInfo', ${titleInfoVar}); BxLogger.info('patchXcloudTitleInfo', ${titleInfoVar});
`; `;
@ -4338,7 +4348,9 @@ BxLogger.info('patchXcloudTitleInfo', ${titleInfoVar});
patchRemotePlayMkb(str) { patchRemotePlayMkb(str) {
let text = "async homeConsoleConnect", index = str.indexOf(text); let text = "async homeConsoleConnect", index = str.indexOf(text);
if (index < 0) return !1; if (index < 0) return !1;
let backetIndex = str.indexOf("{", index), configsVar = str.substring(index, backetIndex).match(/\(([^)]+)\)/)[1].split(",")[1], newCode = ` let backetIndex = str.indexOf("{", index), params = str.substring(index, backetIndex).match(/\(([^)]+)\)/)[1];
if (!params) return !1;
let configsVar = params.split(",")[1], newCode = `
Object.assign(${configsVar}.inputConfiguration, { Object.assign(${configsVar}.inputConfiguration, {
enableMouseInput: false, enableMouseInput: false,
enableKeyboardInput: false, enableKeyboardInput: false,
@ -7317,7 +7329,7 @@ class XhomeInterceptor {
XhomeInterceptor.consoleAddrs = {}; XhomeInterceptor.consoleAddrs = {};
for (let pair of pairs) { for (let pair of pairs) {
let [keyAddr, keyPort] = pair; let [keyAddr, keyPort] = pair;
if (serverDetails[keyAddr]) { if (keyAddr && keyPort && serverDetails[keyAddr]) {
let port = serverDetails[keyPort], ports = new Set; let port = serverDetails[keyPort], ports = new Set;
port && ports.add(port), ports.add(9002), XhomeInterceptor.consoleAddrs[serverDetails[keyAddr]] = Array.from(ports); port && ports.add(port), ports.add(9002), XhomeInterceptor.consoleAddrs[serverDetails[keyAddr]] = Array.from(ports);
} }
@ -7836,7 +7848,7 @@ class XcloudInterceptor {
let PREF_STREAM_TARGET_RESOLUTION = getPref("stream.video.resolution"), PREF_STREAM_PREFERRED_LOCALE = getPref("stream.locale"), url = typeof request === "string" ? request : request.url, parsedUrl = new URL(url), badgeRegion = parsedUrl.host.split(".", 1)[0]; let PREF_STREAM_TARGET_RESOLUTION = getPref("stream.video.resolution"), PREF_STREAM_PREFERRED_LOCALE = getPref("stream.locale"), url = typeof request === "string" ? request : request.url, parsedUrl = new URL(url), badgeRegion = parsedUrl.host.split(".", 1)[0];
for (let regionName in STATES.serverRegions) { for (let regionName in STATES.serverRegions) {
let region = STATES.serverRegions[regionName]; let region = STATES.serverRegions[regionName];
if (parsedUrl.origin == region.baseUri) { if (region && parsedUrl.origin === region.baseUri) {
badgeRegion = regionName; badgeRegion = regionName;
break; break;
} }
@ -8814,7 +8826,7 @@ class XcloudApi {
async getTitleInfo(id) { async getTitleInfo(id) {
if (id in this.CACHE_TITLES) return this.CACHE_TITLES[id]; if (id in this.CACHE_TITLES) return this.CACHE_TITLES[id];
let baseUri = STATES.selectedRegion.baseUri; let baseUri = STATES.selectedRegion.baseUri;
if (!baseUri || !STATES.gsToken) return null; if (!baseUri || !STATES.gsToken) return;
let json; let json;
try { try {
json = (await (await NATIVE_FETCH(`${baseUri}/v2/titles`, { json = (await (await NATIVE_FETCH(`${baseUri}/v2/titles`, {
@ -9048,7 +9060,7 @@ class XboxApi {
let url = `https://displaycatalog.mp.microsoft.com/v7.0/products/lookup?market=US&languages=en&value=${xboxTitleId}&alternateId=XboxTitleId&fieldsTemplate=browse`, productTitle = (await (await NATIVE_FETCH(url)).json()).Products[0].LocalizedProperties[0].ProductTitle; let url = `https://displaycatalog.mp.microsoft.com/v7.0/products/lookup?market=US&languages=en&value=${xboxTitleId}&alternateId=XboxTitleId&fieldsTemplate=browse`, productTitle = (await (await NATIVE_FETCH(url)).json()).Products[0].LocalizedProperties[0].ProductTitle;
return XboxApi.CACHED_TITLES[xboxTitleId] = productTitle, productTitle; return XboxApi.CACHED_TITLES[xboxTitleId] = productTitle, productTitle;
} catch (e) {} } catch (e) {}
return null; return;
} }
} }
class RootDialogObserver { class RootDialogObserver {

View File

@ -95,7 +95,7 @@ export class KeyHelper {
const tmp = str.split(':'); const tmp = str.split(':');
const code = tmp[0] as KeyEventInfo['code']; const code = tmp[0] as KeyEventInfo['code'];
const modifiers = parseInt(tmp[1]); const modifiers = parseInt(tmp[1] as string);
return { return {
code, code,

View File

@ -16,6 +16,8 @@ import { getPref } from "@/utils/settings-storages/global-settings-storage";
import { GamepadKey, GamepadStick } from "@/enums/gamepad"; import { GamepadKey, GamepadStick } from "@/enums/gamepad";
import { MkbPopup } from "./mkb-popup"; import { MkbPopup } from "./mkb-popup";
import type { MkbConvertedPresetData } from "@/types/presets"; import type { MkbConvertedPresetData } from "@/types/presets";
import { StreamSettings } from "@/utils/stream-settings";
import { ShortcutAction } from "@/enums/shortcut-actions";
const PointerToMouseButton = { const PointerToMouseButton = {
1: 0, 1: 0,
@ -529,7 +531,12 @@ export class EmulatedMkbHandler extends MkbHandler {
MkbPopup.getInstance().reset(); MkbPopup.getInstance().reset();
if (AppInterface) { if (AppInterface) {
Toast.show(t('press-key-to-toggle-mkb', {key: `<b>F8</b>`}), t('virtual-controller'), {html: true}); const shortcutKey = StreamSettings.findKeyboardShortcut(ShortcutAction.MKB_TOGGLE);
if (shortcutKey) {
const msg = t('press-key-to-toggle-mkb', { key: `<b>${KeyHelper.codeToKeyName(shortcutKey)}</b>` });
Toast.show(msg, t('native-mkb'), { html: true });
}
this.waitForMouseData(false); this.waitForMouseData(false);
} else { } else {
this.waitForMouseData(true); this.waitForMouseData(true);

View File

@ -480,6 +480,10 @@ BxEvent.dispatch(window, BxEvent.XCLOUD_POLLING_MODE_CHANGED);
// Get param name // Get param name
const params = str.substring(index, backetIndex).match(/\(([^)]+)\)/)![1]; const params = str.substring(index, backetIndex).match(/\(([^)]+)\)/)![1];
if (!params) {
return false;
}
const titleInfoVar = params.split(',')[0]; const titleInfoVar = params.split(',')[0];
const newCode = ` const newCode = `
@ -502,6 +506,10 @@ BxLogger.info('patchXcloudTitleInfo', ${titleInfoVar});
// Get param name // Get param name
const params = str.substring(index, backetIndex).match(/\(([^)]+)\)/)![1]; const params = str.substring(index, backetIndex).match(/\(([^)]+)\)/)![1];
if (!params) {
return false;
}
const configsVar = params.split(',')[1]; const configsVar = params.split(',')[1];
const newCode = ` const newCode = `

View File

@ -239,7 +239,7 @@ export class TouchController {
msg = t('touch-control-layout'); msg = t('touch-control-layout');
} }
layoutChanged && Toast.show(msg, layout.name, {html: html}); layoutChanged && Toast.show(msg, layout.name, { html });
window.setTimeout(() => { window.setTimeout(() => {
// Show gyroscope control in the "More options" dialog if this layout has gyroscope // Show gyroscope control in the "More options" dialog if this layout has gyroscope

View File

@ -393,7 +393,7 @@ export class NavigationDialogManager {
} }
if (releasedButton === GamepadKey.A) { if (releasedButton === GamepadKey.A) {
document.activeElement && document.activeElement.dispatchEvent(new MouseEvent('click', {bubbles: true})); document.activeElement?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
return; return;
} else if (releasedButton === GamepadKey.B) { } else if (releasedButton === GamepadKey.B) {
this.hide(); this.hide();

View File

@ -32,7 +32,7 @@ export class RemotePlayDialog extends NavigationDialog {
} }
private setupDialog() { private setupDialog() {
const $fragment = CE('div', {'class': 'bx-remote-play-container'}); const $fragment = CE('div', { class: 'bx-remote-play-container' });
const $settingNote = CE('p', {}); const $settingNote = CE('p', {});

View File

@ -859,7 +859,7 @@ export class SettingsDialog extends NavigationDialog {
setting.options[value] = label; setting.options[value] = label;
const $option = CE<HTMLOptionElement>('option', {value: value}, label); const $option = CE<HTMLOptionElement>('option', { value }, label);
const continent = continents[region.contintent]; const continent = continents[region.contintent];
if (!continent.children) { if (!continent.children) {
continent.children = []; continent.children = [];

View File

@ -28,7 +28,7 @@ export class GameTile {
} }
if (typeof totalWaitTime === 'number' && isElementVisible($elm)) { if (typeof totalWaitTime === 'number' && isElementVisible($elm)) {
const $div = CE('div', {'class': 'bx-game-tile-wait-time'}, const $div = CE('div', { class: 'bx-game-tile-wait-time' },
createSvgIcon(BxIcon.PLAYTIME), createSvgIcon(BxIcon.PLAYTIME),
CE('span', {}, secondsToHms(totalWaitTime)), CE('span', {}, secondsToHms(totalWaitTime)),
); );

View File

@ -26,6 +26,10 @@ export class ControllerSettingsTable extends BaseLocalTable<ControllerSettingsRe
const results: { [key: string]: ControllerSettingsRecord['data'] } = {}; const results: { [key: string]: ControllerSettingsRecord['data'] } = {};
for (const key in all) { for (const key in all) {
if (!all[key]) {
continue;
}
const settings = all[key].data; const settings = all[key].data;
// Pre-calculate virabtionIntensity // Pre-calculate virabtionIntensity
settings.vibrationIntensity /= 100; settings.vibrationIntensity /= 100;

View File

@ -20,7 +20,7 @@ export class ScreenshotManager {
this.$download = CE<HTMLAnchorElement>('a'); this.$download = CE<HTMLAnchorElement>('a');
this.$canvas = CE<HTMLCanvasElement>('canvas', {'class': 'bx-gone'}); this.$canvas = CE<HTMLCanvasElement>('canvas', { class: 'bx-gone' });
this.canvasContext = this.$canvas.getContext('2d', { this.canvasContext = this.$canvas.getContext('2d', {
alpha: false, alpha: false,
willReadFrequently: false, willReadFrequently: false,

View File

@ -41,7 +41,7 @@ export class SettingElement {
for (let value in setting.options) { for (let value in setting.options) {
const label = setting.options[value]; const label = setting.options[value];
const $option = CE<HTMLOptionElement>('option', {value: value}, label); const $option = CE<HTMLOptionElement>('option', { value }, label);
$parent.appendChild($option); $parent.appendChild($option);
} }
@ -75,7 +75,7 @@ export class SettingElement {
for (const value in setting.multipleOptions) { for (const value in setting.multipleOptions) {
const label = setting.multipleOptions[value]; const label = setting.multipleOptions[value];
const $option = CE<HTMLOptionElement>('option', {value: value}, label) as HTMLOptionElement; const $option = CE<HTMLOptionElement>('option', { value }, label) as HTMLOptionElement;
$option.selected = currentValue.indexOf(value) > -1; $option.selected = currentValue.indexOf(value) > -1;
$option.addEventListener('mousedown', function(e) { $option.addEventListener('mousedown', function(e) {

View File

@ -9,12 +9,12 @@ type UserAgentConfig = {
const SMART_TV_UNIQUE_ID = 'FC4A1DA2-711C-4E9C-BC7F-047AF8A672EA'; const SMART_TV_UNIQUE_ID = 'FC4A1DA2-711C-4E9C-BC7F-047AF8A672EA';
let CHROMIUM_VERSION = '123.0.0.0'; let CHROMIUM_VERSION = '125.0.0.0';
if (!!(window as any).chrome || window.navigator.userAgent.includes('Chrome')) { if (!!(window as any).chrome || window.navigator.userAgent.includes('Chrome')) {
// Get Chromium version in the original User-Agent value // Get Chromium version in the original User-Agent value
const match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/); const match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/);
if (match) { if (match) {
CHROMIUM_VERSION = match[1]; CHROMIUM_VERSION = match[1] as string;
} }
} }

View File

@ -128,7 +128,7 @@ export function parseDetailsPath(path: string) {
return; return;
} }
const titleSlug = matches.groups.titleSlug.replaceAll('\%' + '7C', '-'); const titleSlug = matches.groups.titleSlug!.replaceAll('\%' + '7C', '-');
const productId = matches.groups.productId; const productId = matches.groups.productId;
return { titleSlug, productId }; return { titleSlug, productId };

View File

@ -3,7 +3,7 @@ import { NATIVE_FETCH } from "./bx-flags"
export class XboxApi { export class XboxApi {
private static CACHED_TITLES: Record<string, string> = {}; private static CACHED_TITLES: Record<string, string> = {};
static async getProductTitle(xboxTitleId: number | string): Promise<string | null> { static async getProductTitle(xboxTitleId: number | string): Promise<string | undefined> {
xboxTitleId = xboxTitleId.toString(); xboxTitleId = xboxTitleId.toString();
if (XboxApi.CACHED_TITLES[xboxTitleId]) { if (XboxApi.CACHED_TITLES[xboxTitleId]) {
return XboxApi.CACHED_TITLES[xboxTitleId]; return XboxApi.CACHED_TITLES[xboxTitleId];
@ -20,6 +20,6 @@ export class XboxApi {
return productTitle; return productTitle;
} catch (e) {} } catch (e) {}
return null; return;
} }
} }

View File

@ -14,14 +14,14 @@ export class XcloudApi {
BxLogger.info(this.LOG_TAG, 'constructor()'); BxLogger.info(this.LOG_TAG, 'constructor()');
} }
async getTitleInfo(id: string): Promise<XcloudTitleInfo | null> { async getTitleInfo(id: string): Promise<XcloudTitleInfo | undefined> {
if (id in this.CACHE_TITLES) { if (id in this.CACHE_TITLES) {
return this.CACHE_TITLES[id]; return this.CACHE_TITLES[id];
} }
const baseUri = STATES.selectedRegion.baseUri; const baseUri = STATES.selectedRegion.baseUri;
if (!baseUri || !STATES.gsToken) { if (!baseUri || !STATES.gsToken) {
return null; return;
} }
let json; let json;

View File

@ -116,7 +116,7 @@ export class XcloudInterceptor {
let match = serverRegex.exec(region.baseUri); let match = serverRegex.exec(region.baseUri);
if (match) { if (match) {
shortName = match[1]; shortName = match[1] as string;
if (serverExtra[regionName]) { if (serverExtra[regionName]) {
shortName = serverExtra[regionName][0] + ' ' + shortName; shortName = serverExtra[regionName][0] + ' ' + shortName;
region.contintent = serverExtra[regionName][1]; region.contintent = serverExtra[regionName][1];
@ -155,10 +155,10 @@ export class XcloudInterceptor {
const url = (typeof request === 'string') ? request : (request as Request).url; const url = (typeof request === 'string') ? request : (request as Request).url;
const parsedUrl = new URL(url); const parsedUrl = new URL(url);
let badgeRegion: string = parsedUrl.host.split('.', 1)[0]; let badgeRegion: string = parsedUrl.host.split('.', 1)[0] as string;
for (let regionName in STATES.serverRegions) { for (let regionName in STATES.serverRegions) {
const region = STATES.serverRegions[regionName]; const region = STATES.serverRegions[regionName];
if (parsedUrl.origin == region.baseUri) { if (region && parsedUrl.origin === region.baseUri) {
badgeRegion = regionName; badgeRegion = regionName;
break; break;
} }

View File

@ -90,7 +90,7 @@ export class XhomeInterceptor {
XhomeInterceptor.consoleAddrs = {}; XhomeInterceptor.consoleAddrs = {};
for (const pair of pairs) { for (const pair of pairs) {
const [keyAddr, keyPort] = pair; const [keyAddr, keyPort] = pair;
if (serverDetails[keyAddr]) { if (keyAddr && keyPort && serverDetails[keyAddr]) {
const port = serverDetails[keyPort]; const port = serverDetails[keyPort];
// Add port 9002 to the list of ports // Add port 9002 to the list of ports
const ports = new Set<number>(); const ports = new Set<number>();

View File

@ -260,6 +260,9 @@ export class BxSelectElement extends HTMLSelectElement {
for (let i = 0; i < optionsList.length; i++) { for (let i = 0; i < optionsList.length; i++) {
const $option = optionsList[i]; const $option = optionsList[i];
const $indicator = indicatorsList[i]; const $indicator = indicatorsList[i];
if (!$option || !$indicator) {
continue;
}
clearDataSet($indicator); clearDataSet($indicator);
if ($option.selected) { if ($option.selected) {
@ -288,7 +291,7 @@ export class BxSelectElement extends HTMLSelectElement {
visibleIndex: currentIndex, visibleIndex: currentIndex,
} = this; } = this;
const goNext = (e.target as any).closest('button') === $btnNext; const goNext = (e.target as HTMLElement).closest('button') === $btnNext;
let newIndex = goNext ? currentIndex + 1 : currentIndex - 1; let newIndex = goNext ? currentIndex + 1 : currentIndex - 1;
if (newIndex > this.optionsList.length - 1) { if (newIndex > this.optionsList.length - 1) {