diff --git a/app.py b/app.py index d4ad845..5bd3196 100644 --- a/app.py +++ b/app.py @@ -5,7 +5,7 @@ from PySide6.QtCore import Qt from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QDialog, QPlainTextEdit, \ QHBoxLayout from core_lib.qt.hack import move_window_to_center -from core_lib.unclassified import get_latest_version, get_version_manifest, get_specific_version_manifest_url, \ +from core_lib.game.version_info import get_version_manifest, get_latest_version, get_specific_version_manifest_url, \ fetch_specific_version_manifest, find_useful_part_in_specific_version_manifest diff --git a/core_lib/__init__.py b/core_lib/__init__.py index 541f859..44f7b31 100644 --- a/core_lib/__init__.py +++ b/core_lib/__init__.py @@ -1 +1,6 @@ -__version__ = '0.1.0' \ No newline at end of file +__version__ = '0.1.0' +__description__ = """ +The core library of the *Launcher* + +Some reference implementation are from bk_core. +""" \ No newline at end of file diff --git a/core_lib/game/version_info.py b/core_lib/game/version_info.py new file mode 100644 index 0000000..c5a99bd --- /dev/null +++ b/core_lib/game/version_info.py @@ -0,0 +1,124 @@ +import json +import requests + +from .core_init import logger + +MOJANG_VERSION_MANIFEST_V2 = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json" + + +def get_version_manifest(manifest_url=MOJANG_VERSION_MANIFEST_V2, timeout=10) -> dict | None: + logger.debug("Getting version manifest from {}".format(manifest_url)) + + try: + r = requests.get(manifest_url, timeout=timeout) + except requests.exceptions.RequestException as e: + logger.error("Error getting version manifest from {}".format(manifest_url)) + logger.error("Exception: {}".format(e)) + return None + + try: + data = r.json() + logger.debug("VersionManifest: {}".format(json.dumps(data, indent=4))) + return data + except ValueError as e: + logger.error("Unable to deserialize response data into dictionary.") + logger.error("URL: {}".format(manifest_url)) + logger.error("Exception: {}".format(e)) + return None + + +def get_latest_version(version_manifest: dict, is_snapshot=False) -> None | str: + latest = version_manifest.get("latest", {}) + + if len(latest) == 0: + logger.debug("No latest version section available in version manifest.") + logger.debug("Data: {}".format(json.dumps(version_manifest, indent=4))) + return None + + latest_ver = latest.get("release" if not is_snapshot else "snapshot", None) + + if latest_ver is None: + logger.debug("No latest version available.") + else: + logger.debug("Latest version: {}".format(latest_ver)) + + return latest_ver + + +def get_specific_version_manifest_url(version_manifest: dict, + version_id: str, is_snapshot=False) -> str | None: + versions = version_manifest.get("versions", []) + + if len(versions) == 0: + logger.debug("No version section available in version manifest.") + return None + + ver_type = "release" if not is_snapshot else "snapshot" + versions = [version for version in versions if version.get("type") == ver_type] + + for version in versions: + if version.get("id") == version_id: + specific_ver_manifest_url = version.get("url", None) + + if specific_ver_manifest_url is None: + logger.debug("Specific version manifest URL not available in version manifest.") + return None + + return specific_ver_manifest_url + + logger.debug("No version section available in version manifest.") + + return None + + +def fetch_specific_version_manifest(version_manifest: dict, spec_version: str) -> dict | None: + ver_url = get_specific_version_manifest_url(version_manifest, spec_version) + + if ver_url is None: + logger.debug("Unable to get specific version manifest url from version manifest.\n" + "Version: {}".format(spec_version)) + return None + + try: + r = requests.get(ver_url, timeout=10) + except requests.exceptions.RequestException as e: + logger.error("Error getting version manifest from {}".format(ver_url)) + logger.error("Exception: {}".format(e)) + return None + + try: + data = r.json() + logger.debug("SpecificVersionManifest: {}".format(json.dumps(data, indent=4))) + return data + except ValueError as e: + logger.error("Unable to deserialize response data into dictionary.") + + +def find_useful_part_in_specific_version_manifest(spec_version_manifest: dict)\ + -> tuple[dict | None, dict | None, dict | None, dict | None, list | None, str | None]: + arguments = spec_version_manifest.get("arguments", {}) + asset_index = spec_version_manifest.get("assetIndex", {}) + downloads = spec_version_manifest.get("downloads", {}) + java_version = spec_version_manifest.get("java_version", {}) + libraries = spec_version_manifest.get("libraries", []) + main_class = spec_version_manifest.get("mainClass", None) + + if len(arguments) == 0: + logger.debug("No arguments section available in version manifest.") + + if len(asset_index) == 0: + logger.debug("No asset index section available in version manifest.") + + if len(downloads) == 0: + logger.debug("No downloads section available in version manifest.") + + if len(java_version) == 0: + logger.debug("No java version section available in version manifest.") + + if len(libraries) == 0: + logger.debug("No libraries section available in version manifest.") + + if main_class is None: + logger.debug("No main class section available in version manifest.") + + return arguments, asset_index, downloads, java_version, libraries, main_class diff --git a/core_lib/unclassified.py b/core_lib/unclassified.py index e1b5eba..b28b04f 100644 --- a/core_lib/unclassified.py +++ b/core_lib/unclassified.py @@ -1,121 +1,3 @@ -import json - -import requests -from .core_init import logger - -MOJANG_VERSION_MANIFEST_V2 = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json" - -def get_version_manifest(manifest_url=MOJANG_VERSION_MANIFEST_V2, timeout=10) -> dict | None: - logger.debug("Getting version manifest from {}".format(manifest_url)) - - try: - r = requests.get(manifest_url, timeout=timeout) - except requests.exceptions.RequestException as e: - logger.error("Error getting version manifest from {}".format(manifest_url)) - logger.error("Exception: {}".format(e)) - return None - - try: - data = r.json() - logger.debug("VersionManifest: {}".format(json.dumps(data, indent=4))) - return data - except ValueError as e: - logger.error("Unable to deserialize response data into dictionary.") - logger.error("URL: {}".format(manifest_url)) - logger.error("Exception: {}".format(e)) - return None - -def get_latest_version(version_manifest: dict, is_snapshot=False) -> None | str: - latest = version_manifest.get("latest", {}) - - if len(latest) == 0: - logger.debug("No latest version section available in version manifest.") - logger.debug("Data: {}".format(json.dumps(version_manifest, indent=4))) - return None - - latest_ver = latest.get("release" if not is_snapshot else "snapshot", None) - - if latest_ver is None: - logger.debug("No latest version available.") - else: - logger.debug("Latest version: {}".format(latest_ver)) - - return latest_ver - -def get_specific_version_manifest_url(version_manifest: dict, - version_id: str, is_snapshot=False) -> str | None: - versions = version_manifest.get("versions", []) - - if len(versions) == 0: - logger.debug("No version section available in version manifest.") - return None - - ver_type = "release" if not is_snapshot else "snapshot" - versions = [version for version in versions if version.get("type") == ver_type] - - for version in versions: - if version.get("id") == version_id: - specific_ver_manifest_url = version.get("url", None) - - if specific_ver_manifest_url is None: - logger.debug("Specific version manifest URL not available in version manifest.") - return None - - return specific_ver_manifest_url - - logger.debug("No version section available in version manifest.") - - return None - -def fetch_specific_version_manifest(version_manifest: dict, spec_version: str) -> dict | None: - ver_url = get_specific_version_manifest_url(version_manifest, spec_version) - - if ver_url is None: - logger.debug("Unable to get specific version manifest url from version manifest.\n" - "Version: {}".format(spec_version)) - return None - - try: - r = requests.get(ver_url, timeout=10) - except requests.exceptions.RequestException as e: - logger.error("Error getting version manifest from {}".format(ver_url)) - logger.error("Exception: {}".format(e)) - return None - - try: - data = r.json() - logger.debug("SpecificVersionManifest: {}".format(json.dumps(data, indent=4))) - return data - except ValueError as e: - logger.error("Unable to deserialize response data into dictionary.") -def find_useful_part_in_specific_version_manifest(spec_version_manifest: dict)\ - -> tuple[dict | None, dict | None, dict | None, dict | None, list | None, str | None]: - arguments = spec_version_manifest.get("arguments", {}) - asset_index = spec_version_manifest.get("assetIndex", {}) - downloads = spec_version_manifest.get("downloads", {}) - java_version = spec_version_manifest.get("java_version", {}) - libraries = spec_version_manifest.get("libraries", []) - main_class = spec_version_manifest.get("mainClass", None) - - if len(arguments) == 0: - logger.debug("No arguments section available in version manifest.") - - if len(asset_index) == 0: - logger.debug("No asset index section available in version manifest.") - - if len(downloads) == 0: - logger.debug("No downloads section available in version manifest.") - - if len(java_version) == 0: - logger.debug("No java version section available in version manifest.") - - if len(libraries) == 0: - logger.debug("No libraries section available in version manifest.") - - if main_class is None: - logger.debug("No main class section available in version manifest.") - - return arguments, asset_index, downloads, java_version, libraries, main_class