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

201 lines
6.8 KiB
Python
Raw Normal View History

import os
2021-12-19 11:24:20 +13:00
import platform
2021-02-18 06:19:37 +13:00
from logging import getLogger
2021-10-04 08:29:33 +13:00
from PyQt5.QtCore import Qt, pyqtSignal, QRunnable, QObject, QThreadPool
from PyQt5.QtWidgets import QDialog
2021-10-05 08:01:45 +13:00
from requests.exceptions import ConnectionError, HTTPError
2021-02-18 06:19:37 +13:00
from legendary.core import LegendaryCore
2021-10-04 08:29:33 +13:00
from legendary.models.game import GameAsset
2021-10-08 07:19:24 +13:00
from rare import image_dir, shared
2021-04-08 08:39:23 +12:00
from rare.components.dialogs.login import LoginDialog
from rare.ui.components.dialogs.launch_dialog import Ui_LaunchDialog
2021-10-04 08:29:33 +13:00
from rare.utils.models import ApiResults
from rare.utils.utils import download_images, CloudWorker
2021-02-23 07:02:49 +13:00
2021-02-18 06:19:37 +13:00
logger = getLogger("Login")
2021-02-23 07:02:49 +13:00
2021-10-04 08:29:33 +13:00
class ApiSignals(QObject):
image_progress = pyqtSignal(int)
result = pyqtSignal(object, str)
2021-02-18 06:19:37 +13:00
2021-10-04 08:29:33 +13:00
class ImageWorker(QRunnable):
def __init__(self, core: LegendaryCore):
super(ImageWorker, self).__init__()
2021-02-18 06:19:37 +13:00
self.core = core
2021-10-04 08:29:33 +13:00
self.signal = ApiSignals()
self.setAutoDelete(True)
2021-02-18 06:19:37 +13:00
def run(self):
download_images(self.signal.image_progress, self.signal.result, self.core)
2021-10-04 08:29:33 +13:00
self.signal.image_progress.emit(100)
class ApiRequestWorker(QRunnable):
def __init__(self):
2021-10-04 08:29:33 +13:00
super(ApiRequestWorker, self).__init__()
self.signals = ApiSignals()
self.setAutoDelete(True)
def run(self) -> None:
try:
result = shared.core.get_game_and_dlc_list(True, "Mac")
except HTTPError():
result = [], {}
self.signals.result.emit(result, "mac")
try:
result = shared.core.get_game_and_dlc_list(True, "Win32")
except HTTPError():
result = [], {}
self.signals.result.emit(result, "32bit")
class AssetWorker(QRunnable):
def __init__(self):
super(AssetWorker, self).__init__()
self.signals = ApiSignals()
self.setAutoDelete(True)
self.assets = dict()
def run(self) -> None:
2021-12-19 12:00:18 +13:00
platforms = shared.core.get_installed_platforms()
platforms.add("Windows")
if platform.system() == "Darwin":
platforms.add("Mac")
2021-12-19 11:24:20 +13:00
for p in platforms:
self.assets.update({p: self.get_asset(p)})
self.signals.result.emit(self.assets, "assets")
@staticmethod
2021-12-19 11:24:20 +13:00
def get_asset(p):
if not shared.core.egs.user:
return []
assets = [
GameAsset.from_egs_json(a) for a in
2021-12-19 11:24:20 +13:00
shared.core.egs.get_game_assets(platform=p)
]
return assets
class LaunchDialog(QDialog, Ui_LaunchDialog):
quit_app = pyqtSignal(int)
2021-10-08 07:19:24 +13:00
start_app = pyqtSignal()
finished = 0
2021-10-08 07:19:24 +13:00
def __init__(self, parent=None):
super(LaunchDialog, self).__init__(parent=parent)
self.setupUi(self)
2021-06-04 09:33:36 +12:00
self.setAttribute(Qt.WA_DeleteOnClose, True)
2021-10-15 10:18:13 +13:00
self.core = shared.core
2021-10-08 07:19:24 +13:00
self.offline = shared.args.offline
2021-10-04 08:29:33 +13:00
self.thread_pool = QThreadPool()
2021-10-04 09:20:54 +13:00
self.thread_pool.setMaxThreadCount(2)
2021-10-04 08:29:33 +13:00
self.api_results = ApiResults()
2021-04-20 01:44:28 +12:00
def login(self):
do_launch = True
try:
if self.offline:
pass
else:
if self.core.login():
logger.info("You are logged in")
else:
raise ValueError("You are not logged in. Open Login Window")
except ValueError as e:
logger.info(str(e))
do_launch = LoginDialog(core=self.core, parent=self).login()
except ConnectionError as e:
logger.warning(e)
self.offline = True
finally:
if do_launch:
if not shared.args.silent:
self.show()
self.launch()
else:
self.quit_app.emit(0)
def launch(self):
2021-03-19 00:45:59 +13:00
# self.core = core
2021-08-17 09:08:15 +12:00
if not os.path.exists(image_dir):
os.makedirs(image_dir)
if not self.offline:
self.image_info.setText(self.tr("Downloading Images"))
2021-10-04 08:29:33 +13:00
image_worker = ImageWorker(self.core)
image_worker.signal.image_progress.connect(self.update_image_progbar)
image_worker.signal.result.connect(self.handle_api_worker_result)
2021-10-04 08:29:33 +13:00
self.thread_pool.start(image_worker)
# gamelist and no_asset games are from Image worker
worker = ApiRequestWorker()
worker.signals.result.connect(self.handle_api_worker_result)
self.thread_pool.start(worker)
2021-10-04 08:29:33 +13:00
asset_worker = AssetWorker()
asset_worker.signals.result.connect(self.handle_api_worker_result)
self.thread_pool.start(asset_worker)
# cloud save from another worker, because it is used in cloud_save_utils too
cloud_worker = CloudWorker()
cloud_worker.signals.result_ready.connect(lambda x: self.handle_api_worker_result(x, "saves"))
self.thread_pool.start(cloud_worker)
2021-06-12 10:29:55 +12:00
else:
self.finished = 2
if self.core.lgd.assets:
self.api_results.game_list, self.api_results.dlcs = self.core.get_game_and_dlc_list(False)
self.api_results.bit32_games = list(map(lambda i: i.app_name, self.core.get_game_list(False, "Win32")))
self.api_results.mac_games = list(map(lambda i: i.app_name, self.core.get_game_list(False, "Mac")))
else:
logger.warning("No assets found. Falling back to empty game lists")
self.api_results.game_list, self.api_results.dlcs = [], {}
self.api_results.mac_games = self.api_results.bit32_games = []
2021-10-04 08:29:33 +13:00
self.finish()
def handle_api_worker_result(self, result, text):
logger.debug("Api Request got from " + text)
if text == "gamelist":
2021-10-05 08:01:45 +13:00
if result:
self.api_results.game_list, self.api_results.dlcs = result
else:
self.api_results.game_list, self.api_results.dlcs = self.core.get_game_and_dlc_list(False)
2021-10-04 08:29:33 +13:00
elif text == "32bit":
2021-10-05 08:01:45 +13:00
self.api_results.bit32_games = [i.app_name for i in result[0]] if result else []
2021-10-04 08:29:33 +13:00
elif text == "mac":
2021-10-05 08:01:45 +13:00
self.api_results.mac_games = [i.app_name for i in result[0]] if result else []
2021-10-04 08:29:33 +13:00
elif text == "no_assets":
self.api_results.no_asset_games = result if result else []
2021-10-04 08:29:33 +13:00
2021-10-24 12:47:49 +13:00
elif text == "saves":
self.api_results.saves = result
elif text == "assets":
self.core.lgd.assets = result
self.finish()
return
2021-10-24 12:47:49 +13:00
2021-10-04 08:29:33 +13:00
if self.api_results:
2021-06-12 10:29:55 +12:00
self.finish()
def update_image_progbar(self, i: int):
self.image_prog_bar.setValue(i)
2021-10-04 08:29:33 +13:00
if i == 100:
self.finish()
def finish(self):
if self.finished == 2:
2021-10-04 08:29:33 +13:00
logger.info("App starting")
self.image_info.setText(self.tr("Starting..."))
2021-10-08 07:19:24 +13:00
shared.args.offline = self.offline
shared.init_api_response(self.api_results)
2021-10-08 07:19:24 +13:00
self.start_app.emit()
2021-10-04 08:29:33 +13:00
else:
self.finished += 1