2021-09-12 23:23:40 +12:00
|
|
|
import os
|
|
|
|
import platform
|
2021-11-17 10:54:23 +13:00
|
|
|
from logging import getLogger
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2021-11-02 09:11:37 +13:00
|
|
|
from PyQt5.QtCore import pyqtSignal, QThreadPool
|
2021-09-12 23:23:40 +12:00
|
|
|
from PyQt5.QtWidgets import QWidget, QMessageBox
|
|
|
|
|
|
|
|
from legendary.models.game import Game, InstalledGame
|
2022-02-26 06:43:27 +13:00
|
|
|
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
|
2021-09-14 06:24:09 +12:00
|
|
|
from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo
|
2021-11-11 10:07:28 +13:00
|
|
|
from rare.utils.legendary_utils import VerifyWorker
|
2021-10-15 10:05:00 +13:00
|
|
|
from rare.utils.models import InstallOptionsModel
|
2021-09-12 23:23:40 +12:00
|
|
|
from rare.utils.steam_grades import SteamWorker
|
|
|
|
from rare.utils.utils import get_size, get_pixmap
|
|
|
|
|
2021-11-17 10:54:23 +13:00
|
|
|
logger = getLogger("GameInfo")
|
|
|
|
|
2021-09-12 23:23:40 +12:00
|
|
|
|
|
|
|
class GameInfo(QWidget, Ui_GameInfo):
|
|
|
|
igame: InstalledGame
|
2021-09-30 10:22:47 +13:00
|
|
|
game: Game = None
|
2021-09-16 10:29:12 +12:00
|
|
|
verify_threads = dict()
|
2021-10-15 10:05:00 +13:00
|
|
|
verification_finished = pyqtSignal(InstalledGame)
|
2021-11-17 10:54:23 +13:00
|
|
|
uninstalled = pyqtSignal(str)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2021-11-17 10:54:23 +13:00
|
|
|
def __init__(self, parent, game_utils):
|
2021-09-12 23:23:40 +12:00
|
|
|
super(GameInfo, self).__init__(parent=parent)
|
|
|
|
self.setupUi(self)
|
2022-02-26 06:43:27 +13:00
|
|
|
self.core = LegendaryCoreSingleton()
|
|
|
|
self.signals = GlobalSignalsSingleton()
|
|
|
|
self.args = ArgumentsSingleton()
|
2021-11-17 10:54:23 +13:00
|
|
|
self.game_utils = game_utils
|
2021-09-12 23:23:40 +12:00
|
|
|
|
|
|
|
if platform.system() == "Windows":
|
|
|
|
self.lbl_grade.setVisible(False)
|
|
|
|
self.grade.setVisible(False)
|
|
|
|
else:
|
|
|
|
self.steam_worker = SteamWorker(self.core)
|
2021-11-02 09:11:37 +13:00
|
|
|
self.steam_worker.signals.rating_signal.connect(self.grade.setText)
|
|
|
|
self.steam_worker.setAutoDelete(False)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
|
|
|
self.game_actions_stack.setCurrentIndex(0)
|
2021-09-19 02:50:13 +12:00
|
|
|
self.install_button.setText(self.tr("Link to Origin/Launch"))
|
2021-09-12 23:23:40 +12:00
|
|
|
self.game_actions_stack.resize(self.game_actions_stack.minimumSize())
|
|
|
|
|
2021-11-17 10:54:23 +13:00
|
|
|
self.uninstall_button.clicked.connect(self.uninstall)
|
2021-09-12 23:23:40 +12:00
|
|
|
self.verify_button.clicked.connect(self.verify)
|
|
|
|
|
2021-11-13 12:56:03 +13:00
|
|
|
self.verify_pool = QThreadPool()
|
|
|
|
self.verify_pool.setMaxThreadCount(2)
|
2022-02-26 06:43:27 +13:00
|
|
|
if self.args.offline:
|
2021-12-10 08:03:34 +13:00
|
|
|
self.repair_button.setDisabled(True)
|
|
|
|
else:
|
|
|
|
self.repair_button.clicked.connect(self.repair)
|
2021-11-11 10:07:28 +13:00
|
|
|
|
2022-01-19 09:46:12 +13:00
|
|
|
self.install_button.clicked.connect(lambda: self.game_utils.launch_game(self.game.app_name))
|
|
|
|
|
2021-11-17 10:54:23 +13:00
|
|
|
def uninstall(self):
|
|
|
|
if self.game_utils.uninstall_game(self.game.app_name):
|
|
|
|
self.game_utils.update_list.emit(self.game.app_name)
|
|
|
|
self.uninstalled.emit(self.game.app_name)
|
|
|
|
|
2021-09-12 23:23:40 +12:00
|
|
|
def repair(self):
|
2021-12-24 22:09:50 +13:00
|
|
|
repair_file = os.path.join(
|
|
|
|
self.core.lgd.get_tmp_path(), f"{self.game.app_name}.repair"
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
if not os.path.exists(repair_file):
|
2021-12-24 22:09:50 +13:00
|
|
|
QMessageBox.warning(
|
|
|
|
self,
|
|
|
|
"Warning",
|
|
|
|
self.tr(
|
|
|
|
"Repair file does not exist or game does not need a repair. Please verify game first"
|
|
|
|
),
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
return
|
2021-12-24 22:09:50 +13:00
|
|
|
self.signals.install_game.emit(
|
|
|
|
InstallOptionsModel(app_name=self.game.app_name, repair=True, update=True)
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
|
|
|
def verify(self):
|
2021-11-17 10:54:23 +13:00
|
|
|
if not os.path.exists(self.igame.install_path):
|
|
|
|
logger.error("Path does not exist")
|
2021-12-24 22:09:50 +13:00
|
|
|
QMessageBox.warning(
|
|
|
|
self,
|
|
|
|
"Warning",
|
|
|
|
self.tr("Installation path of {} does not exist. Cannot verify").format(
|
|
|
|
self.igame.title
|
|
|
|
),
|
|
|
|
)
|
2021-11-17 10:54:23 +13:00
|
|
|
return
|
2021-09-12 23:23:40 +12:00
|
|
|
self.verify_widget.setCurrentIndex(1)
|
2022-01-16 04:40:31 +13:00
|
|
|
verify_worker = VerifyWorker(self.game.app_name)
|
2021-11-11 10:07:28 +13:00
|
|
|
verify_worker.signals.status.connect(self.verify_staistics)
|
|
|
|
verify_worker.signals.summary.connect(self.finish_verify)
|
2021-09-12 23:23:40 +12:00
|
|
|
self.verify_progress.setValue(0)
|
2021-11-11 10:07:28 +13:00
|
|
|
self.verify_threads[self.game.app_name] = verify_worker
|
2021-11-23 08:09:05 +13:00
|
|
|
self.verify_pool.start(verify_worker)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2022-01-16 04:40:31 +13:00
|
|
|
def verify_staistics(self, num, total, app_name):
|
2021-09-12 23:23:40 +12:00
|
|
|
# checked, max, app_name
|
2022-01-16 04:40:31 +13:00
|
|
|
if app_name == self.game.app_name:
|
|
|
|
self.verify_progress.setValue(num * 100 // total)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2021-10-15 10:05:00 +13:00
|
|
|
def finish_verify(self, failed, missing, app_name):
|
|
|
|
if failed == missing == 0:
|
2021-12-24 22:09:50 +13:00
|
|
|
QMessageBox.information(
|
|
|
|
self,
|
|
|
|
"Summary",
|
|
|
|
"Game was verified successfully. No missing or corrupt files found",
|
|
|
|
)
|
2021-10-15 10:05:00 +13:00
|
|
|
igame = self.core.get_installed_game(app_name)
|
|
|
|
if igame.needs_verification:
|
|
|
|
igame.needs_verification = False
|
|
|
|
self.core.lgd.set_installed_game(self.igame.app_name, igame)
|
|
|
|
self.verification_finished.emit(igame)
|
2021-12-06 08:57:51 +13:00
|
|
|
elif failed == missing == -1:
|
|
|
|
QMessageBox.warning(self, "Warning", self.tr("Something went wrong"))
|
|
|
|
|
2021-09-12 23:23:40 +12:00
|
|
|
else:
|
2021-12-24 22:09:50 +13:00
|
|
|
ans = QMessageBox.question(
|
|
|
|
self,
|
|
|
|
"Summary",
|
|
|
|
self.tr(
|
|
|
|
"Verification failed, {} file(s) corrupted, {} file(s) are missing. Do you want to repair them?"
|
|
|
|
).format(failed, missing),
|
|
|
|
QMessageBox.Yes | QMessageBox.No,
|
|
|
|
QMessageBox.Yes,
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
if ans == QMessageBox.Yes:
|
2021-12-24 22:09:50 +13:00
|
|
|
self.signals.install_game.emit(
|
|
|
|
InstallOptionsModel(
|
|
|
|
app_name=self.game.app_name, repair=True, update=True
|
|
|
|
)
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
self.verify_widget.setCurrentIndex(0)
|
|
|
|
self.verify_threads.pop(app_name)
|
|
|
|
|
2021-12-06 08:11:11 +13:00
|
|
|
def update_game(self, app_name: str):
|
|
|
|
self.game = self.core.get_game(app_name)
|
|
|
|
self.igame = self.core.get_installed_game(self.game.app_name)
|
2021-12-24 22:09:50 +13:00
|
|
|
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2021-12-06 08:11:11 +13:00
|
|
|
pixmap = get_pixmap(self.game.app_name)
|
2021-12-20 09:32:18 +13:00
|
|
|
if pixmap.isNull():
|
|
|
|
pixmap = get_pixmap(self.parent().parent().parent().ue_name)
|
2021-09-12 23:23:40 +12:00
|
|
|
w = 200
|
|
|
|
pixmap = pixmap.scaled(w, int(w * 4 / 3))
|
|
|
|
self.image.setPixmap(pixmap)
|
|
|
|
|
|
|
|
self.app_name.setText(self.game.app_name)
|
2021-12-06 08:57:51 +13:00
|
|
|
if self.igame:
|
|
|
|
self.version.setText(self.igame.version)
|
|
|
|
else:
|
2021-12-24 22:09:50 +13:00
|
|
|
self.version.setText(
|
|
|
|
self.game.app_version(self.igame.platform if self.igame else "Windows")
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
self.dev.setText(self.game.metadata["developer"])
|
2021-10-15 10:05:00 +13:00
|
|
|
|
2021-09-16 08:16:50 +12:00
|
|
|
if self.igame:
|
|
|
|
self.install_size.setText(get_size(self.igame.install_size))
|
|
|
|
self.install_path.setText(self.igame.install_path)
|
|
|
|
self.install_size.setVisible(True)
|
|
|
|
self.install_path.setVisible(True)
|
2021-12-04 13:11:20 +13:00
|
|
|
self.platform.setText(self.igame.platform)
|
2021-09-16 08:16:50 +12:00
|
|
|
else:
|
|
|
|
self.install_size.setVisible(False)
|
|
|
|
self.install_path.setVisible(False)
|
2021-12-04 13:11:20 +13:00
|
|
|
self.platform.setText("Windows")
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2021-09-19 02:50:13 +12:00
|
|
|
if not self.igame:
|
|
|
|
# origin game
|
|
|
|
self.uninstall_button.setDisabled(True)
|
|
|
|
self.verify_button.setDisabled(True)
|
|
|
|
self.repair_button.setDisabled(True)
|
|
|
|
self.game_actions_stack.setCurrentIndex(1)
|
|
|
|
else:
|
|
|
|
self.uninstall_button.setDisabled(False)
|
|
|
|
self.verify_button.setDisabled(False)
|
2022-02-26 06:43:27 +13:00
|
|
|
if not self.args.offline:
|
2021-12-10 08:03:34 +13:00
|
|
|
self.repair_button.setDisabled(False)
|
2021-09-19 02:50:13 +12:00
|
|
|
self.game_actions_stack.setCurrentIndex(0)
|
|
|
|
|
2022-01-19 09:46:12 +13:00
|
|
|
try:
|
|
|
|
is_ue = self.core.get_asset(app_name).namespace == "ue"
|
|
|
|
except ValueError:
|
|
|
|
is_ue = False
|
2022-01-09 05:38:17 +13:00
|
|
|
self.grade.setVisible(not is_ue)
|
|
|
|
self.lbl_grade.setVisible(not is_ue)
|
|
|
|
|
|
|
|
if platform.system() != "Windows" and not is_ue:
|
2021-09-12 23:23:40 +12:00
|
|
|
self.grade.setText(self.tr("Loading"))
|
2021-12-06 08:11:11 +13:00
|
|
|
self.steam_worker.set_app_name(self.game.app_name)
|
2021-11-02 09:11:37 +13:00
|
|
|
QThreadPool.globalInstance().start(self.steam_worker)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2021-12-24 22:09:50 +13:00
|
|
|
if len(self.verify_threads.keys()) == 0 or not self.verify_threads.get(
|
2022-01-09 05:38:17 +13:00
|
|
|
self.game.app_name
|
2021-12-24 22:09:50 +13:00
|
|
|
):
|
2021-09-12 23:23:40 +12:00
|
|
|
self.verify_widget.setCurrentIndex(0)
|
2021-12-06 08:11:11 +13:00
|
|
|
elif self.verify_threads.get(self.game.app_name):
|
2021-09-12 23:23:40 +12:00
|
|
|
self.verify_widget.setCurrentIndex(1)
|
|
|
|
self.verify_progress.setValue(
|
2022-02-27 02:46:04 +13:00
|
|
|
int(self.verify_threads[self.game.app_name].num
|
|
|
|
/ self.verify_threads[self.game.app_name].total
|
|
|
|
* 100)
|
2021-09-12 23:23:40 +12:00
|
|
|
)
|