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