mirror of
https://jihulab.com/DGP-Studio/Snap.Hutao.git
synced 2025-11-19 21:02:53 +08:00
@@ -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
|
||||
/// 异步获取游戏公告与活动,通常会进行缓存
|
||||
/// </summary>
|
||||
/// <param name="languageCode">语言代码</param>
|
||||
/// <param name="region">服务器</param>
|
||||
/// <param name="cancellationToken">取消令牌</param>
|
||||
/// <returns>公告包装器</returns>
|
||||
ValueTask<AnnouncementWrapper> GetAnnouncementWrapperAsync(string languageCode, CancellationToken cancellationToken = default);
|
||||
ValueTask<AnnouncementWrapper> GetAnnouncementWrapperAsync(string languageCode, RegionType region, CancellationToken cancellationToken = default);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async ValueTask<AnnouncementWrapper> GetAnnouncementWrapperAsync(string languageCode, CancellationToken cancellationToken = default)
|
||||
public async ValueTask<AnnouncementWrapper> 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<AnnouncementWrapper> 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<ListWrapper<AnnouncementContent>> announcementContentResponse = await announcementClient
|
||||
.GetAnnouncementContentsAsync(languageCode, cancellationToken)
|
||||
.GetAnnouncementContentsAsync(languageCode, region, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
if (!announcementContentResponse.IsOk())
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -281,12 +281,18 @@ internal static class ApiEndpoints
|
||||
/// <summary>
|
||||
/// 公告列表
|
||||
/// </summary>
|
||||
public const string AnnList = $"{Hk4eApiAnnouncementApi}/getAnnList?{AnnouncementQuery}";
|
||||
public static string AnnList(string languageCode, string region)
|
||||
{
|
||||
return $"{Hk4eApiAnnouncementApi}/getAnnList?{AnnouncementQuery(languageCode, region)}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 公告内容
|
||||
/// </summary>
|
||||
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
|
||||
/// </summary>
|
||||
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
|
||||
}
|
||||
@@ -24,12 +24,21 @@ internal sealed partial class AnnouncementClient
|
||||
/// 异步获取公告列表
|
||||
/// </summary>
|
||||
/// <param name="languageCode">语言代码</param>
|
||||
/// <param name="region">服务器</param>
|
||||
/// <param name="token">取消令牌</param>
|
||||
/// <returns>公告列表</returns>
|
||||
public async ValueTask<Response<AnnouncementWrapper>> GetAnnouncementsAsync(string languageCode, CancellationToken token = default)
|
||||
public async ValueTask<Response<AnnouncementWrapper>> 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
|
||||
/// 异步获取公告内容列表
|
||||
/// </summary>
|
||||
/// <param name="languageCode">语言代码</param>
|
||||
/// <param name="region">服务器</param>
|
||||
/// <param name="token">取消令牌</param>
|
||||
/// <returns>公告内容列表</returns>
|
||||
public async ValueTask<Response<ListWrapper<AnnouncementContent>>> GetAnnouncementContentsAsync(string languageCode, CancellationToken token = default)
|
||||
public async ValueTask<Response<ListWrapper<AnnouncementContent>>> 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)
|
||||
|
||||
Reference in New Issue
Block a user