From 98ea1576555c8aeaebf00eb6a1850fb2e4ea6d63 Mon Sep 17 00:00:00 2001 From: uye <99072975+ABA2396@users.noreply.github.com> Date: Sat, 20 Sep 2025 13:38:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BD=91=E7=BB=9C=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E4=BA=86=E6=9C=AC=E5=9C=B0=E7=BC=93=E5=AD=98=E4=B9=9F?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BA=86=E8=8E=B7=E5=8F=96=E7=83=AD=E6=9B=B4?= =?UTF-8?q?=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaWpfGui/Services/StageManager.cs | 33 +++++++++++++++----- src/MaaWpfGui/Services/Web/IMaaApiService.cs | 2 +- src/MaaWpfGui/Services/Web/MaaApiService.cs | 26 +++++++++------ 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/MaaWpfGui/Services/StageManager.cs b/src/MaaWpfGui/Services/StageManager.cs index b4c540b7ab..7230fb90b6 100644 --- a/src/MaaWpfGui/Services/StageManager.cs +++ b/src/MaaWpfGui/Services/StageManager.cs @@ -83,7 +83,13 @@ namespace MaaWpfGui.Services } } - MergePermanentAndActivityStages(await LoadWebStages()); + var webStages = await LoadWebStages(); + if (webStages is null) + { + return; + } + + MergePermanentAndActivityStages(webStages); _ = Execute.OnUIThreadAsync(() => { @@ -139,17 +145,18 @@ namespace MaaWpfGui.Services } */ - private static async Task LoadWebStages() + private static async Task LoadWebStages() { var clientType = GetClientType(); - var activityTask = Instances.MaaApiService.RequestMaaApiWithCache(StageApi); - var tasksTask = Instances.MaaApiService.RequestMaaApiWithCache(TasksApi); + var activityTask = Instances.MaaApiService.RequestMaaApiWithCache(StageApi, false); + var tasksTask = Instances.MaaApiService.RequestMaaApiWithCache(TasksApi, false); await Task.WhenAll(activityTask, tasksTask); - JObject activity = await activityTask; - JObject tasksJson = await tasksTask; + var activityJson = await activityTask; + var tasksJson = await tasksTask; + JObject? globalTasksJson = null; if (clientType != "Official" && tasksJson != null) { var tasksPath = "resource/global/" + clientType + '/' + TasksApi; @@ -157,14 +164,24 @@ namespace MaaWpfGui.Services // Download the client specific resources only when the Official ones are successfully downloaded so that the client specific resource version is the actual version // TODO: There may be an issue when the CN resource is loaded from cache (e.g. network down) while global resource is downloaded (e.g. network up again) // var tasksJsonClient = fromWeb ? WebService.RequestMaaApiWithCache(tasksPath) : WebService.RequestMaaApiWithCache(tasksPath); - await Instances.MaaApiService.RequestMaaApiWithCache(tasksPath); + globalTasksJson = await Instances.MaaApiService.RequestMaaApiWithCache(tasksPath, false); + } + + if (activityJson is null || tasksJson is null) + { + return null; + } + + if (clientType != "Official" && globalTasksJson is null) + { + return null; } await Task.Run(() => { Instances.AsstProxy.LoadResource(); }); - return activity; + return activityJson; } private void MergePermanentAndActivityStages(JObject? activity) diff --git a/src/MaaWpfGui/Services/Web/IMaaApiService.cs b/src/MaaWpfGui/Services/Web/IMaaApiService.cs index df9afdbb01..2233e74a2c 100644 --- a/src/MaaWpfGui/Services/Web/IMaaApiService.cs +++ b/src/MaaWpfGui/Services/Web/IMaaApiService.cs @@ -18,7 +18,7 @@ namespace MaaWpfGui.Services.Web { public interface IMaaApiService { - Task RequestMaaApiWithCache(string api); + Task RequestMaaApiWithCache(string api, bool allowFallbackToCache = true); JObject LoadApiCache(string api); } diff --git a/src/MaaWpfGui/Services/Web/MaaApiService.cs b/src/MaaWpfGui/Services/Web/MaaApiService.cs index 4d169573ce..633dc4b30a 100644 --- a/src/MaaWpfGui/Services/Web/MaaApiService.cs +++ b/src/MaaWpfGui/Services/Web/MaaApiService.cs @@ -26,35 +26,43 @@ namespace MaaWpfGui.Services.Web { private static readonly string CacheDir = PathsHelper.BaseDir + "/cache/"; - public async Task RequestMaaApiWithCache(string api) + public async Task RequestMaaApiWithCache(string api, bool allowFallbackToCache = true) { - return await RequestWithFallback(api, MaaUrls.MaaApi, MaaUrls.MaaApi2); + return await RequestWithFallback(api, MaaUrls.MaaApi, MaaUrls.MaaApi2, allowFallbackToCache); } - private async Task RequestWithFallback(string api, string primaryBaseUrl, string? fallbackBaseUrl = null) + private async Task RequestWithFallback(string api, string primaryBaseUrl, string? fallbackBaseUrl = null, bool allowFallbackToCache = true) { - var json = await TryRequest(api, primaryBaseUrl); + var json = await TryRequest(api, primaryBaseUrl, allowFallbackToCache); if (json != null || string.IsNullOrEmpty(fallbackBaseUrl)) { return json; } - return await TryRequest(api, fallbackBaseUrl); + return await TryRequest(api, fallbackBaseUrl, allowFallbackToCache); } - private async Task TryRequest(string api, string baseUrl) + private async Task TryRequest(string api, string baseUrl, bool allowFallbackToCache = true) { var url = baseUrl + api; var cache = CacheDir + api; var response = await ETagCache.FetchResponseWithEtag(url, !File.Exists(cache)); - if (response == null || - response.StatusCode == System.Net.HttpStatusCode.NotModified || - response.StatusCode != System.Net.HttpStatusCode.OK) + if (response == null) + { + return allowFallbackToCache ? LoadApiCache(api) : null; + } + + if (response.StatusCode == System.Net.HttpStatusCode.NotModified) { return LoadApiCache(api); } + if (response.StatusCode != System.Net.HttpStatusCode.OK) + { + return allowFallbackToCache ? LoadApiCache(api) : null; + } + var body = await HttpResponseHelper.GetStringAsync(response); if (string.IsNullOrEmpty(body)) {