2021-03-18 02:16:33 +13:00
|
|
|
import logging
|
2021-03-19 00:45:59 +13:00
|
|
|
import os
|
2022-02-06 04:03:21 +13:00
|
|
|
import shutil
|
2021-03-25 05:01:12 +13:00
|
|
|
import sys
|
2021-09-11 08:41:30 +12:00
|
|
|
import traceback
|
2022-02-26 06:43:27 +13:00
|
|
|
from argparse import Namespace
|
2022-03-28 08:52:32 +13:00
|
|
|
from datetime import datetime
|
2022-06-19 06:45:36 +12:00
|
|
|
from typing import Optional
|
2021-03-18 02:16:33 +13:00
|
|
|
|
2022-04-13 11:07:48 +12:00
|
|
|
import requests.exceptions
|
2022-10-26 11:33:49 +13:00
|
|
|
from PyQt5.QtCore import QThreadPool, QTimer, pyqtSlot, Qt
|
2022-09-04 10:14:43 +12:00
|
|
|
from PyQt5.QtWidgets import QApplication, QMessageBox
|
2021-10-15 10:05:00 +13:00
|
|
|
from requests import HTTPError
|
2021-03-18 02:16:33 +13:00
|
|
|
|
2021-04-08 08:39:23 +12:00
|
|
|
from rare.components.dialogs.launch_dialog import LaunchDialog
|
|
|
|
from rare.components.main_window import MainWindow
|
2023-02-28 10:47:24 +13:00
|
|
|
from rare.shared import RareCore
|
2022-09-11 00:32:48 +12:00
|
|
|
from rare.utils import config_helper, paths
|
2023-03-06 09:21:49 +13:00
|
|
|
from rare.widgets.rare_app import RareApp, RareAppException
|
2021-03-18 02:16:33 +13:00
|
|
|
|
|
|
|
logger = logging.getLogger("Rare")
|
|
|
|
|
|
|
|
|
2023-03-06 09:21:49 +13:00
|
|
|
class RareException(RareAppException):
|
|
|
|
def __init__(self, parent=None):
|
|
|
|
super(RareException, self).__init__(parent=parent)
|
|
|
|
|
|
|
|
def _handler(self, exc_type, exc_value, exc_tb) -> bool:
|
|
|
|
if exc_type == HTTPError:
|
|
|
|
try:
|
|
|
|
if RareCore.instance() is not None:
|
|
|
|
if RareCore.instance().core().login():
|
|
|
|
return True
|
2021-10-15 10:05:00 +13:00
|
|
|
raise ValueError
|
2023-03-06 09:21:49 +13:00
|
|
|
except Exception as e:
|
|
|
|
logger.fatal(str(e))
|
|
|
|
QMessageBox.warning(None, "Error", self.tr("Failed to login"))
|
|
|
|
QApplication.exit(1)
|
|
|
|
return False
|
2021-09-11 08:41:30 +12:00
|
|
|
|
|
|
|
|
2023-03-06 09:21:49 +13:00
|
|
|
class Rare(RareApp):
|
2022-02-26 06:43:27 +13:00
|
|
|
def __init__(self, args: Namespace):
|
2022-09-08 23:58:11 +12:00
|
|
|
log_file = "Rare_{0}.log"
|
2023-03-06 09:21:49 +13:00
|
|
|
super(Rare, self).__init__(args, log_file)
|
|
|
|
self._hook.deleteLater()
|
|
|
|
self._hook = RareException(self)
|
2023-02-28 10:47:24 +13:00
|
|
|
self.rcore = RareCore(args=args)
|
|
|
|
self.args = RareCore.instance().args()
|
|
|
|
self.signals = RareCore.instance().signals()
|
|
|
|
self.core = RareCore.instance().core()
|
2022-09-05 05:38:24 +12:00
|
|
|
|
|
|
|
config_helper.init_config_handler(self.core)
|
2021-03-27 06:23:22 +13:00
|
|
|
|
2022-06-24 07:26:08 +12:00
|
|
|
lang = self.settings.value("language", self.core.language_code, type=str)
|
|
|
|
self.load_translator(lang)
|
|
|
|
|
2021-04-05 20:57:11 +12:00
|
|
|
# set Application name for settings
|
2022-09-11 02:27:37 +12:00
|
|
|
self.main_window: Optional[MainWindow] = None
|
2022-09-04 10:14:43 +12:00
|
|
|
self.launch_dialog: Optional[LaunchDialog] = None
|
2022-09-11 03:07:32 +12:00
|
|
|
self.timer: Optional[QTimer] = None
|
2021-09-30 10:22:47 +13:00
|
|
|
|
2021-04-05 20:57:11 +12:00
|
|
|
# launch app
|
2022-09-02 00:13:58 +12:00
|
|
|
self.launch_dialog = LaunchDialog(parent=None)
|
2021-06-08 08:12:26 +12:00
|
|
|
self.launch_dialog.quit_app.connect(self.launch_dialog.close)
|
2022-09-11 00:32:48 +12:00
|
|
|
self.launch_dialog.quit_app.connect(lambda x: sys.exit(x))
|
2021-03-25 05:01:12 +13:00
|
|
|
self.launch_dialog.start_app.connect(self.start_app)
|
2021-06-08 08:12:26 +12:00
|
|
|
self.launch_dialog.start_app.connect(self.launch_dialog.close)
|
2021-04-20 01:44:28 +12:00
|
|
|
|
2021-12-10 08:03:34 +13:00
|
|
|
self.launch_dialog.login()
|
2021-03-25 05:01:12 +13:00
|
|
|
|
2022-09-11 03:07:32 +12:00
|
|
|
def poke_timer(self):
|
2022-03-28 08:52:32 +13:00
|
|
|
dt_exp = datetime.fromisoformat(self.core.lgd.userdata['expires_at'][:-1])
|
|
|
|
dt_now = datetime.utcnow()
|
|
|
|
td = abs(dt_exp - dt_now)
|
2022-04-13 11:07:48 +12:00
|
|
|
self.timer.start(int(td.total_seconds() - 60) * 1000)
|
2022-10-23 02:07:58 +13:00
|
|
|
logger.info(f"Renewed session expires at {self.core.lgd.userdata['expires_at']}")
|
2022-03-28 08:52:32 +13:00
|
|
|
|
|
|
|
def re_login(self):
|
|
|
|
logger.info("Session expires shortly. Renew session")
|
2022-04-13 11:07:48 +12:00
|
|
|
try:
|
|
|
|
self.core.login()
|
|
|
|
except requests.exceptions.ConnectionError:
|
|
|
|
self.timer.start(3000) # try again if no connection
|
|
|
|
return
|
2022-09-11 03:07:32 +12:00
|
|
|
self.poke_timer()
|
2022-03-28 08:52:32 +13:00
|
|
|
|
2021-10-08 07:19:24 +13:00
|
|
|
def start_app(self):
|
2022-09-11 03:07:32 +12:00
|
|
|
self.timer = QTimer()
|
|
|
|
self.timer.timeout.connect(self.re_login)
|
|
|
|
self.poke_timer()
|
|
|
|
|
2022-09-11 02:27:37 +12:00
|
|
|
self.main_window = MainWindow()
|
2022-10-24 02:06:54 +13:00
|
|
|
self.main_window.exit_app.connect(self.on_exit_app)
|
2021-03-18 02:16:33 +13:00
|
|
|
|
2021-04-18 06:00:15 +12:00
|
|
|
if not self.args.silent:
|
2022-09-11 02:27:37 +12:00
|
|
|
self.main_window.show()
|
2021-12-10 08:03:34 +13:00
|
|
|
|
2022-02-26 06:43:27 +13:00
|
|
|
if self.args.test_start:
|
2022-10-23 02:07:58 +13:00
|
|
|
self.main_window.close()
|
|
|
|
self.main_window = None
|
2022-10-24 02:06:54 +13:00
|
|
|
self.on_exit_app(0)
|
2021-12-11 12:18:57 +13:00
|
|
|
|
2022-10-23 02:07:58 +13:00
|
|
|
@pyqtSlot()
|
|
|
|
@pyqtSlot(int)
|
2022-10-24 02:06:54 +13:00
|
|
|
def on_exit_app(self, exit_code=0):
|
2021-10-21 06:19:03 +13:00
|
|
|
threadpool = QThreadPool.globalInstance()
|
|
|
|
threadpool.waitForDone()
|
2022-09-02 09:20:04 +12:00
|
|
|
if self.timer is not None:
|
|
|
|
self.timer.stop()
|
|
|
|
self.timer.deleteLater()
|
|
|
|
self.timer = None
|
2023-02-28 10:47:24 +13:00
|
|
|
self.rcore.deleteLater()
|
|
|
|
del self.rcore
|
2021-06-08 08:12:26 +12:00
|
|
|
self.processEvents()
|
2022-09-08 10:27:37 +12:00
|
|
|
shutil.rmtree(paths.tmp_dir())
|
|
|
|
os.makedirs(paths.tmp_dir())
|
2022-02-06 04:03:21 +13:00
|
|
|
|
2021-06-08 08:12:26 +12:00
|
|
|
self.exit(exit_code)
|
|
|
|
|
2021-03-25 05:01:12 +13:00
|
|
|
|
2021-04-09 21:36:27 +12:00
|
|
|
def start(args):
|
2021-04-07 21:50:35 +12:00
|
|
|
while True:
|
2022-10-26 11:33:49 +13:00
|
|
|
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
|
|
|
|
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
|
2023-03-06 09:21:49 +13:00
|
|
|
app = Rare(args)
|
2021-04-07 21:50:35 +12:00
|
|
|
exit_code = app.exec_()
|
|
|
|
# if not restart
|
|
|
|
# restart app
|
2021-09-13 09:28:54 +12:00
|
|
|
del app
|
2021-06-08 08:12:26 +12:00
|
|
|
if exit_code != -133742:
|
|
|
|
break
|