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 1/5] 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, "") From 8c2cea0fdcdf7333291813935a06967564955951 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:07:47 +0900 Subject: [PATCH 2/5] chore: bump version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ebaca2d..f9a8350 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ description = "DayZ server browser and mod manager for Linux" authors = [ {name = "aclist"} ] -version = "7.0.0b16" +version = "7.0.0b17" license = "GPL-3.0-or-later" license-files = ["LICENSE"] readme = "README.md" From 1913f69e7b489e43e70c2a656b758b0fcd5eb913 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:07:56 +0900 Subject: [PATCH 3/5] chore: drop unused import --- dzgui/managers/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index a1e48a5..7ab03fd 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -47,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, unknown +from dzgui.util.strings import dialog, server_timeout from dzgui.util.symlink import rebuild_symlinks from dzgui.views.dialogs.generic import ExceptionDialog from dzgui.views.dialogs.servers import ServerDetailsDialog, ServerModDialog From 11cdcb62b228d15b538f11b063a1d4252b72d3cc Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:08:11 +0900 Subject: [PATCH 4/5] chore: drop unused import --- tests/test_pefile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_pefile.py b/tests/test_pefile.py index 987888e..ebcfb0e 100644 --- a/tests/test_pefile.py +++ b/tests/test_pefile.py @@ -12,7 +12,7 @@ from dzgui.api.steam import ( from dzgui.config.query import get_config from dzgui.config.xdg import get_xdg_paths, parse_filepaths -from dzgui.const.constants import APPID_DAYZ, LIBRARYFOLDERS_PATH +from dzgui.const.constants import APPID_DAYZ from tests.fixtures import fixture_path From cdb311cb1fe37e2941a0081d1bccb12a3a111ae2 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:14:11 +0900 Subject: [PATCH 5/5] chore: clear typehinting errors --- dzgui/api/shortcuts.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dzgui/api/shortcuts.py b/dzgui/api/shortcuts.py index 21ea133..243946f 100644 --- a/dzgui/api/shortcuts.py +++ b/dzgui/api/shortcuts.py @@ -12,6 +12,7 @@ from typing import Any from dzgui.api.steam import find_user_id_32 from dzgui.const.constants import APP_NAME, APP_NAME_LOWER, IMAGES_PATH from dzgui.util.dirs import copy_dzgui_to_xdg_data +from dzgui.util.strings import unknown logger = logging.getLogger(APP_NAME) @@ -50,8 +51,8 @@ class Shortcuts: # 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 + return str(self.shortcuts["shortcuts"][key]["appname"]) + return unknown def get_shortcuts(self) -> Any: return self.shortcuts