diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs index 81a298f6..d198ae93 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs @@ -14,7 +14,8 @@ internal interface IAnnouncementService /// /// 异步获取游戏公告与活动,通常会进行缓存 /// + /// 语言代码 /// 取消令牌 /// 公告包装器 - ValueTask GetAnnouncementWrapperAsync(CancellationToken cancellationToken = default); + ValueTask GetAnnouncementWrapperAsync(string languageCode, 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 df39f93b..55c3038a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs @@ -25,7 +25,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService private readonly IMemoryCache memoryCache; /// - public async ValueTask GetAnnouncementWrapperAsync(CancellationToken cancellationToken = default) + public async ValueTask GetAnnouncementWrapperAsync(string languageCode, CancellationToken cancellationToken = default) { // 缓存中存在记录,直接返回 if (memoryCache.TryGetRequiredValue(CacheKey, out AnnouncementWrapper? cache)) @@ -35,7 +35,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService await taskContext.SwitchToBackgroundAsync(); Response announcementWrapperResponse = await announcementClient - .GetAnnouncementsAsync(cancellationToken) + .GetAnnouncementsAsync(languageCode, cancellationToken) .ConfigureAwait(false); if (!announcementWrapperResponse.IsOk()) @@ -45,7 +45,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService AnnouncementWrapper wrapper = announcementWrapperResponse.Data; Response> announcementContentResponse = await announcementClient - .GetAnnouncementContentsAsync(cancellationToken) + .GetAnnouncementContentsAsync(languageCode, 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 36553850..39d463bd 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Home/AnnouncementViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Home/AnnouncementViewModel.cs @@ -4,6 +4,7 @@ using Snap.Hutao.Core.Setting; using Snap.Hutao.Service.Abstraction; using Snap.Hutao.Service.Hutao; +using Snap.Hutao.Service.Metadata; using Snap.Hutao.View.Card; using Snap.Hutao.View.Card.Primitive; using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; @@ -23,6 +24,7 @@ internal sealed partial class AnnouncementViewModel : Abstraction.ViewModel private readonly IAnnouncementService announcementService; private readonly HutaoUserOptions hutaoUserOptions; private readonly ITaskContext taskContext; + private readonly MetadataOptions metadataOptions; private AnnouncementWrapper? announcement; private string greetingText = SH.ViewPageHomeGreetingTextDefault; @@ -61,7 +63,7 @@ internal sealed partial class AnnouncementViewModel : Abstraction.ViewModel { try { - AnnouncementWrapper announcementWrapper = await announcementService.GetAnnouncementWrapperAsync(CancellationToken).ConfigureAwait(false); + AnnouncementWrapper announcementWrapper = await announcementService.GetAnnouncementWrapperAsync(metadataOptions.LanguageCode, CancellationToken).ConfigureAwait(false); await taskContext.SwitchToMainThreadAsync(); Announcement = announcementWrapper; } @@ -138,4 +140,4 @@ internal sealed partial class AnnouncementViewModel : Abstraction.ViewModel Cards = result; } -} \ No newline at end of file +} diff --git a/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs index 26cbc006..d1205ff4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs @@ -189,6 +189,32 @@ internal static class ApiOsEndpoints } #endregion + #region Hk4eApiOsAnnouncementApi + + /// + /// 公告列表 + /// + /// 语言代码 + /// 服务器 + /// 公告列表Url + public static string AnnList(string languageCode, string region) + { + return $"{Hk4eApiOsAnnouncementApi}/getAnnList?{AnnouncementQuery(languageCode, region)}"; + } + + /// + /// 公告内容 + /// + /// 语言代码 + /// 服务器 + /// 公告内容Url + public static string AnnContent(string languageCode, string region) + { + return $"{Hk4eApiOsAnnouncementApi}/getAnnContent?{AnnouncementQuery(languageCode, region)}"; + } + + #endregion + #region SgPublicApi /// @@ -307,6 +333,7 @@ internal static class ApiOsEndpoints private const string BbsApiOsGameRecordAppApi = $"{BbsApiOs}/game_record/app/genshin/api"; private const string Hk4eApiOs = "https://hk4e-api-os.hoyoverse.com"; + private const string Hk4eApiOsAnnouncementApi = $"{Hk4eApiOs}/common/hk4e_global/announcement/api"; private const string Hk4eApiOsGachaInfoApi = $"{Hk4eApiOs}/gacha_info/api"; private const string SdkOsStatic = "https://sdk-os-static.mihoyo.com"; @@ -333,5 +360,10 @@ internal static class ApiOsEndpoints /// public const string AppHoyolabReferer = "https://app.hoyolab.com/"; + private static string AnnouncementQuery(string languageCode, string region) + { + return $"game=hk4e&game_biz=hk4e_global&lang={languageCode}&bundle_id=hk4e_global&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 37cc18f1..f9d0d227 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 @@ -23,12 +23,16 @@ internal sealed partial class AnnouncementClient /// /// 异步获取公告列表 /// + /// 语言代码 /// 取消令牌 /// 公告列表 - public async ValueTask> GetAnnouncementsAsync(CancellationToken token = default) + public async ValueTask> GetAnnouncementsAsync(string languageCode, CancellationToken token = default) { + // ApiOsEndpoints.AnnList(languageCode, region) + string annListUrl = ApiEndpoints.AnnList; + HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() - .SetRequestUri(ApiEndpoints.AnnList) + .SetRequestUri(annListUrl) .Get(); Response? resp = await builder @@ -41,12 +45,16 @@ internal sealed partial class AnnouncementClient /// /// 异步获取公告内容列表 /// + /// 语言代码 /// 取消令牌 /// 公告内容列表 - public async ValueTask>> GetAnnouncementContentsAsync(CancellationToken token = default) + public async ValueTask>> GetAnnouncementContentsAsync(string languageCode, CancellationToken token = default) { + // ApiOsEndpoints.AnnContent(languageCode, region) + string annContentUrl = ApiEndpoints.AnnContent; + HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() - .SetRequestUri(ApiEndpoints.AnnContent) + .SetRequestUri(annContentUrl) .Get(); Response>? resp = await builder