From 8c29b9b35a45539e489f61cc3f20971c5dc08d41 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:06:40 +0900 Subject: [PATCH] fix: parse out-of-band appids as NSGs --- dzgui/api/shortcuts.py | 7 +++++++ dzgui/api/steam.py | 19 ++++++++++++------- dzgui/managers/connection.py | 9 ++++++++- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/dzgui/api/shortcuts.py b/dzgui/api/shortcuts.py index 03a691b..21ea133 100644 --- a/dzgui/api/shortcuts.py +++ b/dzgui/api/shortcuts.py @@ -46,6 +46,13 @@ class Shortcuts: wrapped_exe = f'"{exe}"' return appname + wrapped_exe + def find_appname_by_unsigned_id(self, appid: int) -> str: + # NOTE: bitmask signed int back to 32-bit CRC + for key in self.shortcuts["shortcuts"].keys(): + if self.shortcuts["shortcuts"][key]["appid"] & 0xFFFFFFFF == appid: + return self.shortcuts["shortcuts"][key]["appname"] + return None + def get_shortcuts(self) -> Any: return self.shortcuts diff --git a/dzgui/api/steam.py b/dzgui/api/steam.py index 99de2e6..9a1c67f 100644 --- a/dzgui/api/steam.py +++ b/dzgui/api/steam.py @@ -32,23 +32,25 @@ from dzgui.const.endpoints import ( ) from dzgui.strings import wizard from dzgui.util.bash import concat_bash_args -from dzgui.util.strings import unknown logger = logging.getLogger(APP_NAME) class AppNotInstalledError(Exception): """App not present in user's libraryfolders""" + pass class AppMovedError(Exception): """VDF points to a nonexistent location on disk""" + pass class VDFLoadError(Exception): """Malformed VDF or JSON conversion""" + pass @@ -322,9 +324,12 @@ def get_running_app() -> int | None: def get_app_allows_downloads(path: Path, appid: int) -> bool: - root_path = get_app_path(path, appid) - acf = root_path.joinpath(f"steamapps/appmanifest_{appid}.acf") - flag = ACF(acf).get_allows_downloads() + try: + root_path = get_app_path(path, appid) + acf = root_path.joinpath(f"steamapps/appmanifest_{appid}.acf") + flag = ACF(acf).get_allows_downloads() + except AppNotInstalledError: + flag = 0 match flag: # NOTE: adheres to global client setting case 0: @@ -403,13 +408,13 @@ def get_app_path(folders_path: Path, appid: int) -> Path: return Path(app_path) -def get_app_name(appid: int) -> str: +def get_app_name(appid: int) -> str | None: payload = {"appids": [appid]} res = requests.get(APP_DETAILS, params=payload) if res.status_code != 200: - return unknown + return None try: return str(res.json()[str(appid)]["data"]["name"]) except Exception as e: logger.debug(e) - return unknown + return None diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index 896969f..a1e48a5 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING import dzgui.api.pefile as PeFile import dzgui.api.servers as Servers +from dzgui.api.shortcuts import Shortcuts from dzgui.api.steam import ( connect, @@ -46,7 +47,7 @@ from dzgui.strings.dialogs import ( ) from dzgui.strings.server_mods import checkmark, resync from dzgui.util.format import format_mib -from dzgui.util.strings import dialog, server_timeout +from dzgui.util.strings import dialog, server_timeout, unknown from dzgui.util.symlink import rebuild_symlinks from dzgui.views.dialogs.generic import ExceptionDialog from dzgui.views.dialogs.servers import ServerDetailsDialog, ServerModDialog @@ -175,6 +176,12 @@ class ConnectionManager: if running_app is not None: allows_dl = get_app_allows_downloads(steam_path, running_app) running_app_name = get_app_name(running_app) + # NOTE: for out-of-range appid, assume NSG. + # dzgui.api.steam.get_app_name() will return None + if running_app_name is None: + s = Shortcuts(steam_path) + # NOTE: returns "Unknown" if unparseable + running_app_name = s.find_appname_by_unsigned_id(running_app) allows_downloads = (allows_dl, running_app_name) else: allows_downloads = (True, "")