From 3874fac402a2f0d950b4a16bf8b3e89445ea7b78 Mon Sep 17 00:00:00 2001 From: lennard <44114474+Dummerle@users.noreply.github.com> Date: Sat, 18 Mar 2023 16:14:01 +0100 Subject: [PATCH] Sync saves when game finished --- rare/components/dialogs/cloud_save_dialog.py | 6 ++-- rare/game_launch_helper/__init__.py | 34 +++++++++++++++++++- rare/models/base_game.py | 7 ++-- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/rare/components/dialogs/cloud_save_dialog.py b/rare/components/dialogs/cloud_save_dialog.py index 3228e3af..1aec8533 100644 --- a/rare/components/dialogs/cloud_save_dialog.py +++ b/rare/components/dialogs/cloud_save_dialog.py @@ -5,7 +5,7 @@ from logging import getLogger from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDialog, QSizePolicy, QLayout, QApplication, QWidget from legendary.core import LegendaryCore -from legendary.models.game import InstalledGame, SaveGameStatus +from legendary.models.game import InstalledGame from rare.ui.components.dialogs.sync_save_dialog import Ui_SyncSaveDialog from rare.ui.components.tabs.games.game_info.sync_widget import Ui_SyncWidget @@ -44,10 +44,10 @@ class CloudSaveDialog(QDialog, Ui_SyncSaveDialog): newer = self.tr("Newer") if dt_remote and dt_local: self.sync_ui.age_label_local.setText( - f"{newer}" if dt_remote > dt_local else " " + f"{newer}" if dt_remote < dt_local else " " ) self.sync_ui.age_label_remote.setText( - f"{newer}" if dt_remote < dt_local else " " + f"{newer}" if dt_remote > dt_local else " " ) elif dt_remote and not dt_local: self.status = self.DOWNLOAD diff --git a/rare/game_launch_helper/__init__.py b/rare/game_launch_helper/__init__.py index cbadd331..6906beeb 100644 --- a/rare/game_launch_helper/__init__.py +++ b/rare/game_launch_helper/__init__.py @@ -13,6 +13,7 @@ from PyQt5.QtCore import QObject, QProcess, pyqtSignal, QUrl, QRunnable, QThread from PyQt5.QtGui import QDesktopServices from PyQt5.QtNetwork import QLocalServer, QLocalSocket from PyQt5.QtWidgets import QApplication +from legendary.models.game import SaveGameStatus from rare.lgndr.core import LegendaryCore from rare.models.launcher import ErrorModel, Actions, FinishedModel, BaseModel, StateChangedModel @@ -196,10 +197,36 @@ class RareLauncher(RareApp): else: self.logger.error("Can't send message") + def check_saves_finished(self, exit_code: int): + self.rgame.signals.widget.update.connect(lambda: self.on_exit(exit_code)) + + state, (dt_local, dt_remote) = self.rgame.save_game_state + if state == SaveGameStatus.LOCAL_NEWER: + action = CloudSaveDialog.UPLOAD + else: + action = CloudSaveDialog(self.rgame.igame, dt_local, dt_remote).get_action() + if not action: + self.on_exit(exit_code) + return + if self.console: + self.console.log("Syncing saves...") + if action == CloudSaveDialog.UPLOAD: + self.rgame.upload_saves() + elif action == CloudSaveDialog.DOWNLOAD: + self.rgame.download_saves() + def game_finished(self, exit_code): - self.logger.info("game finished") + self.logger.info("Game finished") + + if self.rgame.supports_cloud_saves: + self.check_saves_finished(exit_code) + else: + self.on_exit(exit_code) + + def on_exit(self, exit_code: int): if self.console: self.console.on_process_exit(self.core.get_game(self.app_name).app_title, exit_code) + self.send_message( FinishedModel( action=Actions.finished, @@ -282,6 +309,11 @@ class RareLauncher(RareApp): _, (dt_local, dt_remote) = self.rgame.save_game_state dlg = CloudSaveDialog(self.rgame.igame, dt_local, dt_remote) action = dlg.get_action() + if self.console: + if action == CloudSaveDialog.DOWNLOAD: + self.console.log("Downloading saves") + elif action == CloudSaveDialog.UPLOAD: + self.console.log("Uloading saves") self.start_prepare(action) def start(self, args: InitArgs): diff --git a/rare/models/base_game.py b/rare/models/base_game.py index c4ee020e..293703eb 100644 --- a/rare/models/base_game.py +++ b/rare/models/base_game.py @@ -184,10 +184,9 @@ class RareGameSlim(RareGameBase): latest = self.latest_save # lk: if the save path wasn't known at startup, dt_local will be None # In that case resolve the save again before returning - if latest.dt_local is None: - latest.status, (latest.dt_local, latest.dt_remote) = self.core.check_savegame_state( - self.save_path, latest.file - ) + latest.status, (latest.dt_local, latest.dt_remote) = self.core.check_savegame_state( + self.save_path, latest.file + ) return latest.status, (latest.dt_local, latest.dt_remote) return SaveGameStatus.NO_SAVE, (None, None)