From 8df5bcbd7e453eea32b6367ddb452e8d1ad56afd Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 17 Sep 2024 20:52:43 +0300 Subject: [PATCH 1/4] RareSettings: disable `confirm_start` setting because it is not implemented --- rare/components/tabs/settings/rare.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index 09825e5f3..13a096731 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -92,6 +92,8 @@ def __init__(self, parent=None): self.ui.confirm_start.stateChanged.connect( lambda: self.settings.setValue(options.confirm_start.key, self.ui.confirm_start.isChecked()) ) + # TODO: implement use when starting game, disable for now + self.ui.confirm_start.setDisabled(True) self.ui.auto_sync_cloud.setChecked(self.settings.value(*options.auto_sync_cloud)) self.ui.auto_sync_cloud.stateChanged.connect( From c7cf2cc2eb6236a0b3c42120a27ccc5479bf6440 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 17 Sep 2024 20:53:25 +0300 Subject: [PATCH 2/4] RareGame: respect offline and skip update check settings on launch --- rare/models/game.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rare/models/game.py b/rare/models/game.py index 9ab6e5d93..6c4e28ba7 100644 --- a/rare/models/game.py +++ b/rare/models/game.py @@ -20,7 +20,7 @@ from rare.shared.image_manager import ImageManager from rare.utils.paths import data_dir, get_rare_executable from rare.utils.steam_grades import get_rating -from rare.utils.config_helper import set_envvar +from rare.utils.config_helper import set_envvar, get_option logger = getLogger("RareGame") @@ -567,9 +567,9 @@ def launch( cmd_line = get_rare_executable() executable, args = cmd_line[0], cmd_line[1:] args.extend(["launch", self.app_name]) - if offline: + if offline or get_option(self.app_name, "offline", fallback=None): args.append("--offline") - if skip_update_check: + if skip_update_check or get_option(self.app_name, "skip_update_check", fallback=None): args.append("--skip-update-check") if wine_bin: args.extend(["--wine-bin", wine_bin]) From 490d6f3ff59cc5c84e3d0d5315935b19266f17eb Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Tue, 17 Sep 2024 21:00:11 +0300 Subject: [PATCH 3/4] Steam: locate and use anticheat runtimes from Steam --- rare/utils/compat/steam.py | 70 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/rare/utils/compat/steam.py b/rare/utils/compat/steam.py index f8efa522f..0bcc59b00 100644 --- a/rare/utils/compat/steam.py +++ b/rare/utils/compat/steam.py @@ -102,9 +102,32 @@ def appid(self) -> str: return self.appmanifest["AppState"]["appid"] +@dataclass +class SteamAntiCheat: + steam_path: str + tool_path: str + steam_library: str + appmanifest: Dict + + def __eq__(self, other): + return self.tool_path == other.tool_path + + def __hash__(self): + return hash(self.tool_path) + + @property + def name(self) -> str: + return self.appmanifest["AppState"]["name"] + + @property + def appid(self) -> str: + return self.appmanifest["AppState"]["appid"] + + @dataclass class ProtonTool(SteamRuntime): runtime: SteamRuntime = None + anticheat: Dict[str, SteamAntiCheat] = None def __bool__(self) -> bool: if appid := self.required_tool: @@ -121,6 +144,7 @@ def command(self, verb: SteamVerb = SteamVerb.DEFAULT) -> List[str]: class CompatibilityTool(SteamBase): compatibilitytool: Dict runtime: SteamRuntime = None + anticheat: Dict[str, SteamAntiCheat] = None def __bool__(self) -> bool: if appid := self.required_tool: @@ -147,6 +171,33 @@ def find_appmanifests(library: str) -> List[dict]: return appmanifests +ANTICHEAT_RUNTIMES = { + "eac_runtime": "1826330", + "battleye_runtime": "1161040", +} + + +def find_anticheat(steam_path: str, library: str): + runtimes = {} + appmanifests = find_appmanifests(library) + common = os.path.join(library, "common") + for appmanifest in appmanifests: + if appmanifest["AppState"]["appid"] not in ANTICHEAT_RUNTIMES.values(): + continue + folder = appmanifest["AppState"]["installdir"] + runtimes.update( + { + appmanifest["AppState"]["appid"]: SteamAntiCheat( + steam_path=steam_path, + steam_library=library, + appmanifest=appmanifest, + tool_path=os.path.join(common, folder), + ) + } + ) + return runtimes + + def find_runtimes(steam_path: str, library: str) -> Dict[str, SteamRuntime]: runtimes = {} appmanifests = find_appmanifests(library) @@ -257,7 +308,7 @@ def get_runtime( return runtimes.get(required_tool, None) -def get_ulwgl_environment( +def get_umu_environment( tool: Optional[ProtonTool] = None, compat_path: Optional[str] = None ) -> Dict: # If the tool is unset, return all affected env variable names @@ -287,6 +338,8 @@ def get_steam_environment( environ["STEAM_COMPAT_LIBRARY_PATHS"] = "" environ["STEAM_COMPAT_MOUNTS"] = "" environ["STEAM_COMPAT_TOOL_PATHS"] = "" + environ["PROTON_EAC_RUNTIME"] = "" + environ["PROTON_BATTLEYE_RUNTIME"] = "" return environ environ["STEAM_COMPAT_CLIENT_INSTALL_PATH"] = tool.steam_path @@ -299,6 +352,11 @@ def get_steam_environment( if tool.runtime is not None: tool_paths.append(tool.runtime.tool_path) environ["STEAM_COMPAT_TOOL_PATHS"] = ":".join(tool_paths) + if tool.anticheat is not None: + if (appid := ANTICHEAT_RUNTIMES["eac_runtime"]) in tool.anticheat.keys(): + environ["PROTON_EAC_RUNTIME"] = tool.anticheat[appid].tool_path + if (appid := ANTICHEAT_RUNTIMES["battleye_runtime"]) in tool.anticheat.keys(): + environ["PROTON_BATTLEYE_RUNTIME"] = tool.anticheat[appid].tool_path return environ @@ -317,6 +375,10 @@ def _find_tools() -> List[Union[ProtonTool, CompatibilityTool]]: for library in steam_libraries: runtimes.update(find_runtimes(steam_path, library)) + anticheat = {} + for library in steam_libraries: + anticheat.update(find_anticheat(steam_path, library)) + tools = [] for library in steam_libraries: tools.extend(find_protons(steam_path, library)) @@ -325,6 +387,8 @@ def _find_tools() -> List[Union[ProtonTool, CompatibilityTool]]: for tool in tools: runtime = get_runtime(tool, runtimes) tool.runtime = runtime + if tool.layer == "proton": + tool.anticheat = anticheat tools = list(filter(lambda t: bool(t), tools)) @@ -353,10 +417,12 @@ def find_umu_launcher() -> Optional[CompatibilityTool]: from pprint import pprint tools = find_tools() - pprint(tools) + for tool in tools: + pprint(tool) umu = find_umu_launcher() pprint(umu) + for tool in tools: print(get_steam_environment(tool)) print(tool.name) From 997dc237238f07e7ea48bc5ac65fc647e80a63d4 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:18:20 +0300 Subject: [PATCH 4/4] refactor: rename `games` tab to `library` Also rename the following `library` subfolders * `game_info` -> `details` * `games_widgets` -> `widgets` --- rare/components/tabs/__init__.py | 2 +- rare/components/tabs/{games => library}/__init__.py | 6 ++---- .../tabs/{games/game_info => library/details}/__init__.py | 0 .../{games/game_info => library/details}/cloud_saves.py | 0 .../tabs/{games/game_info => library/details}/details.py | 0 .../tabs/{games/game_info => library/details}/dlcs.py | 0 .../tabs/{games/game_info => library/details}/settings.py | 0 rare/components/tabs/{games => library}/head_bar.py | 0 .../tabs/{games => library}/integrations/__init__.py | 0 .../{games => library}/integrations/egl_sync_group.py | 1 - .../tabs/{games => library}/integrations/eos_group.py | 0 .../tabs/{games => library}/integrations/import_group.py | 0 .../tabs/{games => library}/integrations/ubisoft_group.py | 0 .../{games/game_widgets => library/widgets}/__init__.py | 0 .../game_widgets => library/widgets}/game_widget.py | 0 .../game_widgets => library/widgets}/icon_game_widget.py | 0 .../game_widgets => library/widgets}/icon_widget.py | 2 +- .../game_widgets => library/widgets}/library_widget.py | 0 .../game_widgets => library/widgets}/list_game_widget.py | 0 .../game_widgets => library/widgets}/list_widget.py | 0 rare/resources/static_css/__init__.py | 2 +- rare/resources/static_css/stylesheet.py | 8 ++++---- 22 files changed, 9 insertions(+), 12 deletions(-) rename rare/components/tabs/{games => library}/__init__.py (95%) rename rare/components/tabs/{games/game_info => library/details}/__init__.py (100%) rename rare/components/tabs/{games/game_info => library/details}/cloud_saves.py (100%) rename rare/components/tabs/{games/game_info => library/details}/details.py (100%) rename rare/components/tabs/{games/game_info => library/details}/dlcs.py (100%) rename rare/components/tabs/{games/game_info => library/details}/settings.py (100%) rename rare/components/tabs/{games => library}/head_bar.py (100%) rename rare/components/tabs/{games => library}/integrations/__init__.py (100%) rename rare/components/tabs/{games => library}/integrations/egl_sync_group.py (99%) rename rare/components/tabs/{games => library}/integrations/eos_group.py (100%) rename rare/components/tabs/{games => library}/integrations/import_group.py (100%) rename rare/components/tabs/{games => library}/integrations/ubisoft_group.py (100%) rename rare/components/tabs/{games/game_widgets => library/widgets}/__init__.py (100%) rename rare/components/tabs/{games/game_widgets => library/widgets}/game_widget.py (100%) rename rare/components/tabs/{games/game_widgets => library/widgets}/icon_game_widget.py (100%) rename rare/components/tabs/{games/game_widgets => library/widgets}/icon_widget.py (98%) rename rare/components/tabs/{games/game_widgets => library/widgets}/library_widget.py (100%) rename rare/components/tabs/{games/game_widgets => library/widgets}/list_game_widget.py (100%) rename rare/components/tabs/{games/game_widgets => library/widgets}/list_widget.py (100%) diff --git a/rare/components/tabs/__init__.py b/rare/components/tabs/__init__.py index bdb7573dd..e96c9c26b 100644 --- a/rare/components/tabs/__init__.py +++ b/rare/components/tabs/__init__.py @@ -6,7 +6,7 @@ from rare.utils.misc import qta_icon, ExitCodes from .account import AccountWidget from .downloads import DownloadsTab -from .games import GamesLibrary +from .library import GamesLibrary from .settings import SettingsTab from .store import StoreTab from .tab_widgets import MainTabBar, TabButtonWidget diff --git a/rare/components/tabs/games/__init__.py b/rare/components/tabs/library/__init__.py similarity index 95% rename from rare/components/tabs/games/__init__.py rename to rare/components/tabs/library/__init__.py index 9cc71c2df..1cab607cd 100644 --- a/rare/components/tabs/games/__init__.py +++ b/rare/components/tabs/library/__init__.py @@ -13,10 +13,8 @@ ) from rare.shared import RareCore from rare.models.options import options -from .game_info import GameInfoTabs -from .game_widgets import LibraryWidgetController, LibraryFilter, LibraryOrder, LibraryView -from .game_widgets.icon_game_widget import IconGameWidget -from .game_widgets.list_game_widget import ListGameWidget +from .details import GameInfoTabs +from .widgets import LibraryWidgetController, LibraryFilter, LibraryOrder, LibraryView from .head_bar import LibraryHeadBar from .integrations import IntegrationsTabs diff --git a/rare/components/tabs/games/game_info/__init__.py b/rare/components/tabs/library/details/__init__.py similarity index 100% rename from rare/components/tabs/games/game_info/__init__.py rename to rare/components/tabs/library/details/__init__.py diff --git a/rare/components/tabs/games/game_info/cloud_saves.py b/rare/components/tabs/library/details/cloud_saves.py similarity index 100% rename from rare/components/tabs/games/game_info/cloud_saves.py rename to rare/components/tabs/library/details/cloud_saves.py diff --git a/rare/components/tabs/games/game_info/details.py b/rare/components/tabs/library/details/details.py similarity index 100% rename from rare/components/tabs/games/game_info/details.py rename to rare/components/tabs/library/details/details.py diff --git a/rare/components/tabs/games/game_info/dlcs.py b/rare/components/tabs/library/details/dlcs.py similarity index 100% rename from rare/components/tabs/games/game_info/dlcs.py rename to rare/components/tabs/library/details/dlcs.py diff --git a/rare/components/tabs/games/game_info/settings.py b/rare/components/tabs/library/details/settings.py similarity index 100% rename from rare/components/tabs/games/game_info/settings.py rename to rare/components/tabs/library/details/settings.py diff --git a/rare/components/tabs/games/head_bar.py b/rare/components/tabs/library/head_bar.py similarity index 100% rename from rare/components/tabs/games/head_bar.py rename to rare/components/tabs/library/head_bar.py diff --git a/rare/components/tabs/games/integrations/__init__.py b/rare/components/tabs/library/integrations/__init__.py similarity index 100% rename from rare/components/tabs/games/integrations/__init__.py rename to rare/components/tabs/library/integrations/__init__.py diff --git a/rare/components/tabs/games/integrations/egl_sync_group.py b/rare/components/tabs/library/integrations/egl_sync_group.py similarity index 99% rename from rare/components/tabs/games/integrations/egl_sync_group.py rename to rare/components/tabs/library/integrations/egl_sync_group.py index 3437dcaee..63dae14db 100644 --- a/rare/components/tabs/games/integrations/egl_sync_group.py +++ b/rare/components/tabs/library/integrations/egl_sync_group.py @@ -16,7 +16,6 @@ from rare.shared.workers.wine_resolver import WinePathResolver from rare.ui.components.tabs.games.integrations.egl_sync_group import Ui_EGLSyncGroup from rare.ui.components.tabs.games.integrations.egl_sync_list_group import Ui_EGLSyncListGroup -from rare.utils.compat import utils as compat_utils from rare.widgets.elide_label import ElideLabel from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon diff --git a/rare/components/tabs/games/integrations/eos_group.py b/rare/components/tabs/library/integrations/eos_group.py similarity index 100% rename from rare/components/tabs/games/integrations/eos_group.py rename to rare/components/tabs/library/integrations/eos_group.py diff --git a/rare/components/tabs/games/integrations/import_group.py b/rare/components/tabs/library/integrations/import_group.py similarity index 100% rename from rare/components/tabs/games/integrations/import_group.py rename to rare/components/tabs/library/integrations/import_group.py diff --git a/rare/components/tabs/games/integrations/ubisoft_group.py b/rare/components/tabs/library/integrations/ubisoft_group.py similarity index 100% rename from rare/components/tabs/games/integrations/ubisoft_group.py rename to rare/components/tabs/library/integrations/ubisoft_group.py diff --git a/rare/components/tabs/games/game_widgets/__init__.py b/rare/components/tabs/library/widgets/__init__.py similarity index 100% rename from rare/components/tabs/games/game_widgets/__init__.py rename to rare/components/tabs/library/widgets/__init__.py diff --git a/rare/components/tabs/games/game_widgets/game_widget.py b/rare/components/tabs/library/widgets/game_widget.py similarity index 100% rename from rare/components/tabs/games/game_widgets/game_widget.py rename to rare/components/tabs/library/widgets/game_widget.py diff --git a/rare/components/tabs/games/game_widgets/icon_game_widget.py b/rare/components/tabs/library/widgets/icon_game_widget.py similarity index 100% rename from rare/components/tabs/games/game_widgets/icon_game_widget.py rename to rare/components/tabs/library/widgets/icon_game_widget.py diff --git a/rare/components/tabs/games/game_widgets/icon_widget.py b/rare/components/tabs/library/widgets/icon_widget.py similarity index 98% rename from rare/components/tabs/games/game_widgets/icon_widget.py rename to rare/components/tabs/library/widgets/icon_widget.py index 640b50e35..0d8d814c0 100644 --- a/rare/components/tabs/games/game_widgets/icon_widget.py +++ b/rare/components/tabs/library/widgets/icon_widget.py @@ -10,7 +10,7 @@ QPushButton, ) -from rare.utils.misc import qta_icon, widget_object_name +from rare.utils.misc import qta_icon from rare.widgets.elide_label import ElideLabel diff --git a/rare/components/tabs/games/game_widgets/library_widget.py b/rare/components/tabs/library/widgets/library_widget.py similarity index 100% rename from rare/components/tabs/games/game_widgets/library_widget.py rename to rare/components/tabs/library/widgets/library_widget.py diff --git a/rare/components/tabs/games/game_widgets/list_game_widget.py b/rare/components/tabs/library/widgets/list_game_widget.py similarity index 100% rename from rare/components/tabs/games/game_widgets/list_game_widget.py rename to rare/components/tabs/library/widgets/list_game_widget.py diff --git a/rare/components/tabs/games/game_widgets/list_widget.py b/rare/components/tabs/library/widgets/list_widget.py similarity index 100% rename from rare/components/tabs/games/game_widgets/list_widget.py rename to rare/components/tabs/library/widgets/list_widget.py diff --git a/rare/resources/static_css/__init__.py b/rare/resources/static_css/__init__.py index 8f22ce0a8..c11bd4e70 100644 --- a/rare/resources/static_css/__init__.py +++ b/rare/resources/static_css/__init__.py @@ -70,7 +70,7 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x1a\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x906&\x0a\x17\ +\x00\x00\x01\x92\x09g[\xe6\ " def qInitResources(): diff --git a/rare/resources/static_css/stylesheet.py b/rare/resources/static_css/stylesheet.py index 55a748cfc..e7f3f3f14 100644 --- a/rare/resources/static_css/stylesheet.py +++ b/rare/resources/static_css/stylesheet.py @@ -83,7 +83,7 @@ def css_name(widget: Union[wrappertype, QObject, Type], subwidget: str = ""): # ProgressLabel -from rare.components.tabs.games.game_widgets.library_widget import ProgressLabel +from rare.components.tabs.library.widgets.library_widget import ProgressLabel css.QLabel[css_name(ProgressLabel)].setValues( borderWidth="1px", borderRadius="5%", @@ -93,7 +93,7 @@ def css_name(widget: Union[wrappertype, QObject, Type], subwidget: str = ""): # IconGameWidget -from rare.components.tabs.games.game_widgets.icon_widget import IconWidget +from rare.components.tabs.library.widgets.icon_widget import IconWidget icon_background_props = { "backgroundColor": "rgba(0, 0, 0, 65%)", } @@ -135,7 +135,7 @@ def css_name(widget: Union[wrappertype, QObject, Type], subwidget: str = ""): # ListGameWidget -from rare.components.tabs.games.game_widgets.list_widget import ListWidget +from rare.components.tabs.library.widgets.list_widget import ListWidget css.QLabel[css_name(ListWidget, "TitleLabel")].fontWeight.setValue("bold") list_status_label_props = { "color": "white", @@ -155,7 +155,7 @@ def css_name(widget: Union[wrappertype, QObject, Type], subwidget: str = ""): # SelectViewWidget -from rare.components.tabs.games.head_bar import SelectViewWidget +from rare.components.tabs.library.head_bar import SelectViewWidget css.QPushButton[css_name(SelectViewWidget, "Button")].setValues( border="none", backgroundColor="transparent",