diff --git a/dzgui/api/shortcuts.py b/dzgui/api/shortcuts.py index 03a691b..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) @@ -46,6 +47,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 str(self.shortcuts["shortcuts"][key]["appname"]) + return unknown + 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..7ab03fd 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, @@ -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, "") 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" 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