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)