mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-01 15:29:54 +00:00
Compare commits
9 Commits
v3.2.2
...
v2.10.10-pre2
| Author | SHA1 | Date | |
|---|---|---|---|
| 3489fd7d69 | |||
| e21a5d5890 | |||
| 80a00a0d35 | |||
| 91186da979 | |||
| 7c3ae9b62b | |||
| 75ad98a7b2 | |||
| 479a16c655 | |||
| 8f26fdec2d | |||
| 29d651bed6 |
@@ -1,4 +1,4 @@
|
|||||||
aiohttp==3.8.4
|
aiohttp==3.8.5
|
||||||
aiohttp-jinja2==1.5.1
|
aiohttp-jinja2==1.5.1
|
||||||
aiohttp_cors==0.7.0
|
aiohttp_cors==0.7.0
|
||||||
watchdog==2.1.7
|
watchdog==2.1.7
|
||||||
|
|||||||
@@ -186,6 +186,18 @@ class PluginBrowser:
|
|||||||
else:
|
else:
|
||||||
logger.fatal(f"Could not fetch from URL. {await res.text()}")
|
logger.fatal(f"Could not fetch from URL. {await res.text()}")
|
||||||
|
|
||||||
|
storeUrl = ""
|
||||||
|
match self.settings.getSetting("store", 0):
|
||||||
|
case 0: storeUrl = "https://plugins.deckbrew.xyz/plugins" # default
|
||||||
|
case 1: storeUrl = "https://testing.deckbrew.xyz/plugins" # testing
|
||||||
|
case 2: storeUrl = self.settings.getSetting("store-url", "https://plugins.deckbrew.xyz/plugins") # custom
|
||||||
|
case _: storeUrl = "https://plugins.deckbrew.xyz/plugins"
|
||||||
|
logger.info(f"Incrementing installs for {name} from URL {storeUrl} (version {version})")
|
||||||
|
async with ClientSession() as client:
|
||||||
|
res = await client.post(storeUrl+f"/{name}/versions/{version}/increment?isUpdate={isInstalled}", ssl=get_ssl_context())
|
||||||
|
if res.status != 200:
|
||||||
|
logger.error(f"Server did not accept install count increment request. code: {res.status}")
|
||||||
|
|
||||||
# Check to make sure we got the file
|
# Check to make sure we got the file
|
||||||
if res_zip is None:
|
if res_zip is None:
|
||||||
logger.fatal(f"Could not fetch {artifact}")
|
logger.fatal(f"Could not fetch {artifact}")
|
||||||
|
|||||||
@@ -58,8 +58,22 @@ def chown(path : str, user : UserType = UserType.HOST_USER, recursive : bool =
|
|||||||
def chmod(path : str, permissions : int, recursive : bool = True) -> bool:
|
def chmod(path : str, permissions : int, recursive : bool = True) -> bool:
|
||||||
if _get_effective_user_id() != 0:
|
if _get_effective_user_id() != 0:
|
||||||
return True
|
return True
|
||||||
result = call(["chmod", "-R", str(permissions), path] if recursive else ["chmod", str(permissions), path])
|
|
||||||
return result == 0
|
try:
|
||||||
|
octal_permissions = int(str(permissions), 8)
|
||||||
|
|
||||||
|
if recursive:
|
||||||
|
for root, dirs, files in os.walk(path):
|
||||||
|
for d in dirs:
|
||||||
|
os.chmod(os.path.join(root, d), octal_permissions)
|
||||||
|
for d in files:
|
||||||
|
os.chmod(os.path.join(root, d), octal_permissions)
|
||||||
|
|
||||||
|
os.chmod(path, octal_permissions)
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def folder_owner(path : str) -> UserType|None:
|
def folder_owner(path : str) -> UserType|None:
|
||||||
user_owner = _get_user_owner(path)
|
user_owner = _get_user_owner(path)
|
||||||
@@ -125,11 +139,19 @@ async def service_restart(service_name : str) -> bool:
|
|||||||
return res.returncode == 0
|
return res.returncode == 0
|
||||||
|
|
||||||
async def service_stop(service_name : str) -> bool:
|
async def service_stop(service_name : str) -> bool:
|
||||||
|
if not await service_active(service_name):
|
||||||
|
# Service isn't running. pretend we stopped it
|
||||||
|
return True
|
||||||
|
|
||||||
cmd = ["systemctl", "stop", service_name]
|
cmd = ["systemctl", "stop", service_name]
|
||||||
res = run(cmd, stdout=PIPE, stderr=STDOUT)
|
res = run(cmd, stdout=PIPE, stderr=STDOUT)
|
||||||
return res.returncode == 0
|
return res.returncode == 0
|
||||||
|
|
||||||
async def service_start(service_name : str) -> bool:
|
async def service_start(service_name : str) -> bool:
|
||||||
|
if await service_active(service_name):
|
||||||
|
# Service is running. pretend we started it
|
||||||
|
return True
|
||||||
|
|
||||||
cmd = ["systemctl", "start", service_name]
|
cmd = ["systemctl", "start", service_name]
|
||||||
res = run(cmd, stdout=PIPE, stderr=STDOUT)
|
res = run(cmd, stdout=PIPE, stderr=STDOUT)
|
||||||
return res.returncode == 0
|
return res.returncode == 0
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"decky-frontend-lib": "3.21.1",
|
"decky-frontend-lib": "3.24.1",
|
||||||
"filesize": "^10.0.7",
|
"filesize": "^10.0.7",
|
||||||
"i18next": "^23.2.1",
|
"i18next": "^23.2.1",
|
||||||
"i18next-http-backend": "^2.2.1",
|
"i18next-http-backend": "^2.2.1",
|
||||||
|
|||||||
Generated
+7
-7
@@ -6,8 +6,8 @@ settings:
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decky-frontend-lib:
|
decky-frontend-lib:
|
||||||
specifier: 3.21.1
|
specifier: 3.24.1
|
||||||
version: 3.21.1
|
version: 3.24.1
|
||||||
filesize:
|
filesize:
|
||||||
specifier: ^10.0.7
|
specifier: ^10.0.7
|
||||||
version: 10.0.7
|
version: 10.0.7
|
||||||
@@ -1482,8 +1482,8 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.1.2
|
ms: 2.1.2
|
||||||
|
|
||||||
/decky-frontend-lib@3.21.1:
|
/decky-frontend-lib@3.24.1:
|
||||||
resolution: {integrity: sha512-30605ET9qqZ6St6I9WmMmLGgSrTIdMwo7xy85+lRaF1miUd2icOGEJjwnbVcZDdkal+1fJ3tNEDXlchVfG4TrA==}
|
resolution: {integrity: sha512-VGxLTPetxx/pQVC+t8odTHrwQAh7uy4bO2Od2gGWSTfmUUoxtAcEtiXGyE9mKsoD6t7QNHrGvgXn78sf2i/IeQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/decode-named-character-reference@1.0.2:
|
/decode-named-character-reference@1.0.2:
|
||||||
@@ -1852,8 +1852,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/fsevents@2.3.2:
|
/fsevents@2.3.3:
|
||||||
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
@@ -3477,7 +3477,7 @@ packages:
|
|||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents: 2.3.2
|
fsevents: 2.3.3
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/rsvp@3.2.1:
|
/rsvp@3.2.1:
|
||||||
|
|||||||
@@ -1,12 +1,4 @@
|
|||||||
import {
|
import { ButtonItem, Focusable, PanelSection, PanelSectionRow } from 'decky-frontend-lib';
|
||||||
ButtonItem,
|
|
||||||
Focusable,
|
|
||||||
PanelSection,
|
|
||||||
PanelSectionRow,
|
|
||||||
joinClassNames,
|
|
||||||
scrollClasses,
|
|
||||||
staticClasses,
|
|
||||||
} from 'decky-frontend-lib';
|
|
||||||
import { VFC, useEffect, useState } from 'react';
|
import { VFC, useEffect, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { FaEyeSlash } from 'react-icons/fa';
|
import { FaEyeSlash } from 'react-icons/fa';
|
||||||
@@ -36,10 +28,7 @@ const PluginView: VFC = () => {
|
|||||||
return (
|
return (
|
||||||
<Focusable onCancelButton={closeActivePlugin}>
|
<Focusable onCancelButton={closeActivePlugin}>
|
||||||
<TitleView />
|
<TitleView />
|
||||||
<div
|
<div style={{ height: '100%', paddingTop: '16px' }}>
|
||||||
className={joinClassNames(staticClasses.TabGroupPanel, scrollClasses.ScrollPanel, scrollClasses.ScrollY)}
|
|
||||||
style={{ height: '100%' }}
|
|
||||||
>
|
|
||||||
{(visible || activePlugin.alwaysRender) && activePlugin.content}
|
{(visible || activePlugin.alwaysRender) && activePlugin.content}
|
||||||
</div>
|
</div>
|
||||||
</Focusable>
|
</Focusable>
|
||||||
@@ -48,7 +37,11 @@ const PluginView: VFC = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TitleView />
|
<TitleView />
|
||||||
<div className={joinClassNames(staticClasses.TabGroupPanel, scrollClasses.ScrollPanel, scrollClasses.ScrollY)}>
|
<div
|
||||||
|
style={{
|
||||||
|
paddingTop: '16px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
<PanelSection>
|
<PanelSection>
|
||||||
{pluginList
|
{pluginList
|
||||||
.filter((p) => p.content)
|
.filter((p) => p.content)
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ const titleStyles: CSSProperties = {
|
|||||||
display: 'flex',
|
display: 'flex',
|
||||||
paddingTop: '3px',
|
paddingTop: '3px',
|
||||||
paddingRight: '16px',
|
paddingRight: '16px',
|
||||||
|
position: 'sticky',
|
||||||
|
top: '0px',
|
||||||
};
|
};
|
||||||
|
|
||||||
const TitleView: VFC = () => {
|
const TitleView: VFC = () => {
|
||||||
|
|||||||
+17
-19
@@ -1,4 +1,4 @@
|
|||||||
import { findModuleChild, sleep } from 'decky-frontend-lib';
|
import { sleep } from 'decky-frontend-lib';
|
||||||
import { FaReact } from 'react-icons/fa';
|
import { FaReact } from 'react-icons/fa';
|
||||||
|
|
||||||
import Logger from './logger';
|
import Logger from './logger';
|
||||||
@@ -9,32 +9,30 @@ const logger = new Logger('DeveloperMode');
|
|||||||
|
|
||||||
let removeSettingsObserver: () => void = () => {};
|
let removeSettingsObserver: () => void = () => {};
|
||||||
|
|
||||||
export async function setShowValveInternal(show: boolean) {
|
declare global {
|
||||||
let settingsMod: any;
|
interface Window {
|
||||||
while (!settingsMod) {
|
settingsStore: any;
|
||||||
settingsMod = findModuleChild((m) => {
|
|
||||||
if (typeof m !== 'object') return undefined;
|
|
||||||
for (let prop in m) {
|
|
||||||
if (typeof m[prop]?.settings?.bIsValveEmail !== 'undefined') return m[prop];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (!settingsMod) {
|
|
||||||
logger.debug('[ValveInternal] waiting for settingsMod');
|
|
||||||
await sleep(1000);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function setShowValveInternal(show: boolean) {
|
||||||
if (show) {
|
if (show) {
|
||||||
removeSettingsObserver = settingsMod[
|
const mobx =
|
||||||
Object.getOwnPropertySymbols(settingsMod).find((x) => x.toString() == 'Symbol(mobx administration)') as any
|
window.settingsStore[
|
||||||
].observe((e: any) => {
|
Object.getOwnPropertySymbols(window.settingsStore).find(
|
||||||
|
(x) => x.toString() == 'Symbol(mobx administration)',
|
||||||
|
) as any
|
||||||
|
];
|
||||||
|
|
||||||
|
removeSettingsObserver = (mobx.observe_ || mobx.observe).call(mobx, (e: any) => {
|
||||||
e.newValue.bIsValveEmail = true;
|
e.newValue.bIsValveEmail = true;
|
||||||
});
|
});
|
||||||
settingsMod.m_Settings.bIsValveEmail = true;
|
|
||||||
|
window.settingsStore.m_Settings.bIsValveEmail = true;
|
||||||
logger.log('Enabled Valve Internal menu');
|
logger.log('Enabled Valve Internal menu');
|
||||||
} else {
|
} else {
|
||||||
removeSettingsObserver();
|
removeSettingsObserver();
|
||||||
settingsMod.m_Settings.bIsValveEmail = false;
|
window.settingsStore.m_Settings.bIsValveEmail = false;
|
||||||
logger.log('Disabled Valve Internal menu');
|
logger.log('Disabled Valve Internal menu');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// TabsHook for versions before the Desktop merge
|
// TabsHook for versions before the Desktop merge
|
||||||
import { Patch, afterPatch, sleep } from 'decky-frontend-lib';
|
import { Patch, afterPatch, getReactRoot, sleep } from 'decky-frontend-lib';
|
||||||
import { memo } from 'react';
|
import { memo } from 'react';
|
||||||
|
|
||||||
import NewTabsHook from './tabs-hook';
|
import NewTabsHook from './tabs-hook';
|
||||||
@@ -35,7 +35,7 @@ class TabsHook extends NewTabsHook {
|
|||||||
|
|
||||||
init() {
|
init() {
|
||||||
const self = this;
|
const self = this;
|
||||||
const tree = (document.getElementById('root') as any)._reactRootContainer._internalRoot.current;
|
const tree = getReactRoot(document.getElementById('root') as any);
|
||||||
let scrollRoot: any;
|
let scrollRoot: any;
|
||||||
async function findScrollRoot(currentNode: any, iters: number): Promise<any> {
|
async function findScrollRoot(currentNode: any, iters: number): Promise<any> {
|
||||||
if (iters >= 30) {
|
if (iters >= 30) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// TabsHook for versions after the Desktop merge
|
// TabsHook for versions after the Desktop merge
|
||||||
import { Patch, QuickAccessTab, afterPatch, findInReactTree, sleep } from 'decky-frontend-lib';
|
import { Patch, QuickAccessTab, afterPatch, findInReactTree, getReactRoot, sleep } from 'decky-frontend-lib';
|
||||||
|
|
||||||
import { QuickAccessVisibleStateProvider } from './components/QuickAccessVisibleState';
|
import { QuickAccessVisibleStateProvider } from './components/QuickAccessVisibleState';
|
||||||
import Logger from './logger';
|
import Logger from './logger';
|
||||||
@@ -32,11 +32,11 @@ class TabsHook extends Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
const tree = (document.getElementById('root') as any)._reactRootContainer._internalRoot.current;
|
const tree = getReactRoot(document.getElementById('root') as any);
|
||||||
let qAMRoot: any;
|
let qAMRoot: any;
|
||||||
const findQAMRoot = (currentNode: any, iters: number): any => {
|
const findQAMRoot = (currentNode: any, iters: number): any => {
|
||||||
if (iters >= 65) {
|
if (iters >= 80) {
|
||||||
// currently 45
|
// currently 67
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
import { Module, Patch, ToastData, afterPatch, findInReactTree, findModuleChild, sleep } from 'decky-frontend-lib';
|
import {
|
||||||
|
Module,
|
||||||
|
Patch,
|
||||||
|
ToastData,
|
||||||
|
afterPatch,
|
||||||
|
findInReactTree,
|
||||||
|
findModuleChild,
|
||||||
|
getReactRoot,
|
||||||
|
sleep,
|
||||||
|
} from 'decky-frontend-lib';
|
||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
import Toast from './components/Toast';
|
import Toast from './components/Toast';
|
||||||
@@ -38,10 +47,10 @@ class Toaster extends Logger {
|
|||||||
// </DeckyToasterStateContextProvider>
|
// </DeckyToasterStateContextProvider>
|
||||||
// ));
|
// ));
|
||||||
let instance: any;
|
let instance: any;
|
||||||
const tree = (document.getElementById('root') as any)._reactRootContainer._internalRoot.current;
|
const tree = getReactRoot(document.getElementById('root') as any);
|
||||||
const findToasterRoot = (currentNode: any, iters: number): any => {
|
const findToasterRoot = (currentNode: any, iters: number): any => {
|
||||||
if (iters >= 65) {
|
if (iters >= 80) {
|
||||||
// currently 65
|
// currently 66
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
|||||||
Reference in New Issue
Block a user