2023-01-25 23:59:00 +13:00
|
|
|
from logging import getLogger
|
|
|
|
|
2023-02-08 12:50:00 +13:00
|
|
|
from PyQt5.QtCore import QObject, pyqtSignal
|
2023-01-25 23:59:00 +13:00
|
|
|
from legendary.core import LegendaryCore
|
|
|
|
|
|
|
|
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
|
2023-02-08 12:50:00 +13:00
|
|
|
from rare.utils.paths import desktop_links_supported, desktop_link_types, desktop_link_path
|
2023-02-01 00:59:22 +13:00
|
|
|
from .worker import Worker
|
2023-01-25 23:59:00 +13:00
|
|
|
|
|
|
|
logger = getLogger("UninstallWorker")
|
|
|
|
|
2023-11-30 23:52:24 +13:00
|
|
|
|
2023-02-08 12:50:00 +13:00
|
|
|
# TODO: You can use RareGame directly here once this is called inside RareCore and skip metadata fetch
|
2023-01-25 23:59:00 +13:00
|
|
|
def uninstall_game(core: LegendaryCore, app_name: str, keep_files=False, keep_config=False):
|
2023-02-08 12:50:00 +13:00
|
|
|
game = core.get_game(app_name)
|
2023-01-25 23:59:00 +13:00
|
|
|
|
|
|
|
# remove shortcuts link
|
2023-02-08 12:50:00 +13:00
|
|
|
if desktop_links_supported():
|
|
|
|
for link_type in desktop_link_types():
|
|
|
|
link_path = desktop_link_path(
|
|
|
|
game.metadata.get("customAttributes", {}).get("FolderName", {}).get("value"), link_type
|
|
|
|
)
|
|
|
|
if link_path.exists():
|
|
|
|
link_path.unlink(missing_ok=True)
|
2023-01-25 23:59:00 +13:00
|
|
|
|
|
|
|
status = LgndrIndirectStatus()
|
|
|
|
LegendaryCLI(core).uninstall_game(
|
|
|
|
LgndrUninstallGameArgs(
|
|
|
|
app_name=app_name,
|
|
|
|
keep_files=keep_files,
|
2023-11-30 23:52:24 +13:00
|
|
|
skip_uninstaller=False,
|
2023-01-25 23:59:00 +13:00
|
|
|
yes=True,
|
2023-11-30 23:52:24 +13:00
|
|
|
indirect_status=status,
|
2023-01-25 23:59:00 +13:00
|
|
|
)
|
|
|
|
)
|
|
|
|
if not keep_config:
|
|
|
|
logger.info("Removing sections in config file")
|
|
|
|
config_helper.remove_section(app_name)
|
|
|
|
config_helper.remove_section(f"{app_name}.env")
|
|
|
|
|
|
|
|
config_helper.save_config()
|
|
|
|
|
|
|
|
return status.success, status.message
|
|
|
|
|
|
|
|
|
2023-02-01 00:59:22 +13:00
|
|
|
class UninstallWorker(Worker):
|
2023-01-25 23:59:00 +13:00
|
|
|
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
|
|
|
|
|
2023-02-01 00:59:22 +13:00
|
|
|
def run_real(self) -> None:
|
2023-01-25 23:59:00 +13:00
|
|
|
self.rgame.state = RareGame.State.UNINSTALLING
|
|
|
|
success, message = uninstall_game(
|
|
|
|
self.core, self.rgame.app_name, self.options.keep_files, self.options.keep_config
|
|
|
|
)
|
|
|
|
self.rgame.state = RareGame.State.IDLE
|
|
|
|
self.signals.result.emit(self.rgame, success, message)
|