Add sync worker to launch helper
Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
This commit is contained in:
parent
63e4223a96
commit
45ecaa39f3
4 changed files with 87 additions and 18 deletions
|
@ -24,7 +24,6 @@ class CloudSaveDialog(QDialog, Ui_SyncSaveDialog):
|
|||
igame: InstalledGame,
|
||||
dt_local: datetime.datetime,
|
||||
dt_remote: datetime.datetime,
|
||||
newer: str,
|
||||
):
|
||||
super(CloudSaveDialog, self).__init__()
|
||||
self.setupUi(self)
|
||||
|
@ -46,6 +45,14 @@ class CloudSaveDialog(QDialog, Ui_SyncSaveDialog):
|
|||
self.sync_ui.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %X"))
|
||||
|
||||
new_text = self.tr(" (newer)")
|
||||
newer = ""
|
||||
if dt_remote and dt_local:
|
||||
newer = "remote" if dt_remote > dt_local else "local"
|
||||
elif dt_remote and not dt_local:
|
||||
self.status = self.DOWNLOAD
|
||||
else:
|
||||
self.status = self.UPLOAD
|
||||
|
||||
if newer == "remote":
|
||||
self.sync_ui.cloud_gb.setTitle(self.sync_ui.cloud_gb.title() + new_text)
|
||||
elif newer == "local":
|
||||
|
@ -62,7 +69,9 @@ class CloudSaveDialog(QDialog, Ui_SyncSaveDialog):
|
|||
self.layout().setSizeConstraint(QLayout.SetFixedSize)
|
||||
|
||||
def get_action(self):
|
||||
self.exec_()
|
||||
if self.status:
|
||||
return self.status
|
||||
self.show()
|
||||
return self.status
|
||||
|
||||
def btn_clicked(self, status):
|
||||
|
|
|
@ -20,6 +20,7 @@ from rare.widgets.rare_app import RareApp, RareAppException
|
|||
from .console import Console
|
||||
from .lgd_helper import get_launch_args, InitArgs, get_configured_process, LaunchArgs, GameArgsError
|
||||
from ..models.base_game import RareGameSlim
|
||||
from rare.components.dialogs.cloud_save_dialog import CloudSaveDialog
|
||||
|
||||
logger = logging.getLogger("RareLauncher")
|
||||
|
||||
|
@ -35,14 +36,24 @@ class PreLaunchThread(QRunnable):
|
|||
pre_launch_command_finished = pyqtSignal(int) # exit_code
|
||||
error_occurred = pyqtSignal(str)
|
||||
|
||||
def __init__(self, core: LegendaryCore, args: InitArgs):
|
||||
def __init__(self, core: LegendaryCore, args: InitArgs, rgame: RareGameSlim, sync_action=None):
|
||||
super(PreLaunchThread, self).__init__()
|
||||
self.core = core
|
||||
self.app_name = args.app_name
|
||||
self.signals = self.Signals()
|
||||
self.args = args
|
||||
self.rgame = rgame
|
||||
self.sync_action = sync_action
|
||||
|
||||
def run(self) -> None:
|
||||
logger.info(f"Sync action: {self.sync_action}")
|
||||
if self.sync_action == CloudSaveDialog.UPLOAD:
|
||||
self.rgame.upload_saves(False)
|
||||
elif self.sync_action == CloudSaveDialog.DOWNLOAD:
|
||||
self.rgame.download_saves(False)
|
||||
else:
|
||||
logger.info("No sync action")
|
||||
|
||||
args = self.prepare_launch(self.args)
|
||||
if not args:
|
||||
return
|
||||
|
@ -67,6 +78,26 @@ class PreLaunchThread(QRunnable):
|
|||
return args
|
||||
|
||||
|
||||
class SyncCheckWorker(QRunnable):
|
||||
class Signals(QObject):
|
||||
sync_state_ready = pyqtSignal()
|
||||
error_occurred = pyqtSignal(str)
|
||||
|
||||
def __init__(self, core: LegendaryCore, rgame: RareGameSlim):
|
||||
super().__init__()
|
||||
self.signals = self.Signals()
|
||||
self.core = core
|
||||
self.rgame = rgame
|
||||
|
||||
def run(self) -> None:
|
||||
try:
|
||||
self.rgame.update_saves()
|
||||
except Exception as e:
|
||||
self.signals.error_occurred.emit(str(e))
|
||||
return
|
||||
self.signals.sync_state_ready.emit()
|
||||
|
||||
|
||||
class RareLauncherException(RareAppException):
|
||||
def __init__(self, app: 'RareLauncher', args: Namespace, parent=None):
|
||||
super(RareLauncherException, self).__init__(parent=parent)
|
||||
|
@ -93,7 +124,7 @@ class RareLauncher(RareApp):
|
|||
console: Optional[Console] = None
|
||||
success: bool = True
|
||||
|
||||
def __init__(self, args: Namespace):
|
||||
def __init__(self, args: InitArgs):
|
||||
log_file = f"Rare_Launcher_{args.app_name}" + "_{0}.log"
|
||||
super(RareLauncher, self).__init__(args, log_file)
|
||||
self._hook.deleteLater()
|
||||
|
@ -233,6 +264,26 @@ class RareLauncher(RareApp):
|
|||
)
|
||||
self.stop()
|
||||
|
||||
def start_prepare(self, sync_action=None):
|
||||
worker = PreLaunchThread(self.core, self.args, self.rgame, sync_action)
|
||||
worker.signals.ready_to_launch.connect(self.launch_game)
|
||||
worker.signals.error_occurred.connect(self.error_occurred)
|
||||
# worker.signals.started_pre_launch_command(None)
|
||||
|
||||
QThreadPool.globalInstance().start(worker)
|
||||
|
||||
def sync_ready(self):
|
||||
if self.rgame.is_save_up_to_date:
|
||||
if self.console:
|
||||
self.console.log("Sync worker ready. Sync not required")
|
||||
self.start_prepare()
|
||||
return
|
||||
|
||||
_, (dt_local, dt_remote) = self.rgame.save_game_state
|
||||
dlg = CloudSaveDialog(self.rgame.igame, dt_local, dt_remote)
|
||||
action = dlg.get_action()
|
||||
self.start_prepare(action)
|
||||
|
||||
def start(self, args: InitArgs):
|
||||
if not args.offline:
|
||||
try:
|
||||
|
@ -243,12 +294,15 @@ class RareLauncher(RareApp):
|
|||
self.logger.error("Not logged in. Try to launch game offline")
|
||||
args.offline = True
|
||||
|
||||
worker = PreLaunchThread(self.core, args)
|
||||
worker.signals.ready_to_launch.connect(self.launch_game)
|
||||
worker.signals.error_occurred.connect(self.error_occurred)
|
||||
# worker.signals.started_pre_launch_command(None)
|
||||
|
||||
QThreadPool.globalInstance().start(worker)
|
||||
if not args.offline and self.rgame.game.supports_cloud_saves:
|
||||
logger.info("Start sync worker")
|
||||
worker = SyncCheckWorker(self.core, self.rgame)
|
||||
worker.signals.error_occurred.connect(self.error_occurred)
|
||||
worker.signals.sync_state_ready.connect(self.sync_ready)
|
||||
QThreadPool.globalInstance().start(worker)
|
||||
return
|
||||
else:
|
||||
self.start_prepare()
|
||||
|
||||
def stop(self):
|
||||
self.logger.info("Stopping server")
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import os
|
||||
import platform
|
||||
import shutil
|
||||
from argparse import Namespace
|
||||
from dataclasses import dataclass
|
||||
from logging import getLogger
|
||||
from typing import List
|
||||
|
@ -18,8 +19,7 @@ class GameArgsError(Exception):
|
|||
pass
|
||||
|
||||
|
||||
@dataclass
|
||||
class InitArgs:
|
||||
class InitArgs(Namespace):
|
||||
app_name: str
|
||||
dry_run: bool = False
|
||||
debug: bool = False
|
||||
|
|
|
@ -168,7 +168,7 @@ class RareGameSlim(RareGameBase):
|
|||
return self.core.check_savegame_state(self.save_path, self.latest_save)
|
||||
return SaveGameStatus.NO_SAVE, (None, None)
|
||||
|
||||
def upload_saves(self):
|
||||
def upload_saves(self, thread=True):
|
||||
status, (dt_local, dt_remote) = self.save_game_state
|
||||
def _upload():
|
||||
logger.info(f"Uploading save for {self.title}")
|
||||
|
@ -186,10 +186,13 @@ class RareGameSlim(RareGameBase):
|
|||
logger.error(f"{self.title} is already syncing")
|
||||
return
|
||||
|
||||
worker = QRunnable.create(lambda: _upload())
|
||||
QThreadPool.globalInstance().start(worker)
|
||||
if thread:
|
||||
worker = QRunnable.create(lambda: _upload())
|
||||
QThreadPool.globalInstance().start(worker)
|
||||
else:
|
||||
_upload()
|
||||
|
||||
def download_saves(self):
|
||||
def download_saves(self, thread=True):
|
||||
status, (dt_local, dt_remote) = self.save_game_state
|
||||
def _download():
|
||||
logger.info(f"Downloading save for {self.title}")
|
||||
|
@ -207,8 +210,11 @@ class RareGameSlim(RareGameBase):
|
|||
logger.error(f"{self.title} is already syncing")
|
||||
return
|
||||
|
||||
worker = QRunnable.create(lambda: _download())
|
||||
QThreadPool.globalInstance().start(worker)
|
||||
if thread:
|
||||
worker = QRunnable.create(lambda: _download())
|
||||
QThreadPool.globalInstance().start(worker)
|
||||
else:
|
||||
_download()
|
||||
|
||||
def update_saves(self):
|
||||
self.saves = self.core.get_save_games(self.app_name)
|
||||
|
|
Loading…
Reference in a new issue