mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 06:01:58 +00:00
move to module imports
This commit is contained in:
@@ -43,10 +43,10 @@ jobs:
|
|||||||
run: pnpm run build
|
run: pnpm run build
|
||||||
|
|
||||||
- name: Build Python Backend 🛠️
|
- name: Build Python Backend 🛠️
|
||||||
run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data "./backend/static;/static" --add-data "./backend/locales;/locales" --add-data "./backend/legacy;/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./backend/main.py
|
run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data "./backend/static;/backend/static" --add-data "./backend/locales;/backend/locales" --add-data "./backend/legacy;/backend/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./main.py
|
||||||
|
|
||||||
- name: Build Python Backend (noconsole) 🛠️
|
- name: Build Python Backend (noconsole) 🛠️
|
||||||
run: pyinstaller --noconfirm --noconsole --onefile --name "PluginLoader_noconsole" --add-data "./backend/static;/static" --add-data "./backend/locales;/locales" --add-data "./backend/legacy;/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./backend/main.py
|
run: pyinstaller --noconfirm --noconsole --onefile --name "PluginLoader_noconsole" --add-data "./backend/static;/backend/static" --add-data "./backend/locales;/backend/locales" --add-data "./backend/legacy;/backend/legacy" --add-data "./plugin;/plugin" --hidden-import=sqlite3 ./main.py
|
||||||
|
|
||||||
- name: Upload package artifact ⬆️
|
- name: Upload package artifact ⬆️
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ jobs:
|
|||||||
run: pnpm run build
|
run: pnpm run build
|
||||||
|
|
||||||
- name: Build Python Backend 🛠️
|
- name: Build Python Backend 🛠️
|
||||||
run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data ./backend/static:/static --add-data ./backend/locales:/locales --add-data ./backend/legacy:/legacy --add-data ./plugin:/plugin --hidden-import=sqlite3 ./backend/*.py
|
run: pyinstaller --noconfirm --onefile --name "PluginLoader" --add-data ./backend/static:/backend/static --add-data ./backend/locales:/backend/locales --add-data ./backend/legacy:/backend/legacy --add-data ./plugin:/plugin --hidden-import=sqlite3 ./main.py
|
||||||
|
|
||||||
- name: Upload package artifact ⬆️
|
- name: Upload package artifact ⬆️
|
||||||
if: ${{ !env.ACT }}
|
if: ${{ !env.ACT }}
|
||||||
|
|||||||
+1
-1
@@ -13,11 +13,11 @@ from os import R_OK, W_OK, path, listdir, access, mkdir
|
|||||||
from shutil import rmtree
|
from shutil import rmtree
|
||||||
from time import time
|
from time import time
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
from localplatform import chown, chmod
|
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
from typing import Dict, List, TypedDict
|
from typing import Dict, List, TypedDict
|
||||||
|
|
||||||
# Local modules
|
# Local modules
|
||||||
|
from .localplatform import chown, chmod
|
||||||
from .loader import Loader, Plugins
|
from .loader import Loader, Plugins
|
||||||
from .helpers import get_ssl_context, download_remote_binary_to_path
|
from .helpers import get_ssl_context, download_remote_binary_to_path
|
||||||
from .settings import SettingsManager
|
from .settings import SettingsManager
|
||||||
|
|||||||
+2
-2
@@ -10,8 +10,8 @@ import certifi
|
|||||||
from aiohttp.web import Request, Response, middleware
|
from aiohttp.web import Request, Response, middleware
|
||||||
from aiohttp.typedefs import Handler
|
from aiohttp.typedefs import Handler
|
||||||
from aiohttp import ClientSession
|
from aiohttp import ClientSession
|
||||||
import localplatform
|
from . import localplatform
|
||||||
from customtypes import UserType
|
from .customtypes import UserType
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
|
||||||
REMOTE_DEBUGGER_UNIT = "steam-web-debug-portforward.service"
|
REMOTE_DEBUGGER_UNIT = "steam-web-debug-portforward.service"
|
||||||
|
|||||||
+4
-2
@@ -11,7 +11,9 @@ from os.path import exists
|
|||||||
from watchdog.events import RegexMatchingEventHandler, DirCreatedEvent, DirModifiedEvent, FileCreatedEvent, FileModifiedEvent # type: ignore
|
from watchdog.events import RegexMatchingEventHandler, DirCreatedEvent, DirModifiedEvent, FileCreatedEvent, FileModifiedEvent # type: ignore
|
||||||
from watchdog.observers import Observer # type: ignore
|
from watchdog.observers import Observer # type: ignore
|
||||||
|
|
||||||
from backend.main import PluginManager # type: ignore
|
from typing import TYPE_CHECKING
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from .main import PluginManager
|
||||||
|
|
||||||
from .injector import get_tab, get_gamepadui_tab
|
from .injector import get_tab, get_gamepadui_tab
|
||||||
from .plugin import PluginWrapper
|
from .plugin import PluginWrapper
|
||||||
@@ -63,7 +65,7 @@ class FileChangeHandler(RegexMatchingEventHandler):
|
|||||||
self.maybe_reload(src_path)
|
self.maybe_reload(src_path)
|
||||||
|
|
||||||
class Loader:
|
class Loader:
|
||||||
def __init__(self, server_instance: PluginManager, plugin_path: str, loop: AbstractEventLoop, live_reload: bool =False) -> None:
|
def __init__(self, server_instance: 'PluginManager', plugin_path: str, loop: AbstractEventLoop, live_reload: bool = False) -> None:
|
||||||
self.loop = loop
|
self.loop = loop
|
||||||
self.logger = getLogger("Loader")
|
self.logger = getLogger("Loader")
|
||||||
self.plugin_path = plugin_path
|
self.plugin_path = plugin_path
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ ON_WINDOWS = platform.system() == "Windows"
|
|||||||
ON_LINUX = not ON_WINDOWS
|
ON_LINUX = not ON_WINDOWS
|
||||||
|
|
||||||
if ON_WINDOWS:
|
if ON_WINDOWS:
|
||||||
from localplatformwin import *
|
from .localplatformwin import *
|
||||||
import localplatformwin as localplatform
|
from . import localplatformwin as localplatform
|
||||||
else:
|
else:
|
||||||
from localplatformlinux import *
|
from .localplatformlinux import *
|
||||||
import localplatformlinux as localplatform
|
from . import localplatformlinux as localplatform
|
||||||
|
|
||||||
def get_privileged_path() -> str:
|
def get_privileged_path() -> str:
|
||||||
'''Get path accessible by elevated user. Holds plugins, decky loader and decky loader configs'''
|
'''Get path accessible by elevated user. Holds plugins, decky loader and decky loader configs'''
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import os, pwd, grp, sys, logging
|
import os, pwd, grp, sys, logging
|
||||||
from subprocess import call, run, DEVNULL, PIPE, STDOUT
|
from subprocess import call, run, DEVNULL, PIPE, STDOUT
|
||||||
from customtypes import UserType
|
from .customtypes import UserType
|
||||||
|
|
||||||
logger = logging.getLogger("localplatform")
|
logger = logging.getLogger("localplatform")
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from customtypes import UserType
|
from .customtypes import UserType
|
||||||
import os, sys
|
import os, sys
|
||||||
|
|
||||||
def chown(path : str, user : UserType = UserType.HOST_USER, recursive : bool = True) -> bool:
|
def chown(path : str, user : UserType = UserType.HOST_USER, recursive : bool = True) -> bool:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import asyncio, time
|
|||||||
from typing import Awaitable, Callable
|
from typing import Awaitable, Callable
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from localplatform import ON_WINDOWS
|
from .localplatform import ON_WINDOWS
|
||||||
|
|
||||||
BUFFER_LIMIT = 2 ** 20 # 1 MiB
|
BUFFER_LIMIT = 2 ** 20 # 1 MiB
|
||||||
|
|
||||||
|
|||||||
+10
-10
@@ -1,7 +1,7 @@
|
|||||||
# Change PyInstaller files permissions
|
# Change PyInstaller files permissions
|
||||||
import sys
|
import sys
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from localplatform import (chmod, chown, service_stop, service_start,
|
from .localplatform import (chmod, chown, service_stop, service_start,
|
||||||
ON_WINDOWS, get_log_level, get_live_reload,
|
ON_WINDOWS, get_log_level, get_live_reload,
|
||||||
get_server_port, get_server_host, get_chown_plugin_path,
|
get_server_port, get_server_host, get_chown_plugin_path,
|
||||||
get_privileged_path)
|
get_privileged_path)
|
||||||
@@ -21,16 +21,16 @@ from aiohttp.web import Application, Response, Request, get, run_app, static # t
|
|||||||
from aiohttp_jinja2 import setup as jinja_setup
|
from aiohttp_jinja2 import setup as jinja_setup
|
||||||
|
|
||||||
# local modules
|
# local modules
|
||||||
from browser import PluginBrowser
|
from .browser import PluginBrowser
|
||||||
from helpers import (REMOTE_DEBUGGER_UNIT, csrf_middleware, get_csrf_token,
|
from .helpers import (REMOTE_DEBUGGER_UNIT, csrf_middleware, get_csrf_token,
|
||||||
mkdir_as_user, get_system_pythonpaths, get_effective_user_id)
|
mkdir_as_user, get_system_pythonpaths, get_effective_user_id)
|
||||||
|
|
||||||
from injector import get_gamepadui_tab, Tab, close_old_tabs
|
from .injector import get_gamepadui_tab, Tab, close_old_tabs
|
||||||
from loader import Loader
|
from .loader import Loader
|
||||||
from settings import SettingsManager
|
from .settings import SettingsManager
|
||||||
from updater import Updater
|
from .updater import Updater
|
||||||
from utilities import Utilities
|
from .utilities import Utilities
|
||||||
from customtypes import UserType
|
from .customtypes import UserType
|
||||||
|
|
||||||
|
|
||||||
basicConfig(
|
basicConfig(
|
||||||
@@ -169,7 +169,7 @@ class PluginManager:
|
|||||||
def run(self):
|
def run(self):
|
||||||
return run_app(self.web_app, host=get_server_host(), port=get_server_port(), loop=self.loop, access_log=None)
|
return run_app(self.web_app, host=get_server_host(), port=get_server_port(), loop=self.loop, access_log=None)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
def main():
|
||||||
if ON_WINDOWS:
|
if ON_WINDOWS:
|
||||||
# Fix windows/flask not recognising that .js means 'application/javascript'
|
# Fix windows/flask not recognising that .js means 'application/javascript'
|
||||||
import mimetypes
|
import mimetypes
|
||||||
|
|||||||
+4
-4
@@ -9,10 +9,10 @@ from os import path, environ
|
|||||||
from signal import SIGINT, signal
|
from signal import SIGINT, signal
|
||||||
from sys import exit, path as syspath
|
from sys import exit, path as syspath
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
from localsocket import LocalSocket
|
from .localsocket import LocalSocket
|
||||||
from localplatform import setgid, setuid, get_username, get_home_path
|
from .localplatform import setgid, setuid, get_username, get_home_path
|
||||||
from customtypes import UserType
|
from .customtypes import UserType
|
||||||
import helpers
|
from . import helpers
|
||||||
|
|
||||||
class PluginWrapper:
|
class PluginWrapper:
|
||||||
def __init__(self, file: str, plugin_directory: str, plugin_path: str) -> None:
|
def __init__(self, file: str, plugin_directory: str, plugin_path: str) -> None:
|
||||||
|
|||||||
+3
-3
@@ -1,10 +1,10 @@
|
|||||||
from json import dump, load
|
from json import dump, load
|
||||||
from os import mkdir, path, listdir, rename
|
from os import mkdir, path, listdir, rename
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
from localplatform import chown, folder_owner, get_chown_plugin_path
|
from .localplatform import chown, folder_owner, get_chown_plugin_path
|
||||||
from customtypes import UserType
|
from .customtypes import UserType
|
||||||
|
|
||||||
from helpers import get_homebrew_path
|
from .helpers import get_homebrew_path
|
||||||
|
|
||||||
|
|
||||||
class SettingsManager:
|
class SettingsManager:
|
||||||
|
|||||||
+14
-8
@@ -4,15 +4,16 @@ from asyncio import sleep
|
|||||||
from json.decoder import JSONDecodeError
|
from json.decoder import JSONDecodeError
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from os import getcwd, path, remove
|
from os import getcwd, path, remove
|
||||||
from typing import List, TypedDict
|
from typing import TYPE_CHECKING, List, TypedDict
|
||||||
from backend.main import PluginManager
|
if TYPE_CHECKING:
|
||||||
from localplatform import chmod, service_restart, ON_LINUX, get_keep_systemd_service, get_selinux
|
from .main import PluginManager
|
||||||
|
from .localplatform import chmod, service_restart, ON_LINUX, get_keep_systemd_service, get_selinux
|
||||||
|
|
||||||
from aiohttp import ClientSession, web
|
from aiohttp import ClientSession, web
|
||||||
|
|
||||||
import helpers
|
from .import helpers
|
||||||
from injector import get_gamepadui_tab
|
from .injector import get_gamepadui_tab
|
||||||
from settings import SettingsManager
|
from .settings import SettingsManager
|
||||||
|
|
||||||
logger = getLogger("Updater")
|
logger = getLogger("Updater")
|
||||||
|
|
||||||
@@ -25,7 +26,7 @@ class RemoteVer(TypedDict):
|
|||||||
assets: List[RemoteVerAsset]
|
assets: List[RemoteVerAsset]
|
||||||
|
|
||||||
class Updater:
|
class Updater:
|
||||||
def __init__(self, context: PluginManager) -> None:
|
def __init__(self, context: 'PluginManager') -> None:
|
||||||
self.context = context
|
self.context = context
|
||||||
self.settings = self.context.settings
|
self.settings = self.context.settings
|
||||||
# Exposes updater methods to frontend
|
# Exposes updater methods to frontend
|
||||||
@@ -150,7 +151,12 @@ class Updater:
|
|||||||
|
|
||||||
async def do_update(self):
|
async def do_update(self):
|
||||||
logger.debug("Starting update.")
|
logger.debug("Starting update.")
|
||||||
assert self.remoteVer
|
try:
|
||||||
|
assert self.remoteVer
|
||||||
|
except AssertionError:
|
||||||
|
logger.error("Unable to update as remoteVer is missing")
|
||||||
|
return
|
||||||
|
|
||||||
version = self.remoteVer["tag_name"]
|
version = self.remoteVer["tag_name"]
|
||||||
download_url = None
|
download_url = None
|
||||||
download_filename = "PluginLoader" if ON_LINUX else "PluginLoader.exe"
|
download_filename = "PluginLoader" if ON_LINUX else "PluginLoader.exe"
|
||||||
|
|||||||
+11
-9
@@ -8,16 +8,18 @@ from stat import FILE_ATTRIBUTE_HIDDEN # type: ignore
|
|||||||
|
|
||||||
from asyncio import StreamReader, StreamWriter, start_server, gather, open_connection
|
from asyncio import StreamReader, StreamWriter, start_server, gather, open_connection
|
||||||
from aiohttp import ClientSession, web
|
from aiohttp import ClientSession, web
|
||||||
from typing import Callable, Coroutine, Dict, Any, List, TypedDict
|
from typing import TYPE_CHECKING, Callable, Coroutine, Dict, Any, List, TypedDict
|
||||||
|
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from backend.browser import PluginInstallRequest, PluginInstallType
|
|
||||||
from backend.main import PluginManager
|
|
||||||
from injector import inject_to_tab, get_gamepadui_tab, close_old_tabs, get_tab
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from localplatform import ON_WINDOWS
|
|
||||||
import helpers
|
from .browser import PluginInstallRequest, PluginInstallType
|
||||||
from localplatform import service_stop, service_start, get_home_path, get_username
|
if TYPE_CHECKING:
|
||||||
|
from .main import PluginManager
|
||||||
|
from .injector import inject_to_tab, get_gamepadui_tab, close_old_tabs, get_tab
|
||||||
|
from .localplatform import ON_WINDOWS
|
||||||
|
from .import helpers
|
||||||
|
from .localplatform import service_stop, service_start, get_home_path, get_username
|
||||||
|
|
||||||
class FilePickerObj(TypedDict):
|
class FilePickerObj(TypedDict):
|
||||||
file: Path
|
file: Path
|
||||||
@@ -25,7 +27,7 @@ class FilePickerObj(TypedDict):
|
|||||||
is_dir: bool
|
is_dir: bool
|
||||||
|
|
||||||
class Utilities:
|
class Utilities:
|
||||||
def __init__(self, context: PluginManager) -> None:
|
def __init__(self, context: 'PluginManager') -> None:
|
||||||
self.context = context
|
self.context = context
|
||||||
self.util_methods: Dict[str, Callable[..., Coroutine[Any, Any, Any]]] = {
|
self.util_methods: Dict[str, Callable[..., Coroutine[Any, Any, Any]]] = {
|
||||||
"ping": self.ping,
|
"ping": self.ping,
|
||||||
@@ -307,7 +309,7 @@ class Utilities:
|
|||||||
self.rdt_proxy_task = self.context.loop.create_task(self.rdt_proxy_server)
|
self.rdt_proxy_task = self.context.loop.create_task(self.rdt_proxy_server)
|
||||||
|
|
||||||
def stop_rdt_proxy(self):
|
def stop_rdt_proxy(self):
|
||||||
if self.rdt_proxy_server:
|
if self.rdt_proxy_server != None:
|
||||||
self.rdt_proxy_server.close()
|
self.rdt_proxy_server.close()
|
||||||
if self.rdt_proxy_task:
|
if self.rdt_proxy_task:
|
||||||
self.rdt_proxy_task.cancel()
|
self.rdt_proxy_task.cancel()
|
||||||
|
|||||||
Reference in New Issue
Block a user