using Microsoft.Extensions.Logging; using System; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Http.Json; using System.Threading; using System.Threading.Tasks; namespace FastGithub.Upgrade { /// /// 升级服务 /// sealed class UpgradeService { private readonly ILogger logger; private const string ReleasesUri = "https://api.github.com/repos/xljiulang/fastgithub/releases"; /// /// 升级服务 /// /// public UpgradeService(ILogger logger) { this.logger = logger; } /// /// 进行升级 /// /// /// public async Task UpgradeAsync(CancellationToken cancellationToken) { var currentVersion = ProductionVersion.GetApplicationVersion(); if (currentVersion == null) { return; } var lastRelease = await this.GetLastedReleaseAsync(cancellationToken); if (lastRelease == null) { return; } var lastedVersion = lastRelease.GetProductionVersion(); if (lastedVersion.CompareTo(currentVersion) > 0) { this.logger.LogInformation($"您正在使用{currentVersion}版本{Environment.NewLine}请前往{lastRelease.HtmlUrl}下载新版本"); this.logger.LogInformation(lastRelease.ToString()); } } /// /// 获取最新发布 /// /// public async Task GetLastedReleaseAsync(CancellationToken cancellationToken) { using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30d) }; httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*")); httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(nameof(FastGithub), "1.0")); var releases = await httpClient.GetFromJsonAsync(ReleasesUri, cancellationToken); return releases?.FirstOrDefault(item => item.Prerelease == false); } } }