1
0
Fork 0
mirror of synced 2024-06-29 11:40:37 +12:00
Rare/rare/shared/workers/uninstall.py
loathingKernel b5901c5a6d
UninstallDialog: add option to keep the game's folder
previously, if the game's install directory had remaining untracked
data, it would not get deleted. this option force-deletes it it is
not checked.
2024-06-15 17:50:34 +03:00

108 lines
3.6 KiB
Python

import platform
import shutil
from logging import getLogger
from typing import Tuple
from PyQt5.QtCore import QObject, pyqtSignal
from legendary.core import LegendaryCore
from legendary.lfs.eos import remove_registry_entries
from rare.lgndr.cli import LegendaryCLI
from rare.lgndr.glue.arguments import LgndrUninstallGameArgs
from rare.lgndr.glue.monkeys import LgndrIndirectStatus
from rare.models.game import RareGame
from rare.models.install import UninstallOptionsModel
from rare.utils import config_helper as config
from rare.utils.paths import desktop_links_supported, desktop_link_types, desktop_link_path
from .worker import Worker
logger = getLogger("UninstallWorker")
# TODO: You can use RareGame directly here once this is called inside RareCore and skip metadata fetch
def uninstall_game(
core: LegendaryCore, rgame: RareGame, keep_files=False, keep_folder=True, keep_config=False, keep_overlay_keys=False
) -> Tuple[bool, str]:
if rgame.is_overlay:
logger.info('Deleting overlay installation...')
core.remove_overlay_install()
if keep_overlay_keys:
return True, ""
logger.info('Removing registry entries...')
if platform.system() != "Window":
prefixes = config.get_prefixes()
if platform.system() == "Darwin":
# TODO: add crossover support
pass
if len(prefixes):
for prefix, _ in prefixes:
remove_registry_entries(prefix)
logger.debug("Removed registry entries for prefix %s", prefix)
else:
remove_registry_entries()
return True, ""
# remove shortcuts link
if desktop_links_supported():
for link_type in desktop_link_types():
link_path = desktop_link_path(
rgame.game.metadata.get("customAttributes", {}).get("FolderName", {}).get("value"), link_type
)
if link_path.exists():
link_path.unlink(missing_ok=True)
install_path = rgame.igame.install_path
status = LgndrIndirectStatus()
LegendaryCLI(core).uninstall_game(
LgndrUninstallGameArgs(
app_name=rgame.app_name,
keep_files=keep_files,
skip_uninstaller=False,
yes=True,
indirect_status=status,
)
)
keep_folder = keep_files if keep_files else keep_folder
if not keep_folder:
logger.info("Removing game install directory")
shutil.rmtree(install_path, ignore_errors=True)
if not keep_config:
logger.info("Removing sections in config file")
config.remove_section(rgame.app_name)
config.remove_section(f"{rgame.app_name}.env")
config.save_config()
return status.success, status.message
class UninstallWorker(Worker):
class Signals(QObject):
result = pyqtSignal(RareGame, bool, str)
def __init__(self, core: LegendaryCore, rgame: RareGame, options: UninstallOptionsModel):
super(UninstallWorker, self).__init__()
self.signals = UninstallWorker.Signals()
self.core = core
self.rgame = rgame
self.options = options
def run_real(self) -> None:
self.rgame.state = RareGame.State.UNINSTALLING
success, message = uninstall_game(
self.core,
self.rgame,
keep_files=self.options.keep_files,
keep_folder=self.options.keep_folder,
keep_config=self.options.keep_config,
keep_overlay_keys=self.options.keep_overlay_keys,
)
self.rgame.state = RareGame.State.IDLE
self.signals.result.emit(self.rgame, success, message)