1
0
Fork 0
mirror of synced 2024-09-28 07:22:37 +12:00

Add sync worker to launch helper

Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
This commit is contained in:
lennard 2023-03-03 00:39:03 +02:00 committed by loathingKernel
parent 63e4223a96
commit 45ecaa39f3
No known key found for this signature in database
GPG key ID: CE0C72D0B53821FD
4 changed files with 87 additions and 18 deletions

View file

@ -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):

View file

@ -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")

View file

@ -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

View file

@ -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)