mirror of
https://github.com/ckaczor/ChrisKaczor.ApplicationUpdate.git
synced 2026-01-13 17:22:16 -05:00
83 lines
2.9 KiB
C#
83 lines
2.9 KiB
C#
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<VersionInfo?> 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<VersionInfo?> 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;
|
|
}
|
|
} |