2021-03-09 05:20:28 +13:00
|
|
|
import os
|
2023-12-25 07:44:46 +13:00
|
|
|
from typing import Union, List, LiteralString
|
2021-03-09 05:20:28 +13:00
|
|
|
|
2021-10-25 08:23:31 +13:00
|
|
|
from legendary.core import LegendaryCore
|
2023-09-20 10:39:15 +12:00
|
|
|
from legendary.models.game import InstalledGame
|
|
|
|
|
|
|
|
from rare.utils.config_helper import get_prefixes
|
2021-09-30 10:22:47 +13:00
|
|
|
|
|
|
|
|
2021-10-25 08:23:31 +13:00
|
|
|
class PathSpec:
|
|
|
|
|
2023-09-20 10:39:15 +12:00
|
|
|
@staticmethod
|
|
|
|
def egl_appdata() -> str:
|
|
|
|
return r"%LOCALAPPDATA%\EpicGamesLauncher\Saved\Config\Windows"
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def egl_programdata() -> str:
|
|
|
|
return r"%PROGRAMDATA%\Epic\EpicGamesLauncher\Data\Manifests"
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def wine_programdata() -> str:
|
|
|
|
return r"ProgramData"
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def wine_egl_programdata() -> str:
|
|
|
|
return PathSpec.egl_programdata(
|
|
|
|
).replace(
|
|
|
|
"\\", "/"
|
|
|
|
).replace(
|
|
|
|
"%PROGRAMDATA%", PathSpec.wine_programdata()
|
|
|
|
)
|
2021-10-25 08:23:31 +13:00
|
|
|
|
2023-09-20 10:39:15 +12:00
|
|
|
@staticmethod
|
|
|
|
def prefix_egl_programdata(prefix: str) -> str:
|
|
|
|
return os.path.join(prefix, "dosdevices/c:", PathSpec.wine_egl_programdata())
|
2021-10-25 08:23:31 +13:00
|
|
|
|
2023-09-20 10:39:15 +12:00
|
|
|
@staticmethod
|
|
|
|
def wine_egl_prefixes(results: int = 0) -> Union[List[str], str]:
|
|
|
|
possible_prefixes = get_prefixes()
|
2023-12-25 07:44:46 +13:00
|
|
|
prefixes = [
|
|
|
|
prefix
|
|
|
|
for prefix in possible_prefixes
|
|
|
|
if os.path.exists(os.path.join(prefix, PathSpec.wine_egl_programdata()))
|
|
|
|
]
|
2021-10-25 08:23:31 +13:00
|
|
|
if not prefixes:
|
2023-09-20 10:39:15 +12:00
|
|
|
return ""
|
2021-10-25 08:23:31 +13:00
|
|
|
if not results:
|
|
|
|
return prefixes
|
|
|
|
elif results == 1:
|
|
|
|
return prefixes[0]
|
|
|
|
else:
|
|
|
|
return prefixes[:results]
|
2023-09-20 10:39:15 +12:00
|
|
|
|
|
|
|
def __init__(self, core: LegendaryCore = None, igame: InstalledGame = None):
|
|
|
|
self.__egl_path_vars = {
|
|
|
|
"{appdata}": os.path.expandvars("%LOCALAPPDATA%"),
|
|
|
|
"{userdir}": os.path.expandvars("%USERPROFILE%/Documents"),
|
|
|
|
"{userprofile}": os.path.expandvars("%userprofile%"), # possibly wrong
|
|
|
|
"{usersavedgames}": os.path.expandvars("%USERPROFILE%/Saved Games"),
|
|
|
|
}
|
|
|
|
|
|
|
|
if core is not None:
|
2023-12-25 07:44:46 +13:00
|
|
|
self.__egl_path_vars["{epicid}"] = core.lgd.userdata["account_id"]
|
2023-09-20 10:39:15 +12:00
|
|
|
|
|
|
|
if igame is not None:
|
2023-12-25 07:44:46 +13:00
|
|
|
self.__egl_path_vars["{installdir}"] = igame.install_path
|
2023-09-20 10:39:15 +12:00
|
|
|
|
2023-12-25 07:44:46 +13:00
|
|
|
def resolve_egl_path_vars(self, path: str) -> Union[LiteralString, str, bytes]:
|
2023-09-20 10:39:15 +12:00
|
|
|
cooked_path = [self.__egl_path_vars.get(p.lower(), p) for p in path.split("/")]
|
|
|
|
return os.path.join(*cooked_path)
|