diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs index d198ae93..3c86893a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Snap.Hutao.Web.Hoyolab; using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; namespace Snap.Hutao.Service.Abstraction; @@ -15,7 +16,8 @@ internal interface IAnnouncementService /// 异步获取游戏公告与活动,通常会进行缓存 /// /// 语言代码 + /// 服务器 /// 取消令牌 /// 公告包装器 - ValueTask GetAnnouncementWrapperAsync(string languageCode, CancellationToken cancellationToken = default); + ValueTask GetAnnouncementWrapperAsync(string languageCode, RegionType region, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs index 55c3038a..aac92b84 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Caching.Memory; using Snap.Hutao.Service.Abstraction; +using Snap.Hutao.Web.Hoyolab; using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; using Snap.Hutao.Web.Response; using System.Globalization; @@ -25,17 +26,17 @@ internal sealed partial class AnnouncementService : IAnnouncementService private readonly IMemoryCache memoryCache; /// - public async ValueTask GetAnnouncementWrapperAsync(string languageCode, CancellationToken cancellationToken = default) + public async ValueTask GetAnnouncementWrapperAsync(string languageCode, RegionType region, CancellationToken cancellationToken = default) { // 缓存中存在记录,直接返回 - if (memoryCache.TryGetRequiredValue(CacheKey, out AnnouncementWrapper? cache)) + if (memoryCache.TryGetRequiredValue($"{CacheKey}.{languageCode}.{region}", out AnnouncementWrapper? cache)) { return cache; } await taskContext.SwitchToBackgroundAsync(); Response announcementWrapperResponse = await announcementClient - .GetAnnouncementsAsync(languageCode, cancellationToken) + .GetAnnouncementsAsync(languageCode, region, cancellationToken) .ConfigureAwait(false); if (!announcementWrapperResponse.IsOk()) @@ -45,7 +46,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService AnnouncementWrapper wrapper = announcementWrapperResponse.Data; Response> announcementContentResponse = await announcementClient - .GetAnnouncementContentsAsync(languageCode, cancellationToken) + .GetAnnouncementContentsAsync(languageCode, region, cancellationToken) .ConfigureAwait(false); if (!announcementContentResponse.IsOk()) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Home/AnnouncementViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Home/AnnouncementViewModel.cs index 39d463bd..05a33680 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Home/AnnouncementViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Home/AnnouncementViewModel.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Snap.Hutao.Core.Setting; +using Snap.Hutao.Service; using Snap.Hutao.Service.Abstraction; using Snap.Hutao.Service.Hutao; using Snap.Hutao.Service.Metadata; @@ -25,6 +26,7 @@ internal sealed partial class AnnouncementViewModel : Abstraction.ViewModel private readonly HutaoUserOptions hutaoUserOptions; private readonly ITaskContext taskContext; private readonly MetadataOptions metadataOptions; + private readonly AppOptions appOptions; private AnnouncementWrapper? announcement; private string greetingText = SH.ViewPageHomeGreetingTextDefault; @@ -63,7 +65,7 @@ internal sealed partial class AnnouncementViewModel : Abstraction.ViewModel { try { - AnnouncementWrapper announcementWrapper = await announcementService.GetAnnouncementWrapperAsync(metadataOptions.LanguageCode, CancellationToken).ConfigureAwait(false); + AnnouncementWrapper announcementWrapper = await announcementService.GetAnnouncementWrapperAsync(metadataOptions.LanguageCode, appOptions.RegionType, CancellationToken).ConfigureAwait(false); await taskContext.SwitchToMainThreadAsync(); Announcement = announcementWrapper; } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs index 881b3c55..cb9986a8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs @@ -281,12 +281,18 @@ internal static class ApiEndpoints /// /// 公告列表 /// - public const string AnnList = $"{Hk4eApiAnnouncementApi}/getAnnList?{AnnouncementQuery}"; + public static string AnnList(string languageCode, string region) + { + return $"{Hk4eApiAnnouncementApi}/getAnnList?{AnnouncementQuery(languageCode, region)}"; + } /// /// 公告内容 /// - public const string AnnContent = $"{Hk4eApiAnnouncementApi}/getAnnContent?{AnnouncementQuery}"; + public static string AnnContent(string languageCode, string region) + { + return $"{Hk4eApiAnnouncementApi}/getAnnContent?{AnnouncementQuery(languageCode, region)}"; + } #endregion #region Hk4eSdk @@ -422,6 +428,9 @@ internal static class ApiEndpoints /// public const string WebStaticMihoyoReferer = "https://webstatic.mihoyo.com"; - private const string AnnouncementQuery = "game=hk4e&game_biz=hk4e_cn&lang=zh-cn&bundle_id=hk4e_cn&platform=pc®ion=cn_gf01&level=55&uid=100000000"; + private static string AnnouncementQuery(string languageCode, string region) + { + return $"game=hk4e&game_biz=hk4e_cn&lang={languageCode}&bundle_id=hk4e_cn&platform=pc®ion={region}&level=55&uid=100000000"; + } #endregion } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementClient.cs index f9d0d227..417d6137 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementClient.cs @@ -24,12 +24,21 @@ internal sealed partial class AnnouncementClient /// 异步获取公告列表 /// /// 语言代码 + /// 服务器 /// 取消令牌 /// 公告列表 - public async ValueTask> GetAnnouncementsAsync(string languageCode, CancellationToken token = default) + public async ValueTask> GetAnnouncementsAsync(string languageCode, RegionType region, CancellationToken token = default) { - // ApiOsEndpoints.AnnList(languageCode, region) - string annListUrl = ApiEndpoints.AnnList; + string annListUrl = region switch + { + RegionType.CN_GF01 => ApiEndpoints.AnnList(languageCode, region.ToString().ToLowerInvariant()), + RegionType.CN_QD01 => ApiEndpoints.AnnList(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_USA => ApiOsEndpoints.AnnList(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_EURO => ApiOsEndpoints.AnnList(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_ASIA => ApiOsEndpoints.AnnList(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_CHT => ApiOsEndpoints.AnnList(languageCode, region.ToString().ToLowerInvariant()), + _ => ApiEndpoints.AnnList(languageCode, RegionType.CN_GF01.ToString().ToLowerInvariant()), + }; HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(annListUrl) @@ -46,12 +55,21 @@ internal sealed partial class AnnouncementClient /// 异步获取公告内容列表 /// /// 语言代码 + /// 服务器 /// 取消令牌 /// 公告内容列表 - public async ValueTask>> GetAnnouncementContentsAsync(string languageCode, CancellationToken token = default) + public async ValueTask>> GetAnnouncementContentsAsync(string languageCode, RegionType region, CancellationToken token = default) { - // ApiOsEndpoints.AnnContent(languageCode, region) - string annContentUrl = ApiEndpoints.AnnContent; + string annContentUrl = region switch + { + RegionType.CN_GF01 => ApiEndpoints.AnnContent(languageCode, region.ToString().ToLowerInvariant()), + RegionType.CN_QD01 => ApiEndpoints.AnnContent(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_USA => ApiOsEndpoints.AnnContent(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_EURO => ApiOsEndpoints.AnnContent(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_ASIA => ApiOsEndpoints.AnnContent(languageCode, region.ToString().ToLowerInvariant()), + RegionType.OS_CHT => ApiOsEndpoints.AnnContent(languageCode, region.ToString().ToLowerInvariant()), + _ => ApiEndpoints.AnnContent(languageCode, RegionType.CN_GF01.ToString().ToLowerInvariant()), + }; HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(annContentUrl)