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;
BxLogger.info("BxFlags", BX_FLAGS);
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")) {
let match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/);
if (match) CHROMIUM_VERSION = match[1];
@ -2515,6 +2515,7 @@ class ControllerSettingsTable extends BaseLocalTable {
async getControllersData() {
let all = await this.getAll(), results = {};
for (let key in all) {
if (!all[key]) continue;
let settings = all[key].data;
settings.vibrationIntensity /= 100, results[key] = settings;
}
@ -3085,8 +3086,14 @@ class EmulatedMkbHandler extends MkbHandler {
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);
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);
else this.waitForMouseData(!0);
if (MkbPopup.getInstance().reset(), AppInterface) {
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() {
if (!this.initialized) return;
@ -3295,7 +3302,7 @@ class NavigationDialogManager {
if (this.gamepadLastStates[gamepad.index] = null, lastKeyPressed) return;
if (this.updateActiveInput("gamepad"), this.handleGamepad(gamepad, releasedButton)) return;
if (releasedButton === 0) {
document.activeElement && document.activeElement.dispatchEvent(new MouseEvent("click", { bubbles: !0 }));
document.activeElement?.dispatchEvent(new MouseEvent("click", { bubbles: !0 }));
return;
} else if (releasedButton === 1) {
this.hide();
@ -3560,6 +3567,7 @@ class BxSelectElement extends HTMLSelectElement {
$btnPrev.classList.toggle("bx-inactive", disableButtons), $btnNext.classList.toggle("bx-inactive", disableButtons);
for (let i = 0;i < optionsList.length; i++) {
let $option2 = optionsList[i], $indicator = indicatorsList[i];
if (!$option2 || !$indicator) continue;
if (clearDataSet($indicator), $option2.selected) $indicator.dataset.selected = "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];
for (let regionName in STATES.serverRegions) {
let region = STATES.serverRegions[regionName];
if (parsedUrl.origin == region.baseUri) {
if (region && parsedUrl.origin === region.baseUri) {
badgeRegion = regionName;
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;
return XboxApi.CACHED_TITLES[xboxTitleId] = productTitle, productTitle;
} catch (e) {}
return null;
return;
}
}
class RootDialogObserver {

View File

@ -40,7 +40,7 @@ try {
if (!BX_FLAGS.DeviceInfo.userAgent) BX_FLAGS.DeviceInfo.userAgent = window.navigator.userAgent;
BxLogger.info("BxFlags", BX_FLAGS);
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")) {
let match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/);
if (match) CHROMIUM_VERSION = match[1];
@ -2624,6 +2624,7 @@ class ControllerSettingsTable extends BaseLocalTable {
async getControllersData() {
let all = await this.getAll(), results = {};
for (let key in all) {
if (!all[key]) continue;
let settings = all[key].data;
settings.vibrationIntensity /= 100, results[key] = settings;
}
@ -3200,8 +3201,14 @@ class EmulatedMkbHandler extends MkbHandler {
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);
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);
else this.waitForMouseData(!0);
if (MkbPopup.getInstance().reset(), AppInterface) {
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() {
if (!this.initialized) return;
@ -3418,7 +3425,7 @@ class NavigationDialogManager {
if (this.gamepadLastStates[gamepad.index] = null, lastKeyPressed) return;
if (this.updateActiveInput("gamepad"), this.handleGamepad(gamepad, releasedButton)) return;
if (releasedButton === 0) {
document.activeElement && document.activeElement.dispatchEvent(new MouseEvent("click", { bubbles: !0 }));
document.activeElement?.dispatchEvent(new MouseEvent("click", { bubbles: !0 }));
return;
} else if (releasedButton === 1) {
this.hide();
@ -3869,6 +3876,7 @@ class BxSelectElement extends HTMLSelectElement {
$btnPrev.classList.toggle("bx-inactive", disableButtons), $btnNext.classList.toggle("bx-inactive", disableButtons);
for (let i = 0;i < optionsList.length; i++) {
let $option2 = optionsList[i], $indicator = indicatorsList[i];
if (!$option2 || !$indicator) continue;
if (clearDataSet($indicator), $option2.selected) $indicator.dataset.selected = "true";
if ($option2.index === visibleIndex) $indicator.dataset.highlighted = "true";
}
@ -4329,7 +4337,9 @@ BxEvent.dispatch(window, BxEvent.XCLOUD_POLLING_MODE_CHANGED);
patchXcloudTitleInfo(str) {
let text = "async cloudConnect", index = str.indexOf(text);
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});
BxLogger.info('patchXcloudTitleInfo', ${titleInfoVar});
`;
@ -4338,7 +4348,9 @@ BxLogger.info('patchXcloudTitleInfo', ${titleInfoVar});
patchRemotePlayMkb(str) {
let text = "async homeConsoleConnect", index = str.indexOf(text);
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, {
enableMouseInput: false,
enableKeyboardInput: false,
@ -7317,7 +7329,7 @@ class XhomeInterceptor {
XhomeInterceptor.consoleAddrs = {};
for (let pair of pairs) {
let [keyAddr, keyPort] = pair;
if (serverDetails[keyAddr]) {
if (keyAddr && keyPort && serverDetails[keyAddr]) {
let port = serverDetails[keyPort], ports = new Set;
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];
for (let regionName in STATES.serverRegions) {
let region = STATES.serverRegions[regionName];
if (parsedUrl.origin == region.baseUri) {
if (region && parsedUrl.origin === region.baseUri) {
badgeRegion = regionName;
break;
}
@ -8814,7 +8826,7 @@ class XcloudApi {
async getTitleInfo(id) {
if (id in this.CACHE_TITLES) return this.CACHE_TITLES[id];
let baseUri = STATES.selectedRegion.baseUri;
if (!baseUri || !STATES.gsToken) return null;
if (!baseUri || !STATES.gsToken) return;
let json;
try {
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;
return XboxApi.CACHED_TITLES[xboxTitleId] = productTitle, productTitle;
} catch (e) {}
return null;
return;
}
}
class RootDialogObserver {

View File

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

View File

@ -16,6 +16,8 @@ import { getPref } from "@/utils/settings-storages/global-settings-storage";
import { GamepadKey, GamepadStick } from "@/enums/gamepad";
import { MkbPopup } from "./mkb-popup";
import type { MkbConvertedPresetData } from "@/types/presets";
import { StreamSettings } from "@/utils/stream-settings";
import { ShortcutAction } from "@/enums/shortcut-actions";
const PointerToMouseButton = {
1: 0,
@ -529,7 +531,12 @@ export class EmulatedMkbHandler extends MkbHandler {
MkbPopup.getInstance().reset();
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);
} else {
this.waitForMouseData(true);

View File

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

View File

@ -239,7 +239,7 @@ export class TouchController {
msg = t('touch-control-layout');
}
layoutChanged && Toast.show(msg, layout.name, {html: html});
layoutChanged && Toast.show(msg, layout.name, { html });
window.setTimeout(() => {
// 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) {
document.activeElement && document.activeElement.dispatchEvent(new MouseEvent('click', {bubbles: true}));
document.activeElement?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
return;
} else if (releasedButton === GamepadKey.B) {
this.hide();

View File

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

View File

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

View File

@ -28,7 +28,7 @@ export class GameTile {
}
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),
CE('span', {}, secondsToHms(totalWaitTime)),
);

View File

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

View File

@ -20,7 +20,7 @@ export class ScreenshotManager {
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', {
alpha: false,
willReadFrequently: false,

View File

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

View File

@ -9,12 +9,12 @@ type UserAgentConfig = {
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')) {
// Get Chromium version in the original User-Agent value
const match = window.navigator.userAgent.match(/\s(?:Chrome|Edg)\/([\d\.]+)/);
if (match) {
CHROMIUM_VERSION = match[1];
CHROMIUM_VERSION = match[1] as string;
}
}

View File

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

View File

@ -3,7 +3,7 @@ import { NATIVE_FETCH } from "./bx-flags"
export class XboxApi {
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();
if (XboxApi.CACHED_TITLES[xboxTitleId]) {
return XboxApi.CACHED_TITLES[xboxTitleId];
@ -20,6 +20,6 @@ export class XboxApi {
return productTitle;
} catch (e) {}
return null;
return;
}
}

View File

@ -14,14 +14,14 @@ export class XcloudApi {
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) {
return this.CACHE_TITLES[id];
}
const baseUri = STATES.selectedRegion.baseUri;
if (!baseUri || !STATES.gsToken) {
return null;
return;
}
let json;

View File

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

View File

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

View File

@ -260,6 +260,9 @@ export class BxSelectElement extends HTMLSelectElement {
for (let i = 0; i < optionsList.length; i++) {
const $option = optionsList[i];
const $indicator = indicatorsList[i];
if (!$option || !$indicator) {
continue;
}
clearDataSet($indicator);
if ($option.selected) {
@ -288,7 +291,7 @@ export class BxSelectElement extends HTMLSelectElement {
visibleIndex: currentIndex,
} = 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;
if (newIndex > this.optionsList.length - 1) {