2021-11-02 10:53:04 +13:00
|
|
|
from logging import getLogger
|
|
|
|
|
2023-01-13 04:32:03 +13:00
|
|
|
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, pyqtSlot
|
2022-03-28 08:52:32 +13:00
|
|
|
from PyQt5.QtGui import QDesktopServices
|
2021-11-02 10:53:04 +13:00
|
|
|
from PyQt5.QtWidgets import QMessageBox, QPushButton
|
|
|
|
|
2023-01-05 09:33:30 +13:00
|
|
|
from rare.models.game import RareGame
|
2022-03-28 08:52:32 +13:00
|
|
|
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
|
2022-12-27 02:11:23 +13:00
|
|
|
from .cloud_save_utils import CloudSaveUtils
|
2021-11-02 10:53:04 +13:00
|
|
|
|
|
|
|
logger = getLogger("GameUtils")
|
|
|
|
|
|
|
|
|
|
|
|
class GameUtils(QObject):
|
2021-11-17 10:54:23 +13:00
|
|
|
finished = pyqtSignal(str, str) # app_name, error
|
2021-11-02 10:53:04 +13:00
|
|
|
cloud_save_finished = pyqtSignal(str)
|
2021-11-17 10:54:23 +13:00
|
|
|
update_list = pyqtSignal(str)
|
2021-11-02 10:53:04 +13:00
|
|
|
|
|
|
|
def __init__(self, parent=None):
|
|
|
|
super(GameUtils, self).__init__(parent=parent)
|
2022-02-26 06:43:27 +13:00
|
|
|
self.core = LegendaryCoreSingleton()
|
|
|
|
self.signals = GlobalSignalsSingleton()
|
|
|
|
self.args = ArgumentsSingleton()
|
2021-11-02 10:53:04 +13:00
|
|
|
|
2023-01-05 09:33:30 +13:00
|
|
|
self.running_games = {}
|
|
|
|
self.launch_queue = {}
|
|
|
|
|
2021-11-02 10:53:04 +13:00
|
|
|
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(
|
2023-01-05 09:33:30 +13:00
|
|
|
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
|
2023-01-05 09:33:30 +13:00
|
|
|
if rgame.game.supports_cloud_saves and not offline:
|
2021-11-17 10:54:23 +13:00
|
|
|
try:
|
2023-01-10 06:58:57 +13:00
|
|
|
sync = self.cloud_save_utils.sync_before_launch_game(rgame)
|
2021-11-17 10:54:23 +13:00
|
|
|
except ValueError:
|
|
|
|
logger.info("Cancel startup")
|
2023-01-10 06:58:57 +13:00
|
|
|
self.sync_finished(rgame)
|
2022-03-23 08:40:23 +13:00
|
|
|
return
|
2021-11-17 10:54:23 +13:00
|
|
|
except AssertionError:
|
|
|
|
dont_sync_after_finish = True
|
|
|
|
else:
|
|
|
|
if sync:
|
2023-01-10 06:58:57 +13:00
|
|
|
self.launch_queue[rgame.app_name] = (rgame, skip_update_check, offline)
|
2021-11-17 10:54:23 +13:00
|
|
|
return
|
2023-01-10 06:58:57 +13:00
|
|
|
self.sync_finished(rgame)
|
2021-11-14 11:56:07 +13:00
|
|
|
|
2021-12-24 22:09:50 +13:00
|
|
|
self.launch_game(
|
2023-01-13 04:32:03 +13:00
|
|
|
rgame, offline, skip_update_check, ask_sync_saves=dont_sync_after_finish
|
2021-12-24 22:09:50 +13:00
|
|
|
)
|
|
|
|
|
2023-01-11 08:40:57 +13:00
|
|
|
@pyqtSlot(RareGame, int)
|
2023-01-10 06:58:57 +13:00
|
|
|
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
|
|
|
|
|
2023-01-10 06:58:57 +13:00
|
|
|
self.finished.emit(rgame.app_name, "")
|
2023-01-11 09:31:10 +13:00
|
|
|
rgame.signals.game.finished.emit()
|
2022-06-24 08:01:14 +12:00
|
|
|
|
2022-02-02 10:29:34 +13:00
|
|
|
logger.info(f"Game exited with exit code: {exit_code}")
|
2022-12-29 06:55:15 +13:00
|
|
|
self.signals.discord_rpc.set_title.emit("")
|
2023-01-10 06:58:57 +13:00
|
|
|
if exit_code == 1 and rgame.is_origin:
|
2021-11-02 10:53:04 +13:00
|
|
|
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? "
|
|
|
|
)
|
|
|
|
)
|
2021-11-02 10:53:04 +13:00
|
|
|
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
|
|
|
|
2022-03-10 09:45:02 +13: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",
|
2022-03-10 09:45:02 +13:00
|
|
|
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
|
|
|
"""
|
2021-11-02 10:53:04 +13:00
|
|
|
|
2023-01-10 06:58:57 +13:00
|
|
|
if rgame.app_name in self.running_games.keys():
|
|
|
|
self.running_games.pop(rgame.app_name)
|
2021-11-02 10:53:04 +13:00
|
|
|
|
2023-01-10 06:58:57 +13:00
|
|
|
if rgame.game.supports_cloud_saves:
|
2021-11-02 10:53:04 +13:00
|
|
|
if exit_code != 0:
|
2021-12-24 22:09:50 +13:00
|
|
|
r = QMessageBox.question(
|
|
|
|
None,
|
|
|
|
"Question",
|
|
|
|
self.tr(
|
2022-03-29 08:11:22 +13:00
|
|
|
"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,
|
|
|
|
)
|
2021-11-02 10:53:04 +13:00
|
|
|
if r != QMessageBox.Yes:
|
|
|
|
return
|
2022-06-24 08:01:14 +12:00
|
|
|
|
|
|
|
# TODO move this to helper
|
2023-01-10 06:58:57 +13:00
|
|
|
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)
|
2021-11-02 10:53:04 +13:00
|
|
|
self.launch_game(*params)
|
|
|
|
else:
|
2023-01-10 06:58:57 +13:00
|
|
|
self.cloud_save_finished.emit(rgame.app_name)
|