2021-05-29 06:34:34 +12:00
|
|
|
import os
|
|
|
|
from getpass import getuser
|
|
|
|
from logging import getLogger
|
|
|
|
|
|
|
|
from PyQt5.QtCore import pyqtSignal
|
2022-06-24 02:57:29 +12:00
|
|
|
from PyQt5.QtWidgets import QFrame, QFileDialog
|
2021-09-07 07:10:18 +12:00
|
|
|
from legendary.core import LegendaryCore
|
2022-10-27 08:36:16 +13:00
|
|
|
from legendary.lfs.wine_helpers import get_shell_folders, read_registry
|
2022-06-24 03:05:04 +12:00
|
|
|
|
2021-05-29 06:34:34 +12:00
|
|
|
from rare.ui.components.dialogs.login.import_login import Ui_ImportLogin
|
|
|
|
|
|
|
|
logger = getLogger("ImportLogin")
|
|
|
|
|
|
|
|
|
2022-06-24 02:57:29 +12:00
|
|
|
class ImportLogin(QFrame):
|
2021-05-29 06:34:34 +12:00
|
|
|
success = pyqtSignal()
|
|
|
|
changed = pyqtSignal()
|
|
|
|
if os.name == "nt":
|
|
|
|
localappdata = os.path.expandvars("%LOCALAPPDATA%")
|
|
|
|
else:
|
2022-06-24 03:05:04 +12:00
|
|
|
localappdata = os.path.join("drive_c/users", getuser(), "Local Settings/Application Data")
|
2022-09-02 07:49:09 +12:00
|
|
|
egl_appdata = os.path.join(localappdata, "EpicGamesLauncher", "Saved", "Config", "Windows")
|
2021-05-29 06:34:34 +12:00
|
|
|
found = False
|
|
|
|
|
|
|
|
def __init__(self, core: LegendaryCore, parent=None):
|
|
|
|
super(ImportLogin, self).__init__(parent=parent)
|
2022-06-24 02:57:29 +12:00
|
|
|
self.setFrameStyle(self.StyledPanel)
|
|
|
|
self.ui = Ui_ImportLogin()
|
|
|
|
self.ui.setupUi(self)
|
2021-05-29 06:34:34 +12:00
|
|
|
|
|
|
|
self.core = core
|
|
|
|
|
2022-06-24 03:05:04 +12:00
|
|
|
self.text_egl_found = self.tr("Found EGL Program Data. Click 'Next' to import them.")
|
2021-06-01 07:43:50 +12:00
|
|
|
self.text_egl_notfound = self.tr("Could not find EGL Program Data. ")
|
|
|
|
|
2021-05-29 06:34:34 +12:00
|
|
|
if os.name == "nt":
|
2022-09-02 07:49:09 +12:00
|
|
|
if not self.core.egl.appdata_path and os.path.exists(self.egl_appdata):
|
|
|
|
self.core.egl.appdata_path = self.egl_appdata
|
2021-05-29 06:34:34 +12:00
|
|
|
if not self.core.egl.appdata_path:
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.text_egl_notfound)
|
2021-05-29 06:34:34 +12:00
|
|
|
else:
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.text_egl_found)
|
2021-05-29 06:34:34 +12:00
|
|
|
self.found = True
|
|
|
|
else:
|
2022-09-02 08:48:30 +12:00
|
|
|
if programdata_path := self.core.egl.programdata_path:
|
2022-09-02 09:02:20 +12:00
|
|
|
if wine_pfx := programdata_path.split("drive_c")[0]:
|
|
|
|
self.ui.prefix_combo.addItem(wine_pfx)
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.info_label.setText(
|
2022-09-02 07:49:09 +12:00
|
|
|
self.tr("Please select the Wine prefix where Epic Games Launcher is installed. ")
|
2022-06-24 02:57:29 +12:00
|
|
|
+ self.ui.info_label.text()
|
2021-12-24 22:09:50 +13:00
|
|
|
)
|
2021-05-29 06:34:34 +12:00
|
|
|
prefixes = self.get_wine_prefixes()
|
|
|
|
if len(prefixes):
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.prefix_combo.addItems(prefixes)
|
2022-06-24 03:05:04 +12:00
|
|
|
self.ui.status_label.setText(self.tr("Select the Wine prefix you want to import."))
|
2021-05-29 06:34:34 +12:00
|
|
|
else:
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.text_egl_notfound)
|
2021-05-30 03:24:33 +12:00
|
|
|
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.prefix_tool.clicked.connect(self.prefix_path)
|
|
|
|
self.ui.prefix_combo.editTextChanged.connect(self.changed.emit)
|
2021-05-29 06:34:34 +12:00
|
|
|
|
|
|
|
def get_wine_prefixes(self):
|
|
|
|
possible_prefixes = [
|
|
|
|
os.path.expanduser("~/.wine"),
|
|
|
|
os.path.expanduser("~/Games/epic-games-store"),
|
|
|
|
]
|
|
|
|
prefixes = []
|
|
|
|
for prefix in possible_prefixes:
|
2022-09-02 07:49:09 +12:00
|
|
|
if os.path.exists(os.path.join(prefix, self.egl_appdata)):
|
2021-05-29 06:34:34 +12:00
|
|
|
prefixes.append(prefix)
|
|
|
|
return prefixes
|
|
|
|
|
2021-05-30 03:24:33 +12:00
|
|
|
def prefix_path(self):
|
2022-06-24 03:05:04 +12:00
|
|
|
prefix_dialog = QFileDialog(self, self.tr("Choose path"), os.path.expanduser("~/"))
|
2021-05-30 03:24:33 +12:00
|
|
|
prefix_dialog.setFileMode(QFileDialog.DirectoryOnly)
|
|
|
|
if prefix_dialog.exec_():
|
|
|
|
names = prefix_dialog.selectedFiles()
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.prefix_combo.setCurrentText(names[0])
|
2021-05-30 03:24:33 +12:00
|
|
|
|
2022-09-02 07:49:09 +12:00
|
|
|
def is_valid(self) -> bool:
|
2021-05-29 06:34:34 +12:00
|
|
|
if os.name == "nt":
|
|
|
|
return self.found
|
|
|
|
else:
|
2022-09-02 07:49:09 +12:00
|
|
|
egl_wine_pfx = self.ui.prefix_combo.currentText()
|
|
|
|
try:
|
|
|
|
wine_folders = get_shell_folders(read_registry(egl_wine_pfx), egl_wine_pfx)
|
|
|
|
self.egl_appdata = os.path.realpath(
|
|
|
|
os.path.join(wine_folders['Local AppData'], 'EpicGamesLauncher', 'Saved', 'Config', 'Windows'))
|
|
|
|
if path_exists := os.path.exists(self.egl_appdata):
|
|
|
|
self.ui.status_label.setText(self.text_egl_found)
|
|
|
|
return path_exists
|
|
|
|
except KeyError:
|
|
|
|
return False
|
2021-05-29 06:34:34 +12:00
|
|
|
|
|
|
|
def do_login(self):
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.tr("Loading..."))
|
2021-05-29 06:34:34 +12:00
|
|
|
if os.name == "nt":
|
|
|
|
pass
|
|
|
|
else:
|
2022-09-02 07:49:09 +12:00
|
|
|
logger.info(f'Using EGL appdata path at "{self.egl_appdata}"')
|
|
|
|
self.core.egl.appdata_path = self.egl_appdata
|
2021-05-29 06:34:34 +12:00
|
|
|
try:
|
|
|
|
if self.core.auth_import():
|
|
|
|
logger.info(f"Logged in as {self.core.lgd.userdata['displayName']}")
|
|
|
|
self.success.emit()
|
|
|
|
else:
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.tr("Login failed."))
|
2021-06-01 07:43:50 +12:00
|
|
|
logger.warning("Failed to import existing session.")
|
2021-05-29 06:34:34 +12:00
|
|
|
except Exception as e:
|
2022-06-24 02:57:29 +12:00
|
|
|
self.ui.status_label.setText(self.tr("Login failed. {}").format(str(e)))
|
2022-02-02 10:29:34 +13:00
|
|
|
logger.warning(f"Failed to import existing session: {e}")
|