using FastGithub.Configuration; using FastGithub.DomainResolve; using FastGithub.Http; using Microsoft.Extensions.Logging; using System; using System.Linq; using System.Net.Http.Json; using System.Threading; using System.Threading.Tasks; namespace FastGithub.Upgrade { /// /// 升级服务 /// public class UpgradeService { private readonly IDomainResolver domainResolver; private readonly ILogger logger; private readonly Uri releasesUri = new("https://api.github.com/repos/xljiulang/fastgithub/releases"); /// /// 升级服务 /// /// /// public UpgradeService( IDomainResolver domainResolver, ILogger logger) { this.domainResolver = domainResolver; this.logger = logger; } /// /// 进行升级 /// /// /// public async Task UpgradeAsync(CancellationToken cancellationToken) { var currentVersion = ProductionVersion.GetAppVersion(); 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()); } else { this.logger.LogInformation($"当前版本{currentVersion}已经是最新版本"); } } /// /// 获取最新发布 /// /// public async Task GetLastedReleaseAsync(CancellationToken cancellationToken) { var domainConfig = new DomainConfig { TlsSni = false, TlsIgnoreNameMismatch = true, Timeout = TimeSpan.FromSeconds(30d) }; using var request = new GithubRequestMessage { RequestUri = this.releasesUri }; using var httpClient = new HttpClient(domainConfig, this.domainResolver); var response = await httpClient.SendAsync(request, cancellationToken); var releases = await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken); return releases?.FirstOrDefault(item => item.Prerelease == false); } } }