From 17520183316c1556c1bb457a95247ea9daffb1ce Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 14 Oct 2026 22:53:02 +0900 Subject: [PATCH] fix: handle HTTPErrors from workshop (#477) --- dzgui/api/steam.py | 23 +++++++++++++++++++++++ dzgui/managers/connection.py | 17 ++++++++++++++--- dzgui/managers/mods.py | 6 +++++- dzgui/strings/errors.py | 1 + 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/dzgui/api/steam.py b/dzgui/api/steam.py index 1cac60f..2d0ee1e 100644 --- a/dzgui/api/steam.py +++ b/dzgui/api/steam.py @@ -6,6 +6,7 @@ import subprocess import vdf # type: ignore from pathlib import Path +from requests.exceptions import HTTPError from typing import Any, Union from warnings import deprecated @@ -32,6 +33,7 @@ from dzgui.const.endpoints import ( UNSUB_ENDPOINT, ) from dzgui.strings import wizard +from dzgui.strings.errors import api_validation_error, workshop_endpoint_error from dzgui.util.bash import concat_bash_args logger = logging.getLogger(APP_NAME) @@ -262,6 +264,16 @@ def find_user_id_32(path: Path) -> int: return int(uid) & 0xFFFFFFFF +class SteamAPIKeyError(Exception): + def __init__(self, msg=None): + super().__init__(msg or api_validation_error) + + +class SteamWorkshopEndpointError(Exception): + def __init__(self, msg=None): + super().__init__(msg or workshop_endpoint_error) + + def update_workshop(key: str, mod: int, endpoint: str) -> None: payload: dict[str, Union[int, str]] = { "publishedfileid": mod, @@ -273,8 +285,19 @@ def update_workshop(key: str, mod: int, endpoint: str) -> None: try: res = requests.post(endpoint, params=payload, timeout=REQUEST_TIMEOUT) res.raise_for_status() + except HTTPError as e: + logger.critical(e) + match res.status_code: + case 403: + raise SteamAPIKeyError() + case 404: + raise SteamWorkshopEndpointError() + case _: + # TODO: apply redaction filter + raise e except Exception as e: logger.critical(e) + raise e def subscribe(key: str, mod: int) -> None: diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index 2fbd91a..7e102a8 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -48,7 +48,7 @@ from dzgui.strings.dialogs import ( ) from dzgui.strings import kb from dzgui.strings.server_mods import checkmark, resync -from dzgui.util.format import format_mib +from dzgui.util.format import format_exception, format_mib from dzgui.util.strings import dialog, server_timeout from dzgui.util.symlink import rebuild_symlinks from dzgui.views.dialogs.generic import ExceptionDialog @@ -300,6 +300,11 @@ class ConnectionManager: dialog = ServerDetailsDialog(self.controller, details) dialog.run() + def _workshop_timeout(self, msg: str) -> None: + dialog = ExceptionDialog(self.controller, msg) + dialog.show_all() + dialog.run() + def _server_timeout(self) -> None: dialog = ExceptionDialog(self.controller, server_timeout) dialog.set_details_buffer(kb.DZG_006) @@ -351,8 +356,14 @@ class ConnectionManager: for title, mod, stamp, size in self.missing_mods: if self.controller.is_cancel_pending(): return - subscribe(key, int(mod)) - time.sleep(API_RATE_LIMIT) + try: + subscribe(key, int(mod)) + time.sleep(API_RATE_LIMIT) + except Exception as e: + msg = format_exception(e) + func = StoredFunc(self._workshop_timeout, msg) + self.thread_man.set_cleanup_func(func, destroy_first=True) + return self.thread_man.update_dialog(waiting_for_directories) for title, mod, stamp, size in self.missing_mods: diff --git a/dzgui/managers/mods.py b/dzgui/managers/mods.py index c04d231..f55781a 100644 --- a/dzgui/managers/mods.py +++ b/dzgui/managers/mods.py @@ -122,7 +122,11 @@ class ModManager: def unsub_atomic_mod(self, mod: str) -> None: config_man = self.controller.get_config_man() key = config_man.lookup(Preferences.STEAM) - unsubscribe(key, int(mod)) + try: + unsubscribe(key, int(mod)) + except Exception as e: + logger.critical(e) + return steam_path = Path(self.path) app_path = PeFile.get_nested_app_path(steam_path, APPID_DAYZ) diff --git a/dzgui/strings/errors.py b/dzgui/strings/errors.py index 005a93b..f5511cf 100644 --- a/dzgui/strings/errors.py +++ b/dzgui/strings/errors.py @@ -4,3 +4,4 @@ api_validation_error = ( api_popover = "API key validation failed." dayz_not_found = "Could not find a valid DayZ installation." +workshop_endpoint_error = "Steam Workshop service unavailable, try again later."