Files
Launcher/app.py
T

156 lines
5.4 KiB
Python
Raw Normal View History

2026-07-10 23:27:21 +08:00
import logging
import textwrap
from pathlib import Path
2026-07-10 20:57:31 +08:00
2026-07-10 23:27:21 +08:00
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QDialog, QPlainTextEdit, \
2026-07-10 23:27:21 +08:00
QHBoxLayout
from core_lib.common.common import download_file, FileObject, download_multiple_files
2026-07-10 23:27:21 +08:00
from core_lib.qt.hack import move_window_to_center
from core_lib.game.version_info import get_version_manifest, get_latest_version, \
fetch_specific_version_manifest, find_useful_part_in_specific_version_manifest, get_core_file_download_url_and_hash
2026-07-10 20:57:31 +08:00
class Launcher(QApplication):
def __init__(self):
super().__init__()
self.setApplicationName("TestLauncher")
self.main_window = QMainWindow()
self.main_window.setGeometry(0, 0, 800, 600)
move_window_to_center(self.main_window)
2026-07-10 23:27:21 +08:00
self.logger = logging.getLogger("Launcher.MainWindow")
self.test_dialog = self.TestDialog(self.main_window)
self.test_dialog.show()
class TestDialog(QDialog):
def __init__(self, parent):
super().__init__(parent)
self.parent = parent
self.resize(800, 600)
self.setWindowFlags(self.windowFlags() | Qt.WindowType.WindowMaximizeButtonHint)
2026-07-10 23:27:21 +08:00
self.button = QPushButton("Fetch Version Data")
self.button.setObjectName("ActionButton")
self.button.clicked.connect(self.run_test)
self.button_2 = QPushButton("Download client")
self.button_2.setObjectName("ActionButton")
self.button_2.clicked.connect(self.run_download_client)
self.button_3 = QPushButton("Download libraries")
self.button_3.setObjectName("ActionButton")
self.button_3.clicked.connect(self.run_download_libraries)
2026-07-10 23:27:21 +08:00
self.output = QPlainTextEdit()
self.output.setReadOnly(True)
self.layout = QHBoxLayout()
self.layout.addWidget(self.output)
self.right_layout = QVBoxLayout()
self.right_layout.setObjectName("RightLayout")
self.right_layout.setAlignment(Qt.AlignmentFlag.AlignRight)
self.right_layout.addWidget(self.button)
self.right_layout.addWidget(self.button_2)
self.right_layout.addWidget(self.button_3)
2026-07-10 23:27:21 +08:00
self.right_layout.addStretch()
self.right_layout.setContentsMargins(0, 10, 0, 0)
self.layout.addLayout(self.right_layout)
self.setLayout(self.layout)
self.setStyleSheet(
textwrap.dedent("""
QPushButton#ActionButton {
padding: 6px 12px;
}
"""))
@property
def app(self):
return self.parent.parent
def run_test(self):
self.output.clear()
2026-07-10 23:27:21 +08:00
data = get_version_manifest()
ver = get_latest_version(data)
ver_data = fetch_specific_version_manifest(data, ver)
arguments, asset_index, downloads, java_version, libraries, main_class = (
find_useful_part_in_specific_version_manifest(ver_data))
content = textwrap.dedent(f"""\
Arguments: {arguments}\n
Asset: {asset_index}\n
Downloads: {downloads}\n
Java Version: {java_version}\n
Libraries: {libraries}\n
Main Class: {main_class}\n
""")
self.output.setPlainText(content)
def run_download_client(self):
self.output.clear()
data = get_version_manifest()
ver = get_latest_version(data)
ver_data = fetch_specific_version_manifest(data, ver)
url, sha1 = get_core_file_download_url_and_hash(ver_data)
dest = Path(Path(__file__).parent, "temp", f"client-{ver}.jar")
if url:
file = FileObject(dest, url=url)
download_file(file)
else:
self.output.setPlainText("Download URL not found.")
return
self.output.setPlainText("Client downloaded." if dest.exists() else "Client not found.")
def run_download_libraries(self):
self.output.clear()
def log_file_downloaded(filepath):
self.output.appendPlainText(f"Downloaded {filepath}.")
data = get_version_manifest()
ver = get_latest_version(data)
ver_data = fetch_specific_version_manifest(data, ver)
_, _, _, _, libraries, _ = find_useful_part_in_specific_version_manifest(ver_data)
output_dir = Path(Path(__file__).parent, "tmp", f"libraries-{ver}")
output_dir.mkdir(parents=True, exist_ok=True)
items = []
for library in libraries:
url = library.get("downloads", {}).get("artifact", {}).get("url")
sha1 = library.get("downloads", {}).get("artifact", {}).get("sha1")
relative_path = library.get("downloads", {}).get("artifact", {}).get("path")
full_path = output_dir / relative_path
if not url:
continue
file = FileObject(full_path, url=url, sha1=sha1)
items.append(file)
download_multiple_files(items, download_callback=log_file_downloaded)
2026-07-10 20:57:31 +08:00
def exec(self):
self.main_window.show()
2026-07-10 23:27:21 +08:00
self.exec_()