using System.Net.Http.Headers; using System.Xml.Linq; namespace ChrisKaczor.ApplicationUpdate; public class VersionInfo { private static readonly HttpClient HttpClient = new() { DefaultRequestHeaders = { UserAgent = { ProductInfoHeaderValue.Parse(UpdateCheck.ApplicationName) } } }; public Version? Version { get; set; } public string? InstallFile { get; set; } public DateTimeOffset? InstallCreated { get; set; } public bool? Prerelease { get; set; } public static async Task Load(ServerType updateServerType, string url, string file, bool includePrerelease) { return updateServerType switch { ServerType.Generic => LoadFile(url, file, includePrerelease), ServerType.GitHub => await LoadGitHub(url, includePrerelease), _ => null }; } private static VersionInfo? LoadFile(string url, string file, bool includePrerelease) { try { if (includePrerelease) throw new NotSupportedException("Prerelease not currently supported for generic server type"); var document = XDocument.Load(url + file); var versionInformationElement = document.Element("versionInformation"); if (versionInformationElement == null) return null; var versionElement = versionInformationElement.Element("version"); var installFileElement = versionInformationElement.Element("installFile"); var installCreatedElement = versionInformationElement.Element("installCreated"); if (versionElement == null || installFileElement == null || installCreatedElement == null) return null; var versionInfo = new VersionInfo { Version = Version.Parse(versionElement.Value), InstallFile = installFileElement.Value, InstallCreated = DateTimeOffset.Parse(installCreatedElement.Value) }; return versionInfo; } catch (Exception) { return null; } } private static async Task LoadGitHub(string baseUrl, bool includePrerelease) { var versionInfo = includePrerelease ? await GitHubRelease.GetLatestPrereleaseAsync(baseUrl) : await GitHubRelease.GetLatestAsync(baseUrl); return versionInfo; } internal static VersionInfo? CreateFromGitHubRelease(GitHubRelease? release) { if (release?.TagName == null || release.Assets == null || release.Assets.Count == 0) return null; var versionInfo = new VersionInfo { Version = Version.Parse(release.TagName), InstallFile = release.Assets[0].BrowserDownloadUrl, InstallCreated = release.Assets[0].CreatedAt?.UtcDateTime, Prerelease = release.Prerelease }; return versionInfo; } }