diff --git a/RELEASE_README.md b/RELEASE_README.md index 03f628e..cc33853 100644 --- a/RELEASE_README.md +++ b/RELEASE_README.md @@ -1,6 +1,6 @@ # PristonTale EU for Linux -Version 0.5.1 installs, updates, repairs, and launches PristonTale EU through a +Version 0.5.2 installs, updates, repairs, and launches PristonTale EU through a native Linux dashboard. Game files come directly from the publisher and are not included in this archive. @@ -9,9 +9,9 @@ included in this archive. Keep the archive and checksum file together, then run: ```text -sha256sum -c pristontale-eu-linux-installer-v0-5-1.tar.gz.sha256 -tar -xzf pristontale-eu-linux-installer-v0-5-1.tar.gz -cd pristontale-eu-linux-installer-v0-5-1 +sha256sum -c pristontale-eu-linux-installer-v0-5-2.tar.gz.sha256 +tar -xzf pristontale-eu-linux-installer-v0-5-2.tar.gz +cd pristontale-eu-linux-installer-v0-5-2 ./install.sh ``` @@ -48,6 +48,7 @@ for rollback. pristontale-eu --help Show all commands and options pristontale-eu gui Open the native dashboard pristontale-eu doctor Check required host components +pristontale-eu login-diagnostics Check the login route without credentials pristontale-eu update Install or update official files pristontale-eu update --repair Verify and repair every game file pristontale-eu update --dry-run Preview an update diff --git a/dist/pristontale-eu-linux-installer-v0-5-2.tar.gz.sha256 b/dist/pristontale-eu-linux-installer-v0-5-2.tar.gz.sha256 new file mode 100644 index 0000000..e5b70d6 --- /dev/null +++ b/dist/pristontale-eu-linux-installer-v0-5-2.tar.gz.sha256 @@ -0,0 +1 @@ +cd0314c9fba1779dac5bbe24190c174941dbed89c371b68808fefa37de7750bf pristontale-eu-linux-installer-v0-5-2.tar.gz diff --git a/dist/pristontale-eu-linux-installer-v0-5-2.zip b/dist/pristontale-eu-linux-installer-v0-5-2.zip new file mode 100644 index 0000000..96e7ccd Binary files /dev/null and b/dist/pristontale-eu-linux-installer-v0-5-2.zip differ diff --git a/dist/pristontale-eu-linux-update-v0.5.2.tar.gz b/dist/pristontale-eu-linux-update-v0.5.2.tar.gz new file mode 100644 index 0000000..c29e0d9 Binary files /dev/null and b/dist/pristontale-eu-linux-update-v0.5.2.tar.gz differ diff --git a/dist/pristontale-eu-linux-update-v0.5.2.tar.gz.sha256 b/dist/pristontale-eu-linux-update-v0.5.2.tar.gz.sha256 new file mode 100644 index 0000000..aa441a9 --- /dev/null +++ b/dist/pristontale-eu-linux-update-v0.5.2.tar.gz.sha256 @@ -0,0 +1 @@ +e391accd5448f3239aeda2561e5faf2eb17b5aa5c61837da609f456815398002 pristontale-eu-linux-update-v0.5.2.tar.gz diff --git a/dist/stable.json b/dist/stable.json new file mode 100644 index 0000000..1eb95e9 --- /dev/null +++ b/dist/stable.json @@ -0,0 +1,11 @@ +{ + "archive_sha256": "e391accd5448f3239aeda2561e5faf2eb17b5aa5c61837da609f456815398002", + "archive_size": 71737, + "archive_url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/download/v0.5.2/pristontale-eu-linux-update-v0.5.2.tar.gz", + "channel": "stable", + "minimum_updater_version": "0.5.0", + "notes_url": "https://git.m4ko.net/m4ko/pristontale-eu-linux/releases/tag/v0.5.2", + "published_at": "2026-08-27T19:01:33Z", + "schema": 1, + "version": "0.5.2" +} diff --git a/dist/stable.json.sig b/dist/stable.json.sig new file mode 100644 index 0000000..ed9fc16 Binary files /dev/null and b/dist/stable.json.sig differ diff --git a/install.sh b/install.sh index 39f8cfe..8c9db8b 100755 --- a/install.sh +++ b/install.sh @@ -3,7 +3,7 @@ set -euo pipefail SOURCE_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -VERSION="${PTLINUX_VERSION:-0.5.1}" +VERSION="${PTLINUX_VERSION:-0.5.2}" if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] then printf 'Invalid launcher version: %s (expected X.Y.Z)\n' "$VERSION" >&2 diff --git a/ptlinux/__init__.py b/ptlinux/__init__.py index 674ea39..693a43d 100644 --- a/ptlinux/__init__.py +++ b/ptlinux/__init__.py @@ -4,4 +4,4 @@ from .paths import AppPaths __all__ = ["AppPaths", "__version__"] -__version__ = "0.5.1" +__version__ = "0.5.2" diff --git a/ptlinux/cli.py b/ptlinux/cli.py index 1a3ef16..4119670 100644 --- a/ptlinux/cli.py +++ b/ptlinux/cli.py @@ -25,6 +25,7 @@ from .launcher import ( prepare_launcher_binary, ) from .locking import launcher_operation_lock +from .login_diagnostics import inspect_login_environment from .overlay import cache_compatibility_binaries, cache_runtime_patch, prepare_runtime_view from .paths import AppPaths from .runtime import ( @@ -56,6 +57,16 @@ def build_parser() -> argparse.ArgumentParser: subparsers.add_parser("gui", help="open the native Linux dashboard") subparsers.add_parser("doctor", help="check cross-distribution dependencies") + login_diagnostics = subparsers.add_parser( + "login-diagnostics", + help="check the client, runtime, and publisher login route without credentials", + ) + login_diagnostics.add_argument( + "--timeout", + type=float, + default=5.0, + help="TCP connection timeout in seconds (default: 5)", + ) fetch = subparsers.add_parser("fetch", help="fetch and safely prepare the latest official launcher") fetch.add_argument("--dry-run", action="store_true") @@ -169,6 +180,8 @@ def main(argv: Sequence[str] | None = None) -> int: return 0 if command == "doctor": return _doctor(arguments.json) + if command == "login-diagnostics": + return _login_diagnostics(paths, arguments.timeout, arguments.json) if command == "fetch": return _fetch(paths, arguments.dry_run, arguments.json) if command == "setup": @@ -274,6 +287,48 @@ def _doctor(as_json: bool) -> int: return 0 if report.ok else 1 +def _login_diagnostics(paths: AppPaths, timeout_seconds: float, as_json: bool) -> int: + settings = _load_or_default_settings(paths, persist=False) + report = inspect_login_environment( + paths, + settings, + timeout_seconds=timeout_seconds, + ) + if as_json: + _print_json(report.to_dict()) + else: + probe = report.login_server + print(f"Launcher: {report.launcher_version} ({report.launcher_module})") + print(f"Python: {report.python_executable}") + status = "REACHABLE" if probe.reachable else "UNREACHABLE" + latency = f", {probe.latency_ms:.1f} ms" if probe.latency_ms is not None else "" + print(f"Login server: {status} ({probe.host}:{probe.port}{latency})") + if probe.error: + print(f"Network error: {probe.error}") + print("Authentication: not tested; no credentials or game-protocol data were sent") + print(f"Game profile: {report.game_profile}") + print(f"Game.exe: {report.game_exe}") + if report.game_exe_sha256: + print(f"Game SHA-256: {report.game_exe_sha256}") + print(f"game.dll: {report.game_dll}") + if report.game_dll_sha256: + print(f"DLL SHA-256: {report.game_dll_sha256}") + if report.runtime_kind: + print(f"Runtime: {report.runtime_kind} ({report.runtime_path or 'unknown path'})") + else: + print(f"Runtime: unavailable ({report.runtime_error or 'selection failed'})") + prefix_status = "ready" if report.prefix_ready else "not ready" + directx_status = "ready" if report.directx_ready else "not ready" + print(f"Prefix: {prefix_status}; DirectX helpers {directx_status}") + print(f"Prefix path: {report.prefix or 'unavailable'}") + print(f"Latest log: {report.latest_game_log or 'not found'}") + if report.latest_game_log_modified_at: + print(f"Log modified: {report.latest_game_log_modified_at}") + for warning in report.warnings: + print(f"Warning: {warning}") + return 0 if report.preflight_ok else 1 + + def _fetch(paths: AppPaths, dry_run: bool, as_json: bool) -> int: if not dry_run: paths.create_base_directories() diff --git a/pyproject.toml b/pyproject.toml index c7ef932..4f1436c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ptdiag" -version = "0.5.1" +version = "0.5.2" description = "PristonTale EU Linux installer, clean launcher, and diagnostic harness" requires-python = ">=3.11" dependencies = []