Create better-xcloud.lite.user.js

This commit is contained in:
redphx
2024-09-30 17:11:05 +07:00
parent 109cd63a7b
commit bd58355ef5
17 changed files with 276 additions and 92 deletions

View File

@@ -1,3 +1,5 @@
import { isFullVersion } from "@macros/build" with {type: "macro"};
import { ControllerShortcut } from "@/modules/controller-shortcut";
import { BxEvent } from "@utils/bx-event";
import { deepClone, STATES } from "@utils/global";
@@ -110,8 +112,8 @@ export const BxExposed = {
}
},
handleControllerShortcut: ControllerShortcut.handle,
resetControllerShortcut: ControllerShortcut.reset,
handleControllerShortcut: isFullVersion() && ControllerShortcut.handle,
resetControllerShortcut: isFullVersion() && ControllerShortcut.reset,
overrideSettings: {
'Tv_settings': {

View File

@@ -2,6 +2,7 @@ import type { BaseSettingsStore } from "./settings-storages/base-settings-storag
import { UserAgent } from "./user-agent";
export const SCRIPT_VERSION = Bun.env.SCRIPT_VERSION!;
export const SCRIPT_VARIANT = Bun.env.BUILD_VARIANT! as BuildVariant;
export const AppInterface = window.AppInterface;

View File

@@ -31,7 +31,7 @@ export class Screenshot {
}
static updateCanvasFilters(filters: string) {
Screenshot.#canvasContext.filter = filters;
Screenshot.#canvasContext && (Screenshot.#canvasContext.filter = filters);
}
static #onAnimationEnd(e: Event) {

View File

@@ -3,6 +3,7 @@ import type { NumberStepperParams, SettingDefinitions } from "@/types/setting-de
import { BxEvent } from "../bx-event";
import { SettingElementType } from "../setting-element";
import { t } from "../translation";
import { SCRIPT_VARIANT } from "../global";
export class BaseSettingsStore {
private storage: Storage;
@@ -18,6 +19,11 @@ export class BaseSettingsStore {
for (settingId in definitions) {
const setting = definitions[settingId];
// Convert requiredVariants to array
if (typeof setting.requiredVariants === 'string') {
setting.requiredVariants = [setting.requiredVariants];
}
/*
if (setting.migrate && settingId in savedPrefs) {
setting.migrate.call(this, savedPrefs, savedPrefs[settingId]);
@@ -58,9 +64,16 @@ export class BaseSettingsStore {
return;
}
const definition = this.definitions[key];
// Return default value if build variant is different
if (definition.requiredVariants && !definition.requiredVariants.includes(SCRIPT_VARIANT)) {
return definition.default;
}
// Return default value if the feature is not supported
if (checkUnsupported && this.definitions[key].unsupported) {
return this.definitions[key].default;
if (checkUnsupported && definition.unsupported) {
return definition.default;
}
if (!(key in this.settings)) {

View File

@@ -197,6 +197,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.SCREENSHOT_APPLY_FILTERS]: {
requiredVariants: 'full',
label: t('screenshot-apply-filters'),
default: false,
},
@@ -211,6 +212,8 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.STREAM_COMBINE_SOURCES]: {
requiredVariants: 'full',
label: t('combine-audio-video-streams'),
default: false,
experimental: true,
@@ -218,6 +221,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.STREAM_TOUCH_CONTROLLER]: {
requiredVariants: 'full',
label: t('tc-availability'),
default: StreamTouchController.ALL,
options: {
@@ -233,11 +237,13 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
},
[PrefKey.STREAM_TOUCH_CONTROLLER_AUTO_OFF]: {
requiredVariants: 'full',
label: t('tc-auto-off'),
default: false,
unsupported: !STATES.userAgent.capabilities.touch,
},
[PrefKey.STREAM_TOUCH_CONTROLLER_DEFAULT_OPACITY]: {
requiredVariants: 'full',
type: SettingElementType.NUMBER_STEPPER,
label: t('tc-default-opacity'),
default: 100,
@@ -252,6 +258,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
unsupported: !STATES.userAgent.capabilities.touch,
},
[PrefKey.STREAM_TOUCH_CONTROLLER_STYLE_STANDARD]: {
requiredVariants: 'full',
label: t('tc-standard-layout-style'),
default: 'default',
options: {
@@ -262,6 +269,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
unsupported: !STATES.userAgent.capabilities.touch,
},
[PrefKey.STREAM_TOUCH_CONTROLLER_STYLE_CUSTOM]: {
requiredVariants: 'full',
label: t('tc-custom-layout-style'),
default: 'default',
options: {
@@ -276,15 +284,18 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
default: false,
},
[PrefKey.MKB_HIDE_IDLE_CURSOR]: {
requiredVariants: 'full',
label: t('hide-idle-cursor'),
default: false,
},
[PrefKey.STREAM_DISABLE_FEEDBACK_DIALOG]: {
requiredVariants: 'full',
label: t('disable-post-stream-feedback-dialog'),
default: false,
},
[PrefKey.BITRATE_VIDEO_MAX]: {
requiredVariants: 'full',
type: SettingElementType.NUMBER_STEPPER,
label: t('bitrate-video-maximum'),
note: '⚠️ ' + t('unexpected-behavior'),
@@ -306,10 +317,11 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
suggest: {
highest: 0,
}
},
},
[PrefKey.GAME_BAR_POSITION]: {
requiredVariants: 'full',
label: t('position'),
default: 'bottom-left',
options: {
@@ -320,6 +332,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.LOCAL_CO_OP_ENABLED]: {
requiredVariants: 'full',
label: t('enable-local-co-op-support'),
default: false,
note: CE<HTMLAnchorElement>('a', {
@@ -341,15 +354,18 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.CONTROLLER_ENABLE_SHORTCUTS]: {
requiredVariants: 'full',
default: false,
},
[PrefKey.CONTROLLER_ENABLE_VIBRATION]: {
requiredVariants: 'full',
label: t('controller-vibration'),
default: true,
},
[PrefKey.CONTROLLER_DEVICE_VIBRATION]: {
requiredVariants: 'full',
label: t('device-vibration'),
default: ControllerDeviceVibration.OFF,
options: {
@@ -360,6 +376,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.CONTROLLER_VIBRATION_INTENSITY]: {
requiredVariants: 'full',
label: t('vibration-intensity'),
type: SettingElementType.NUMBER_STEPPER,
default: 100,
@@ -373,6 +390,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.MKB_ENABLED]: {
requiredVariants: 'full',
label: t('enable-mkb'),
default: false,
unsupported: ((): string | boolean => {
@@ -398,6 +416,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.NATIVE_MKB_ENABLED]: {
requiredVariants: 'full',
label: t('native-mkb'),
default: 'default',
options: {
@@ -419,6 +438,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.NATIVE_MKB_SCROLL_HORIZONTAL_SENSITIVITY]: {
requiredVariants: 'full',
label: t('horizontal-scroll-sensitivity'),
type: SettingElementType.NUMBER_STEPPER,
default: 0,
@@ -438,6 +458,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.NATIVE_MKB_SCROLL_VERTICAL_SENSITIVITY]: {
requiredVariants: 'full',
label: t('vertical-scroll-sensitivity'),
type: SettingElementType.NUMBER_STEPPER,
default: 0,
@@ -457,10 +478,12 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.MKB_DEFAULT_PRESET_ID]: {
requiredVariants: 'full',
default: 0,
},
[PrefKey.MKB_ABSOLUTE_MOUSE]: {
requiredVariants: 'full',
default: false,
},
@@ -470,6 +493,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.UI_LOADING_SCREEN_GAME_ART]: {
requiredVariants: 'full',
label: t('show-game-art'),
default: true,
},
@@ -493,6 +517,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.UI_LAYOUT]: {
requiredVariants: 'full',
label: t('layout'),
default: 'default',
options: {
@@ -508,11 +533,13 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.UI_HOME_CONTEXT_MENU_DISABLED]: {
requiredVariants: 'full',
label: t('disable-home-context-menu'),
default: STATES.browser.capabilities.touch,
},
[PrefKey.UI_HIDE_SECTIONS]: {
requiredVariants: 'full',
label: t('hide-sections'),
default: [],
multipleOptions: {
@@ -529,6 +556,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.UI_GAME_CARD_SHOW_WAIT_TIME]: {
requiredVariants: 'full',
label: t('show-wait-time-in-game-card'),
default: false,
},
@@ -663,6 +691,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
default: false,
},
[PrefKey.AUDIO_ENABLE_VOLUME_CONTROL]: {
requiredVariants: 'full',
label: t('enable-volume-control'),
default: false,
},
@@ -743,11 +772,13 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.REMOTE_PLAY_ENABLED]: {
requiredVariants: 'full',
label: t('enable-remote-play-feature'),
default: false,
},
[PrefKey.REMOTE_PLAY_RESOLUTION]: {
requiredVariants: 'full',
default: StreamResolution.DIM_1080P,
options: {
[StreamResolution.DIM_1080P]: '1080p',
@@ -756,6 +787,7 @@ export class GlobalSettingsStorage extends BaseSettingsStorage {
},
[PrefKey.GAME_FORTNITE_FORCE_CONSOLE]: {
requiredVariants: 'full',
label: '🎮 ' + t('fortnite-force-console-version'),
default: false,
note: t('fortnite-allow-stw-mode'),

View File

@@ -1,5 +1,5 @@
import { BxIcon } from "./bx-icon";
import { AppInterface, STATES } from "./global";
import { AppInterface, SCRIPT_VARIANT, STATES } from "./global";
import { ButtonStyle, CE, clearDataSet, createButton, getReactProps } from "./html";
import { t } from "./translation";
@@ -27,7 +27,7 @@ export class TrueAchievements {
TrueAchievements.open(true, dataset.xboxTitleId, dataset.id);
// Close all xCloud's dialogs
window.BX_EXPOSED.dialogRoutes.closeAll();
window.BX_EXPOSED.dialogRoutes?.closeAll();
}
private static $hiddenLink = CE<HTMLAnchorElement>('a', {
@@ -53,6 +53,11 @@ export class TrueAchievements {
}
static injectAchievementsProgress($elm: HTMLElement) {
// Only do this in Full version
if (SCRIPT_VARIANT !== 'full') {
return;
}
const $parent = $elm.parentElement!;
// Wrap xCloud's element with our own
@@ -89,6 +94,11 @@ export class TrueAchievements {
}
static injectAchievementDetailPage($parent: HTMLElement) {
// Only do this in Full version
if (SCRIPT_VARIANT !== 'full') {
return;
}
const props = getReactProps($parent);
if (!props) {
return;