From a92b0aa0d814dae7c3d78a9f6921852a9ba64f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Fri, 12 Jun 2020 22:47:37 +0200 Subject: [PATCH] Add replacement variables for some members. --- basic_game.py | 87 +++++++++++++++++++++++++++++++++--------- games/game_witcher3.py | 7 ++-- steam_utils.py | 6 +++ 3 files changed, 78 insertions(+), 22 deletions(-) diff --git a/basic_game.py b/basic_game.py index 9e94c3b..4d59c69 100644 --- a/basic_game.py +++ b/basic_game.py @@ -9,6 +9,24 @@ from PyQt5.QtGui import QIcon import mobase +def replace_variables(value: str, game: "BasicGame") -> str: + """ Replace special paths in the given value. """ + + if value.find("%DOCUMENTS%") != -1: + value = value.replace( + "%DOCUMENTS%", + QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation), + ) + if value.find("%GAME_DOCUMENTS%") != -1: + value = value.replace( + "%GAME_DOCUMENTS%", game.documentsDirectory().absolutePath() + ) + if value.find("%GAME_PATH%") != -1: + value = value.replace("%GAME_PATH%", game.gameDirectory().absolutePath()) + + return value + + T = TypeVar("T") @@ -49,6 +67,7 @@ class BasicGameMapping(Generic[T]): if hasattr(game, self._exposed_name): value = getattr(game, self._exposed_name) + if self._apply_fn is not None: try: value = self._apply_fn(value) @@ -73,7 +92,14 @@ class BasicGameMapping(Generic[T]): def get(self) -> T: """ Return the value of this mapping. """ - return self._default(self._game) # type: ignore + value = self._default(self._game) # type: ignore + + if isinstance(value, str): + return replace_variables(value, self._game) # type: ignore + elif isinstance(value, QDir): + return QDir(replace_variables(value.path(), self._game)) # type: ignore + + return value class BasicGameMappings: @@ -90,11 +116,35 @@ class BasicGameMappings: binaryName: BasicGameMapping[str] launcherName: BasicGameMapping[str] dataDirectory: BasicGameMapping[str] + documentsDirectory: BasicGameMapping[QDir] + savesDirectory: BasicGameMapping[QDir] savegameExtension: BasicGameMapping[str] steamAPPId: BasicGameMapping[str] + @staticmethod + def _default_documents_directory(game): + + folders = [ + "{}/My Games/{}".format( + QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation), + game.gameName(), + ), + "{}/{}".format( + QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation), + game.gameName(), + ), + ] + for folder in folders: + qdir = QDir(folder) + if qdir.exists(): + return qdir + + return QDir() + # Game mappings: def __init__(self, game: "BasicGame"): + self._game = game + self.name = BasicGameMapping(game, "Name", "name") self.author = BasicGameMapping(game, "Author", "author") self.version = BasicGameMapping( @@ -131,6 +181,20 @@ class BasicGameMappings: game, "GameLauncher", "getLauncherName", default=lambda g: "", ) self.dataDirectory = BasicGameMapping(game, "GameDataPath", "dataDirectory") + self.documentsDirectory = BasicGameMapping( + game, + "GameDocumentsDirectory", + "documentsDirectory", + apply_fn=lambda s: QDir(s) if isinstance(s, str) else s, + default=BasicGameMappings._default_documents_directory, + ) + self.savesDirectory = BasicGameMapping( + game, + "GameSavesDirectory", + "savesDirectory", + apply_fn=lambda s: QDir(s) if isinstance(s, str) else s, + default=lambda g: g.documentsDirectory(), + ) self.savegameExtension = BasicGameMapping( game, "GameSaveExtension", "savegameExtension", default=lambda g: "save" ) @@ -171,6 +235,8 @@ class BasicGame(mobase.IPluginGame): if not hasattr(self, "_fromName"): self._fromName = self.__class__.__name__ + + self._gamePath = "" self._featureMap = {} self.mappings: BasicGameMappings = BasicGameMappings(self) @@ -318,25 +384,10 @@ class BasicGame(mobase.IPluginGame): self._gamePath = pathStr def documentsDirectory(self) -> QDir: - folders = [ - "{}/My Games/{}".format( - QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation), - self.gameName(), - ), - "{}/{}".format( - QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation), - self.gameName(), - ), - ] - for folder in folders: - qdir = QDir(folder) - if qdir.exists(): - return qdir - - return QDir() + return self.mappings.documentsDirectory.get() def savesDirectory(self) -> QDir: - return self.documentsDirectory() + return self.mappings.savesDirectory.get() def _featureList(self): return self._featureMap diff --git a/games/game_witcher3.py b/games/game_witcher3.py index 1a1349f..93dbfb0 100644 --- a/games/game_witcher3.py +++ b/games/game_witcher3.py @@ -21,7 +21,9 @@ class Witcher3Game(BasicGame): GameBinary: str = "bin/x64/witcher3.exe" GameDataPath: str = "Mods" GameSaveExtension: str = "sav" - GameSteamId = 292030 + GameSteamId: int = 292030 + GameDocumentsDirectory: str = "%DOCUMENTS%/The Witcher 3" + GameSavesDirectory: str = "%GAME_DOCUMENTS%/gamesaves" def init(self, organizer: mobase.IOrganizer): super().init(organizer) @@ -29,6 +31,3 @@ class Witcher3Game(BasicGame): lambda s: s.replace(".sav", ".png") ) return True - - def savesDirectory(self): - return QDir(self.documentsDirectory().absoluteFilePath("gamesaves")) diff --git a/steam_utils.py b/steam_utils.py index 94108e4..50ca304 100644 --- a/steam_utils.py +++ b/steam_utils.py @@ -118,3 +118,9 @@ def find_games() -> Dict[str, str]: ) return games + + +if __name__ == "__main__": + games = find_games() + for k, v in games.items(): + print("Found game with id {} at {}.".format(k, v))