BililiveRecorder/BililiveRecorder.WPF/Update.cs
2022-07-01 18:53:05 +08:00

88 lines
3.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Threading.Tasks;
using Serilog;
using Squirrel;
#nullable enable
namespace BililiveRecorder.WPF
{
internal class Update
{
private readonly ILogger logger;
private Task updateInProgress = Task.CompletedTask;
public Update(ILogger logger)
{
this.logger = logger.ForContext<Update>();
}
public async Task UpdateAsync()
{
if (!this.updateInProgress.IsCompleted)
await this.updateInProgress;
this.updateInProgress = this.RealUpdateAsync();
await this.updateInProgress;
}
public async Task WaitForUpdatesOnShutdownAsync() => await this.updateInProgress.ContinueWith(ex => { }, TaskScheduler.Default).ConfigureAwait(false);
private async Task RealUpdateAsync()
{
this.logger.Debug("Checking updates");
try
{
using var updateManager = new UpdateManager(@"https://soft.danmuji.org/BililiveRecorder/");
if (!updateManager.IsInstalledApp)
{
this.logger.Information("当前不是安装版,不检查是否有新版本。");
return;
}
var ignoreDeltaUpdates = false;
retry:
try
{
var updateInfo = await updateManager.CheckForUpdate(ignoreDeltaUpdates);
if (updateInfo.ReleasesToApply.Count == 0)
{
this.logger.Information("当前运行的是最新版本 {BuildVersion} ({InstalledVersion})",
GitVersionInformation.FullSemVer,
updateInfo.CurrentlyInstalledVersion?.Version?.ToString() ?? "×");
}
else
{
this.logger.Information("有新版本 {RemoteVersion},当前本地是 {BuildVersion} ({InstalledVersion})",
updateInfo.FutureReleaseEntry?.Version?.ToString() ?? "×",
GitVersionInformation.FullSemVer,
updateInfo.CurrentlyInstalledVersion?.Version?.ToString() ?? "×");
await updateManager.DownloadReleases(updateInfo.ReleasesToApply);
await updateManager.ApplyReleases(updateInfo);
this.logger.Information("更新完成");
}
}
catch (Exception ex)
{
if (ignoreDeltaUpdates == false)
{
ignoreDeltaUpdates = true;
this.logger.Debug(ex, "第一次检查更新出错");
goto retry;
}
throw;
}
}
catch (Exception ex)
{
this.logger.Warning(ex, "检查更新时发生错误");
}
}
}
}