mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-15 17:30:27 +08:00
perf: 资源更新后无需重启,优化手动更新逻辑 (#11857)
* perf: 资源更新后无需重启,优化手动更新逻辑 * chore: 添加注释 * chore: 重复触发更新时提前返回
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user