1
0
Fork 0
mirror of synced 2024-07-03 13:40:47 +12:00
Rare/rare/shared/game_utils.py

125 lines
4.4 KiB
Python
Raw Normal View History

from logging import getLogger
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, pyqtSlot
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtWidgets import QMessageBox, QPushButton
from rare.models.game import RareGame
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
from .cloud_save_utils import CloudSaveUtils
logger = getLogger("GameUtils")
class GameUtils(QObject):
2021-11-17 10:54:23 +13:00
finished = pyqtSignal(str, str) # app_name, error
cloud_save_finished = pyqtSignal(str)
2021-11-17 10:54:23 +13:00
update_list = pyqtSignal(str)
def __init__(self, parent=None):
super(GameUtils, self).__init__(parent=parent)
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
self.args = ArgumentsSingleton()
self.running_games = {}
self.launch_queue = {}
self.cloud_save_utils = CloudSaveUtils()
self.cloud_save_utils.sync_finished.connect(self.sync_finished)
2021-12-24 22:09:50 +13:00
def prepare_launch(
self, rgame: RareGame, offline: bool = False, skip_update_check: bool = False
2021-12-24 22:09:50 +13:00
):
2021-11-17 10:54:23 +13:00
dont_sync_after_finish = False
2022-06-12 02:59:53 +12:00
# TODO move this to helper
if rgame.game.supports_cloud_saves and not offline:
2021-11-17 10:54:23 +13:00
try:
sync = self.cloud_save_utils.sync_before_launch_game(rgame)
2021-11-17 10:54:23 +13:00
except ValueError:
logger.info("Cancel startup")
self.sync_finished(rgame)
return
2021-11-17 10:54:23 +13:00
except AssertionError:
dont_sync_after_finish = True
else:
if sync:
self.launch_queue[rgame.app_name] = (rgame, skip_update_check, offline)
2021-11-17 10:54:23 +13:00
return
self.sync_finished(rgame)
2021-12-24 22:09:50 +13:00
self.launch_game(
rgame, offline, skip_update_check, ask_sync_saves=dont_sync_after_finish
2021-12-24 22:09:50 +13:00
)
@pyqtSlot(RareGame, int)
def game_finished(self, rgame: RareGame, exit_code):
if self.running_games.get(rgame.app_name):
self.running_games.pop(rgame.app_name)
2022-06-24 08:01:14 +12:00
if exit_code == -1234:
return
self.finished.emit(rgame.app_name, "")
rgame.signals.game.finished.emit()
2022-06-24 08:01:14 +12:00
logger.info(f"Game exited with exit code: {exit_code}")
self.signals.discord_rpc.set_title.emit("")
if exit_code == 1 and rgame.is_origin:
msg_box = QMessageBox()
2021-12-24 22:09:50 +13:00
msg_box.setText(
self.tr(
"Origin is not installed. Do you want to download installer file? "
)
)
msg_box.addButton(QPushButton("Download"), QMessageBox.YesRole)
msg_box.addButton(QPushButton("Cancel"), QMessageBox.RejectRole)
resp = msg_box.exec()
# click install button
if resp == 0:
2022-03-28 10:03:48 +13:00
QDesktopServices.openUrl(QUrl("https://www.dm.origin.com/download"))
return
2022-06-24 08:01:14 +12:00
if exit_code != 0:
2022-08-01 11:22:37 +12:00
pass
"""
2021-12-24 22:09:50 +13:00
QMessageBox.warning(
None,
"Warning",
self.tr("Failed to launch {}. Check logs to find error").format(
2021-12-24 22:09:50 +13:00
self.core.get_game(app_name).app_title
),
)
2022-08-01 11:22:37 +12:00
"""
if rgame.app_name in self.running_games.keys():
self.running_games.pop(rgame.app_name)
if rgame.game.supports_cloud_saves:
if exit_code != 0:
2021-12-24 22:09:50 +13:00
r = QMessageBox.question(
None,
"Question",
self.tr(
"Game exited with code {}, which is not a normal code. "
"It could be caused by a crash. Do you want to sync cloud saves"
2021-12-24 22:09:50 +13:00
).format(exit_code),
buttons=QMessageBox.Yes | QMessageBox.No,
defaultButton=QMessageBox.Yes,
)
if r != QMessageBox.Yes:
return
2022-06-24 08:01:14 +12:00
# TODO move this to helper
self.cloud_save_utils.game_finished(rgame, always_ask=False)
@pyqtSlot(RareGame)
def sync_finished(self, rgame: RareGame):
if rgame.app_name in self.launch_queue.keys():
self.cloud_save_finished.emit(rgame.app_name)
params = self.launch_queue[rgame.app_name]
self.launch_queue.pop(rgame.app_name)
self.launch_game(*params)
else:
self.cloud_save_finished.emit(rgame.app_name)