using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.Globalization; using System.Net.Http.Headers; using System.Text.RegularExpressions; namespace ChrisKaczor.ApplicationUpdate { public partial class GitHubRelease { private const string LatestSegment = "/latest"; private static readonly HttpClient HttpClient = new() { DefaultRequestHeaders = { UserAgent = { ProductInfoHeaderValue.Parse(UpdateCheck.ApplicationName.Replace(" ", "")) } } }; private static GitHubRelease? FromJson(string json) => JsonConvert.DeserializeObject(json, Converter.Settings); private static List? FromJsonArray(string json) => JsonConvert.DeserializeObject>(json, Converter.Settings); [JsonProperty("tag_name")] public string? TagName { get; set; } [JsonProperty("assets")] public List? Assets { get; set; } [JsonProperty("prerelease")] public bool Prerelease { get; set; } public static async Task GetLatestAsync(string baseUrl) { try { var url = baseUrl.EndsWith(LatestSegment) ? baseUrl : baseUrl + LatestSegment; var json = await HttpClient.GetStringAsync(url); var release = FromJson(json); var versionInfo = VersionInfo.CreateFromGitHubRelease(release); return versionInfo; } catch (Exception) { return null; } } public static async Task GetLatestPrereleaseAsync(string baseUrl) { try { var url = baseUrl.EndsWith(LatestSegment) ? baseUrl[..^LatestSegment.Length] : baseUrl; var json = await HttpClient.GetStringAsync(url); var releases = FromJsonArray(json); var release = releases?.FirstOrDefault(); if (release == null) return null; var versionInfo = VersionInfo.CreateFromGitHubRelease(release); return versionInfo; } catch (Exception) { return null; } } } public class Asset { [JsonProperty("created_at")] public DateTimeOffset? CreatedAt { get; set; } [JsonProperty("browser_download_url")] public string? BrowserDownloadUrl { get; set; } } internal class Converter { public static readonly JsonSerializerSettings Settings = new() { MetadataPropertyHandling = MetadataPropertyHandling.Ignore, DateParseHandling = DateParseHandling.None, Converters = { new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal } } }; } }