perf: 资源更新后无需重启,优化手动更新逻辑 (#11857)

* perf: 资源更新后无需重启,优化手动更新逻辑

* chore: 添加注释

* chore: 重复触发更新时提前返回
This commit is contained in:
uye
2025-02-12 17:51:26 +08:00
committed by GitHub
parent 538f734cc8
commit 96ce68340d
10 changed files with 95 additions and 97 deletions

View File

@@ -19,7 +19,6 @@ using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
@@ -34,17 +33,16 @@ using MaaWpfGui.Models;
using MaaWpfGui.Services;
using MaaWpfGui.Services.Notification;
using MaaWpfGui.States;
using MaaWpfGui.ViewModels;
using MaaWpfGui.ViewModels.UI;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Serilog;
using Stylet;
using static MaaWpfGui.Helper.Instances.Data;
using AsstHandle = System.IntPtr;
using AsstHandle = nint;
using AsstInstanceOptionKey = System.Int32;
using AsstTaskId = System.Int32;
using ToastNotification = MaaWpfGui.Helper.ToastNotification;
namespace MaaWpfGui.Main
{
@@ -1569,10 +1567,16 @@ namespace MaaWpfGui.Main
Instances.CopilotViewModel.AddLog(LocalizationHelper.GetString("UnsupportedLevel") + subTaskDetails!["level"], UiLogColor.Error);
Task.Run(async () =>
{
var ret = await ResourceUpdater.CheckAndDownloadUpdate();
if (SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates)
{
return;
}
var ret = await ResourceUpdater.CheckAndDownloadResourceUpdate();
if (ret == VersionUpdateViewModel.CheckUpdateRetT.OnlyGameResourceUpdated)
{
_ = Instances.VersionUpdateViewModel.AskToRestart(true);
Instances.AsstProxy.LoadResource();
ToastNotification.ShowDirect(LocalizationHelper.GetString("GameResourceUpdated"));
}
});
break;

View File

@@ -642,7 +642,19 @@ namespace MaaWpfGui.Models
return await DownloadFromMirrorChyanAsync(uri);
}
public static async Task<CheckUpdateRetT> CheckAndDownloadUpdate()
/// <summary>
/// 检查并下载资源更新。
/// </summary>
/// <returns>返回一个 <see cref="CheckUpdateRetT"/> 枚举值,指示更新检查和下载的结果。
/// <list type="bullet">
/// <item><description><see cref="CheckUpdateRetT.AlreadyLatest"/>:已是最新版本。</description></item>
/// <item><description><see cref="CheckUpdateRetT.OK"/>:检查成功。(海外源不会自动下载)</description></item>
/// <item><description><see cref="CheckUpdateRetT.OnlyGameResourceUpdated"/>:下载成功。</description></item>
/// <item><description><see cref="CheckUpdateRetT.NetworkError"/>:网络错误。</description></item>
/// <item><description><see cref="CheckUpdateRetT.UnknownError"/>:其他错误。</description></item>
/// </list></returns>
public static async Task<CheckUpdateRetT> CheckAndDownloadResourceUpdate()
{
SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates = true;

View File

@@ -891,7 +891,7 @@ The video aspect ratio needs to be 16:9 without interference factors such as bla
<system:String x:Key="GameResourceUpdating">Game resources are being updated.</system:String>
<system:String x:Key="GameResourceUpdatePreparing">Indexing in progress</system:String>
<system:String x:Key="GameResourceNotModified">Game resources updated.</system:String>
<system:String x:Key="GameResourceUpdated">Game resources updated, please restart MAA.</system:String>
<system:String x:Key="GameResourceUpdated">Game resources updated.</system:String>
<system:String x:Key="GameResourceFailed">Game resources update failed, please try again later.</system:String>
<!-- !Api -->
<!-- Remote Control -->

View File

@@ -894,7 +894,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="GameResourceUpdating">ゲームリソースが更新中です。</system:String>
<system:String x:Key="GameResourceUpdatePreparing">索引の作成中</system:String>
<system:String x:Key="GameResourceNotModified">ゲームリソースが更新されました。</system:String>
<system:String x:Key="GameResourceUpdated">ゲームリソースが更新されました。MAAを再起動してください。</system:String>
<system:String x:Key="GameResourceUpdated">ゲームリソースが更新されました。</system:String>
<system:String x:Key="GameResourceFailed">ゲームリソースの更新に失敗しました。後でもう一度お試しください。</system:String>
<!-- !Api -->
<!-- Remote Control -->

View File

@@ -894,7 +894,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="GameResourceUpdating">게임 자원이 업데이트 중입니다.</system:String>
<system:String x:Key="GameResourceUpdatePreparing">색인 작성 중</system:String>
<system:String x:Key="GameResourceNotModified">게임 리소스가 업데이트되었으니.</system:String>
<system:String x:Key="GameResourceUpdated">게임 리소스가 업데이트되었으니 MAA를 다시 시작해주세요.</system:String>
<system:String x:Key="GameResourceUpdated">게임 리소스가 업데이트되었으니.</system:String>
<system:String x:Key="GameResourceFailed">게임 리소스 업데이트 실패, 나중에 다시 시도해주세요.</system:String>
<!-- !Api -->
<!-- Remote Control -->

View File

@@ -896,7 +896,7 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="GameResourceUpdating">游戏资源正在更新。</system:String>
<system:String x:Key="GameResourceUpdatePreparing">正在编制索引</system:String>
<system:String x:Key="GameResourceNotModified">游戏资源已更新。</system:String>
<system:String x:Key="GameResourceUpdated">游戏资源已更新,请重启 MAA。</system:String>
<system:String x:Key="GameResourceUpdated">游戏资源已更新。</system:String>
<system:String x:Key="GameResourceFailed">游戏资源更新失败,请稍后尝试。</system:String>
<!-- !Api -->
<!-- Remote Control -->

View File

@@ -893,7 +893,7 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="GameResourceUpdating">遊戲資源正在更新。</system:String>
<system:String x:Key="GameResourceUpdatePreparing">正在編製索引</system:String>
<system:String x:Key="GameResourceNotModified">遊戲資源已更新。</system:String>
<system:String x:Key="GameResourceUpdated">遊戲資源已更新,請重啟 MAA。</system:String>
<system:String x:Key="GameResourceUpdated">遊戲資源已更新。</system:String>
<system:String x:Key="GameResourceFailed">遊戲資源更新失敗,請稍後嘗試。</system:String>
<!-- !Api -->
<!-- Remote Control -->

View File

@@ -469,14 +469,15 @@ namespace MaaWpfGui.ViewModels.UI
{
_logger.Information($"waiting for update check: {delayTime}");
await Task.Delay(delayTime);
if (await Instances.VersionUpdateViewModel.CheckAndDownloadUpdate() == VersionUpdateViewModel.CheckUpdateRetT.OK)
if (await Instances.VersionUpdateViewModel.CheckAndDownloadVersionUpdate() == VersionUpdateViewModel.CheckUpdateRetT.OK)
{
_ = Instances.VersionUpdateViewModel.AskToRestart();
}
if (await ResourceUpdater.CheckAndDownloadUpdate() == VersionUpdateViewModel.CheckUpdateRetT.OK)
if (await ResourceUpdater.CheckAndDownloadResourceUpdate() == VersionUpdateViewModel.CheckUpdateRetT.OnlyGameResourceUpdated)
{
_ = Instances.VersionUpdateViewModel.AskToRestart(true);
Instances.AsstProxy.LoadResource();
ToastNotification.ShowDirect(LocalizationHelper.GetString("GameResourceUpdated"));
}
_isCheckingForUpdates = false;

View File

@@ -476,54 +476,50 @@ public class VersionUpdateViewModel : Screen
{
if (!IsDebugVersion())
{
var ret = await CheckAndDownloadUpdate();
var ret = await CheckAndDownloadVersionUpdate();
if (ret == CheckUpdateRetT.OK)
{
_ = AskToRestart();
}
var ret2 = await ResourceUpdater.CheckAndDownloadUpdate();
var ret2 = await ResourceUpdater.CheckAndDownloadResourceUpdate();
if (ret2 == CheckUpdateRetT.OnlyGameResourceUpdated)
{
_ = AskToRestart(true);
Instances.AsstProxy.LoadResource();
ToastNotification.ShowDirect(LocalizationHelper.GetString("GameResourceUpdated"));
}
}
else
{
// await ResourceUpdater.CheckAndDownloadUpdate();
// await ResourceUpdater.CheckAndDownloadResourceUpdate();
// 跑个空任务避免 async warning
await Task.Run(() => { });
}
}
}
public async Task<CheckUpdateRetT> CheckAndDownloadUpdate()
{
SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates = true;
var ret = await CheckAndDownloadVersionUpdate();
SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates = false;
return ret;
}
/// <summary>
/// 检查更新,并下载更新包。
/// </summary>
/// <returns>操作成功返回 <see langword="true"/>,反之则返回 <see langword="false"/>。</returns>
private async Task<CheckUpdateRetT> CheckAndDownloadVersionUpdate()
public async Task<CheckUpdateRetT> CheckAndDownloadVersionUpdate()
{
// 检查更新
SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates = true;
var (checkRet, source) = await CheckUpdate();
if (checkRet != CheckUpdateRetT.OK)
{
SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates = false;
return checkRet;
}
return source switch
var ret = source switch
{
AppUpdateSource.MaaApi => await HandleUpdateFromMaaApi(),
AppUpdateSource.MirrorChyan => await HandleUpdateFromMirrorChyan(),
_ => CheckUpdateRetT.UnknownError,
};
SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates = false;
return ret;
}
private async Task<CheckUpdateRetT> HandleUpdateFromMaaApi()
@@ -750,7 +746,7 @@ public class VersionUpdateViewModel : Screen
return CheckUpdateRetT.OK;
}
public async Task AskToRestart(bool isResource = false)
public async Task AskToRestart()
{
if (SettingsViewModel.VersionUpdateSettings.AutoInstallUpdatePackage)
{
@@ -761,8 +757,8 @@ public class VersionUpdateViewModel : Screen
await _runningState.UntilIdleAsync(10000);
var result = MessageBoxHelper.Show(
LocalizationHelper.GetString(isResource ? "GameResourceUpdated" : "NewVersionDownloadCompletedDesc"),
LocalizationHelper.GetString(isResource ? "Tip" : "NewVersionDownloadCompletedTitle"),
LocalizationHelper.GetString("NewVersionDownloadCompletedDesc"),
LocalizationHelper.GetString("NewVersionDownloadCompletedTitle"),
MessageBoxButton.OKCancel,
MessageBoxImage.Question,
ok: LocalizationHelper.GetString("Ok"),

View File

@@ -360,91 +360,76 @@ public class VersionUpdateSettingsUserControlModel : PropertyChangedBase
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
public async Task ManualUpdate()
{
var ret = await Instances.VersionUpdateViewModel.CheckAndDownloadUpdate();
var ret = await Instances.VersionUpdateViewModel.CheckAndDownloadVersionUpdate();
var toastMessage = string.Empty;
switch (ret)
var toastMessage = ret switch
{
case VersionUpdateViewModel.CheckUpdateRetT.NoNeedToUpdate:
break;
case VersionUpdateViewModel.CheckUpdateRetT.NoNeedToUpdateDebugVersion:
toastMessage = LocalizationHelper.GetString("NoNeedToUpdateDebugVersion");
break;
case VersionUpdateViewModel.CheckUpdateRetT.AlreadyLatest:
toastMessage = LocalizationHelper.GetString("AlreadyLatest");
break;
case VersionUpdateViewModel.CheckUpdateRetT.UnknownError:
toastMessage = LocalizationHelper.GetString("NewVersionDetectFailedTitle");
break;
case VersionUpdateViewModel.CheckUpdateRetT.NetworkError:
toastMessage = LocalizationHelper.GetString("CheckNetworking");
break;
case VersionUpdateViewModel.CheckUpdateRetT.FailedToGetInfo:
toastMessage = LocalizationHelper.GetString("GetReleaseNoteFailed");
break;
case VersionUpdateViewModel.CheckUpdateRetT.OK:
_ = Instances.VersionUpdateViewModel.AskToRestart();
break;
case VersionUpdateViewModel.CheckUpdateRetT.NewVersionIsBeingBuilt:
toastMessage = LocalizationHelper.GetString("NewVersionIsBeingBuilt");
break;
case VersionUpdateViewModel.CheckUpdateRetT.OnlyGameResourceUpdated:
toastMessage = LocalizationHelper.GetString("GameResourceUpdated");
break;
case VersionUpdateViewModel.CheckUpdateRetT.NoMirrorChyanCdk:
toastMessage = LocalizationHelper.GetString("MirrorChyanSoftwareUpdateTip");
break;
default:
throw new ArgumentOutOfRangeException();
}
VersionUpdateViewModel.CheckUpdateRetT.NoNeedToUpdate => string.Empty,
VersionUpdateViewModel.CheckUpdateRetT.NoNeedToUpdateDebugVersion => LocalizationHelper.GetString("NoNeedToUpdateDebugVersion"),
VersionUpdateViewModel.CheckUpdateRetT.AlreadyLatest => LocalizationHelper.GetString("AlreadyLatest"),
VersionUpdateViewModel.CheckUpdateRetT.UnknownError => LocalizationHelper.GetString("NewVersionDetectFailedTitle"),
VersionUpdateViewModel.CheckUpdateRetT.NetworkError => LocalizationHelper.GetString("CheckNetworking"),
VersionUpdateViewModel.CheckUpdateRetT.FailedToGetInfo => LocalizationHelper.GetString("GetReleaseNoteFailed"),
VersionUpdateViewModel.CheckUpdateRetT.OK => string.Empty,
VersionUpdateViewModel.CheckUpdateRetT.NewVersionIsBeingBuilt => LocalizationHelper.GetString("NewVersionIsBeingBuilt"),
VersionUpdateViewModel.CheckUpdateRetT.OnlyGameResourceUpdated => LocalizationHelper.GetString("GameResourceUpdated"),
VersionUpdateViewModel.CheckUpdateRetT.NoMirrorChyanCdk => LocalizationHelper.GetString("MirrorChyanSoftwareUpdateTip"),
_ => string.Empty,
};
if (toastMessage != string.Empty)
{
ToastNotification.ShowDirect(toastMessage);
}
if (ret == VersionUpdateViewModel.CheckUpdateRetT.OK)
{
_ = Instances.VersionUpdateViewModel.AskToRestart();
}
}
public async Task ManualUpdateResource()
{
IsCheckingForUpdates = true;
var (ret, uri) = await ResourceUpdater.CheckFromMirrorChyanAsync();
var toastMessage = ret switch
{
VersionUpdateViewModel.CheckUpdateRetT.NoNeedToUpdate => string.Empty,
VersionUpdateViewModel.CheckUpdateRetT.NoNeedToUpdateDebugVersion => LocalizationHelper.GetString("NoNeedToUpdateDebugVersion"),
VersionUpdateViewModel.CheckUpdateRetT.AlreadyLatest => LocalizationHelper.GetString("AlreadyLatest"),
VersionUpdateViewModel.CheckUpdateRetT.UnknownError => LocalizationHelper.GetString("NewVersionDetectFailedTitle"),
VersionUpdateViewModel.CheckUpdateRetT.NetworkError => LocalizationHelper.GetString("CheckNetworking"),
VersionUpdateViewModel.CheckUpdateRetT.FailedToGetInfo => LocalizationHelper.GetString("GetReleaseNoteFailed"),
VersionUpdateViewModel.CheckUpdateRetT.OK => string.Empty,
VersionUpdateViewModel.CheckUpdateRetT.NewVersionIsBeingBuilt => LocalizationHelper.GetString("NewVersionIsBeingBuilt"),
VersionUpdateViewModel.CheckUpdateRetT.OnlyGameResourceUpdated => LocalizationHelper.GetString("GameResourceUpdated"),
VersionUpdateViewModel.CheckUpdateRetT.NoMirrorChyanCdk => LocalizationHelper.GetString("MirrorChyanSoftwareUpdateTip"),
_ => string.Empty,
};
if (toastMessage != string.Empty)
{
ToastNotification.ShowDirect(toastMessage);
}
if (ret != VersionUpdateViewModel.CheckUpdateRetT.OK)
{
SettingsViewModel.VersionUpdateSettings.IsCheckingForUpdates = false;
return;
}
bool success = UpdateSource switch
{
"Github" => await ResourceUpdater.UpdateFromGithubAsync(),
"MirrorChyan" => await ResourceUpdater.UpdateFromMirrorChyanAsync(),
"MirrorChyan" => await ResourceUpdater.DownloadFromMirrorChyanAsync(uri),
_ => await ResourceUpdater.UpdateFromGithubAsync(),
};
if (success)
{
if (AutoInstallUpdatePackage)
{
await Bootstrapper.RestartAfterIdleAsync();
}
else
{
var result = MessageBoxHelper.Show(
LocalizationHelper.GetString("GameResourceUpdated"),
LocalizationHelper.GetString("Tip"),
MessageBoxButton.OKCancel,
MessageBoxImage.Question,
ok: LocalizationHelper.GetString("Ok"),
cancel: LocalizationHelper.GetString("ManualRestart"));
if (result == MessageBoxResult.OK)
{
Bootstrapper.ShutdownAndRestartWithoutArgs();
}
}
Instances.AsstProxy.LoadResource();
ToastNotification.ShowDirect(LocalizationHelper.GetString("GameResourceUpdated"));
}
IsCheckingForUpdates = false;