using System; using System.Globalization; using System.Linq; using System.Net; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; namespace PixiEditor.UpdateModule { public class UpdateChecker { public UpdateChecker(string currentVersionTag, UpdateChannel channel) { CurrentVersionTag = currentVersionTag; Channel = channel; } public ReleaseInfo LatestReleaseInfo { get; private set; } public UpdateChannel Channel { get; set; } public string CurrentVersionTag { get; } /// /// Compares version strings and returns true if newVer > originalVer. /// /// Version to compare. /// Version to compare with. /// True if semantic version is higher. public static bool VersionBigger(string originalVer, string newVer) { if (!ParseVersionString(originalVer, out float ver1)) { return false; } if (ParseVersionString(newVer, out float ver2)) { return ver2 > ver1; } return false; } public async Task CheckUpdateAvailable() { LatestReleaseInfo = await GetLatestReleaseInfoAsync(Channel.ApiUrl); return CheckUpdateAvailable(LatestReleaseInfo); } public bool CheckUpdateAvailable(ReleaseInfo latestRelease) { return latestRelease.WasDataFetchSuccessful && VersionBigger(CurrentVersionTag, latestRelease.TagName); } public bool IsUpdateCompatible(string[] incompatibleVersions) { return !incompatibleVersions.Select(x => x.Trim()).Contains(CurrentVersionTag[..7].Trim()); } public async Task IsUpdateCompatible() { string[] incompatibleVersions = await GetUpdateIncompatibleVersionsAsync(LatestReleaseInfo.TagName); return IsUpdateCompatible(incompatibleVersions); } public async Task GetUpdateIncompatibleVersionsAsync(string tag) { using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Add("User-Agent", "PixiEditor"); HttpResponseMessage response = await client.GetAsync(string.Format(Channel.IncompatibleFileApiUrl, tag)); if (response.StatusCode == HttpStatusCode.OK) { string content = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(content); } } return Array.Empty(); } private static async Task GetLatestReleaseInfoAsync(string apiUrl) { using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Add("User-Agent", "PixiEditor"); HttpResponseMessage response = await client.GetAsync(apiUrl); if (response.StatusCode == HttpStatusCode.OK) { string content = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(content); } } return new ReleaseInfo(false); } private static bool ParseVersionString(string versionString, out float version) { return float.TryParse(versionString[..7].Replace(".", string.Empty).Insert(1, "."), NumberStyles.Any, CultureInfo.InvariantCulture, out version); } } }