/* ┌──────────────────────────────────────────────────────────────────┐ │ Author: Ivan Murzak (https://github.com/IvanMurzak) │ │ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │ │ Copyright (c) 2025 Ivan Murzak │ │ Licensed under the Apache License, Version 2.0. │ │ See the LICENSE file in the project root for more information. │ └──────────────────────────────────────────────────────────────────┘ */ #nullable enable using System; using System.Net.Http; using UnityEngine; using com.IvanMurzak.Unity.MCP.Installer.SimpleJSON; namespace com.IvanMurzak.Unity.MCP.Installer { public static partial class Installer { const int OpenUpmTimeoutMs = 5000; static string OpenUpmPackageUrl => $"https://package.openupm.com/{PackageId}"; /// /// Queries OpenUPM for the latest available version of the package. /// Returns the highest version that is less than or equal to the hardcoded Version constant, /// or null on failure. /// internal static string? GetLatestAvailableVersion() { try { using var client = new HttpClient(); client.Timeout = TimeSpan.FromMilliseconds(OpenUpmTimeoutMs); var response = client.GetStringAsync(OpenUpmPackageUrl).Result; var result = ParseBestVersion(response, Version); if (result != null) Debug.Log($"[Installer] OpenUPM latest available version: {result}"); else Debug.LogWarning($"[Installer] No suitable version found on OpenUPM, using hardcoded version {Version}"); return result; } catch (Exception ex) { Debug.LogWarning($"[Installer] Failed to query OpenUPM, using hardcoded version {Version}: {ex.Message}"); return null; } } /// /// Parses an OpenUPM registry JSON response and returns the highest available version /// that is less than or equal to . /// Returns null if no suitable version is found or if parsing fails. /// internal static string? ParseBestVersion(string jsonResponse, string maxVersion) { if (string.IsNullOrEmpty(jsonResponse) || string.IsNullOrEmpty(maxVersion)) return null; try { var json = JSONObject.Parse(jsonResponse); if (json == null) return null; var versions = json["versions"]; if (versions == null) return null; var targetVersion = new System.Version(maxVersion); string? bestVersion = null; System.Version? bestParsed = null; foreach (var kvp in versions.Linq) { var key = kvp.Key; if (string.IsNullOrEmpty(key)) continue; System.Version parsed; try { parsed = new System.Version(key); } catch { continue; } if (parsed > targetVersion) continue; if (bestParsed == null || parsed > bestParsed) { bestParsed = parsed; bestVersion = key; } } return bestVersion; } catch { return null; } } } }