From 879b930ea612604d3b6b96e8ca8a7377e3631f5f Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Sat, 16 Dec 2023 22:28:39 +0800 Subject: [PATCH 01/13] impl #1112 (part 1) --- .../Abstraction/IAnnouncementService.cs | 3 +- .../Snap.Hutao/Service/AnnouncementService.cs | 6 ++-- .../ViewModel/Home/AnnouncementViewModel.cs | 6 ++-- .../Snap.Hutao/Web/ApiOsEndpoints.cs | 32 +++++++++++++++++++ .../Common/Announcement/AnnouncementClient.cs | 16 +++++++--- 5 files changed, 53 insertions(+), 10 deletions(-) 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 From 3df70a5feb1337b4b5c2950cdc08a823ddc66a6e Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Tue, 19 Dec 2023 23:31:05 +0800 Subject: [PATCH 02/13] impl #1112 (part 2) setting --- .../Model/Entity/SettingEntry.Constant.cs | 2 ++ .../Snap.Hutao/Resource/Localization/SH.resx | 6 ++++++ src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs | 10 ++++++++++ .../Snap.Hutao/View/Page/SettingPage.xaml | 11 +++++++++++ .../ViewModel/Setting/SettingViewModel.cs | 14 ++++++++++++++ .../Snap.Hutao/Web/Hoyolab/RegionType.cs | 15 +++++++++++++++ 6 files changed, 58 insertions(+) create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionType.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs index b18f0ef8..76338c22 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs @@ -127,4 +127,6 @@ internal sealed partial class SettingEntry /// 自定义极验接口 /// public const string GeetestCustomCompositeUrl = "GeetestCustomCompositeUrl"; + + public const string RegionType = "RegionType"; } diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 4a0d4ea4..3962d02a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -2306,6 +2306,12 @@ 无感验证 + + 选择想要获取公告的游戏服务器 + + + 公告所属服务器 + 管理主页仪表板中的卡片 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index aeb46ccc..6c9c7965 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -6,6 +6,7 @@ using Snap.Hutao.Core.Windowing; using Snap.Hutao.Model; using Snap.Hutao.Model.Entity; using Snap.Hutao.Service.Abstraction; +using Snap.Hutao.Web.Hoyolab; using System.Globalization; using System.IO; @@ -19,6 +20,7 @@ internal sealed partial class AppOptions : DbStoreOptions private bool? isEmptyHistoryWishVisible; private BackdropType? backdropType; private CultureInfo? currentCulture; + private RegionType? regionType; private string? geetestCustomCompositeUrl; public string PowerShellPath @@ -72,6 +74,14 @@ internal sealed partial class AppOptions : DbStoreOptions set => SetOption(ref currentCulture, SettingEntry.Culture, value, value => value.Name); } + public List> RegionTypes { get; } = CollectionsNameValue.FromEnum(); + + public RegionType RegionType + { + get => GetOption(ref regionType, SettingEntry.RegionType, v => Enum.Parse(v), RegionType.CN_GF01).Value; + set => SetOption(ref regionType, SettingEntry.RegionType, value, value => value.ToStringOrEmpty()); + } + public string GeetestCustomCompositeUrl { get => GetOption(ref geetestCustomCompositeUrl, SettingEntry.GeetestCustomCompositeUrl); diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml index 090bf170..d35822a4 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml @@ -305,6 +305,17 @@ + + + + + ? selectedBackdropType; private NameValue? selectedCulture; + private NameValue? selectedRegionType; private IPInformation? ipInformation; private FolderViewModel? cacheFolderView; private FolderViewModel? dataFolderView; @@ -104,6 +106,18 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel } } + public NameValue? SelectedRegionType + { + get => selectedRegionType ??= AppOptions.RegionTypes.Single(t => t.Value == AppOptions.RegionType); + set + { + if (SetProperty(ref selectedRegionType, value) && value is not null) + { + AppOptions.RegionType = value.Value; + } + } + } + public FolderViewModel? CacheFolderView { get => cacheFolderView; set => SetProperty(ref cacheFolderView, value); } public FolderViewModel? DataFolderView { get => dataFolderView; set => SetProperty(ref dataFolderView, value); } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionType.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionType.cs new file mode 100644 index 00000000..565aa9c3 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionType.cs @@ -0,0 +1,15 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hoyolab; + +[HighQuality] +internal enum RegionType +{ + CN_GF01 = 1, + CN_QD01 = 5, + OS_USA = 6, + OS_EURO = 7, + OS_ASIA = 8, + OS_CHT = 9, +} From 493af0fd4c72f8a63ca529e65f3866d284f2eb64 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Wed, 20 Dec 2023 00:01:06 +0800 Subject: [PATCH 03/13] impl #1112 (part 3) ann client --- .../Abstraction/IAnnouncementService.cs | 4 ++- .../Snap.Hutao/Service/AnnouncementService.cs | 9 +++--- .../ViewModel/Home/AnnouncementViewModel.cs | 4 ++- src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs | 15 ++++++++-- .../Common/Announcement/AnnouncementClient.cs | 30 +++++++++++++++---- 5 files changed, 47 insertions(+), 15 deletions(-) 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) From eeed58ed71b749e6562da7b5970af75ceaf0245e Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Wed, 20 Dec 2023 09:13:38 +0800 Subject: [PATCH 04/13] maybe code style --- .../Hoyolab => Model/Intrinsic}/RegionType.cs | 2 +- .../Snap.Hutao/Resource/Localization/SH.resx | 18 ++++++++ .../Abstraction/IAnnouncementService.cs | 2 +- .../Snap.Hutao/Service/AnnouncementService.cs | 2 +- .../Snap.Hutao/Service/AppOptions.cs | 4 +- .../Service/SupportedRegionTypes.cs | 41 +++++++++++++++++++ .../ViewModel/Setting/SettingViewModel.cs | 2 +- .../Common/Announcement/AnnouncementClient.cs | 1 + 8 files changed, 66 insertions(+), 6 deletions(-) rename src/Snap.Hutao/Snap.Hutao/{Web/Hoyolab => Model/Intrinsic}/RegionType.cs (85%) create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionType.cs b/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/RegionType.cs similarity index 85% rename from src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionType.cs rename to src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/RegionType.cs index 565aa9c3..5022a74f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionType.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/RegionType.cs @@ -1,7 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -namespace Snap.Hutao.Web.Hoyolab; +namespace Snap.Hutao.Model.Intrinsic; [HighQuality] internal enum RegionType diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 3962d02a..a949046c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -355,6 +355,24 @@ 一星 + + 国服 官方服 + + + 国服 渠道服 + + + 国际服 亚服 + + + 国际服 台服 + + + 国际服 欧服 + + + 国际服 美服 + Need EXACT same string in game diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs index 3c86893a..65efd10f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs @@ -1,7 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Web.Hoyolab; +using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; namespace Snap.Hutao.Service.Abstraction; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs index aac92b84..49b1d9b2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs @@ -2,8 +2,8 @@ // Licensed under the MIT license. using Microsoft.Extensions.Caching.Memory; +using Snap.Hutao.Model.Intrinsic; 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; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index 6c9c7965..a6646454 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -5,8 +5,8 @@ using Microsoft.Extensions.Primitives; using Snap.Hutao.Core.Windowing; using Snap.Hutao.Model; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Service.Abstraction; -using Snap.Hutao.Web.Hoyolab; using System.Globalization; using System.IO; @@ -74,7 +74,7 @@ internal sealed partial class AppOptions : DbStoreOptions set => SetOption(ref currentCulture, SettingEntry.Culture, value, value => value.Name); } - public List> RegionTypes { get; } = CollectionsNameValue.FromEnum(); + public List> RegionTypes { get; } = SupportedRegionTypes.Get(); public RegionType RegionType { diff --git a/src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs b/src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs new file mode 100644 index 00000000..5e585cf7 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs @@ -0,0 +1,41 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model; +using Snap.Hutao.Model.Intrinsic; + +namespace Snap.Hutao.Service; + +internal static class SupportedRegionTypes +{ + private static readonly List> Cultures = + [ + ToNameValue(RegionType.CN_GF01), + ToNameValue(RegionType.CN_QD01), + ToNameValue(RegionType.OS_USA), + ToNameValue(RegionType.OS_EURO), + ToNameValue(RegionType.OS_ASIA), + ToNameValue(RegionType.OS_CHT), + ]; + + public static List> Get() + { + return Cultures; + } + + private static NameValue ToNameValue(RegionType regionType) + { + return new( + regionType switch + { + RegionType.CN_GF01 => SH.ModelIntrinsicRegionTypeCnGf01, + RegionType.CN_QD01 => SH.ModelIntrinsicRegionTypeCnQd01, + RegionType.OS_USA => SH.ModelIntrinsicRegionTypeOsUsa, + RegionType.OS_EURO => SH.ModelIntrinsicRegionTypeOsEuro, + RegionType.OS_ASIA => SH.ModelIntrinsicRegionTypeOsAsia, + RegionType.OS_CHT => SH.ModelIntrinsicRegionTypeOsCht, + _ => SH.ModelIntrinsicRegionTypeCnGf01, + }, + regionType); + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs index 78eca7d3..4a4613c8 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs @@ -13,6 +13,7 @@ using Snap.Hutao.Core.Windowing.HotKey; using Snap.Hutao.Factory.ContentDialog; using Snap.Hutao.Factory.Picker; using Snap.Hutao.Model; +using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Service; using Snap.Hutao.Service.GachaLog.QueryProvider; using Snap.Hutao.Service.Game; @@ -23,7 +24,6 @@ using Snap.Hutao.Service.Notification; using Snap.Hutao.Service.User; using Snap.Hutao.View.Dialog; using Snap.Hutao.ViewModel.Guide; -using Snap.Hutao.Web.Hoyolab; using Snap.Hutao.Web.Hutao; using Snap.Hutao.Web.Response; using System.Globalization; 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 417d6137..74711855 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 @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient; +using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Web.Request.Builder; using Snap.Hutao.Web.Request.Builder.Abstraction; using Snap.Hutao.Web.Response; From 95531db559ff28b75c8288887993807e10f4594b Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Wed, 20 Dec 2023 13:16:14 +0800 Subject: [PATCH 05/13] use struct --- .../Model/Entity/SettingEntry.Constant.cs | 2 +- .../Snap.Hutao/Model/Intrinsic/RegionType.cs | 15 -- .../Snap.Hutao/Resource/Localization/SH.resx | 39 +++--- .../Abstraction/IAnnouncementService.cs | 4 +- .../Snap.Hutao/Service/AnnouncementService.cs | 4 +- .../Snap.Hutao/Service/AppOptions.cs | 12 +- .../Snap.Hutao/Service/KnownRegions.cs | 29 ++++ .../Service/SupportedRegionTypes.cs | 41 ------ .../Snap.Hutao/View/Page/SettingPage.xaml | 132 +++++++++--------- .../ViewModel/Home/AnnouncementViewModel.cs | 2 +- .../ViewModel/Setting/SettingViewModel.cs | 12 +- .../Common/Announcement/AnnouncementClient.cs | 27 ++-- .../Snap.Hutao/Web/Hoyolab/HoyolabRegex.cs | 15 ++ .../Snap.Hutao/Web/Hoyolab/PlayerUid.cs | 11 +- .../Snap.Hutao/Web/Hoyolab/Region.cs | 72 ++++++++++ 15 files changed, 232 insertions(+), 185 deletions(-) delete mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/RegionType.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabRegex.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Region.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs index 76338c22..a62fd8e2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs @@ -128,5 +128,5 @@ internal sealed partial class SettingEntry /// public const string GeetestCustomCompositeUrl = "GeetestCustomCompositeUrl"; - public const string RegionType = "RegionType"; + public const string Region = "Region"; } diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/RegionType.cs b/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/RegionType.cs deleted file mode 100644 index 5022a74f..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/RegionType.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -namespace Snap.Hutao.Model.Intrinsic; - -[HighQuality] -internal enum RegionType -{ - CN_GF01 = 1, - CN_QD01 = 5, - OS_USA = 6, - OS_EURO = 7, - OS_ASIA = 8, - OS_CHT = 9, -} diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index a949046c..3c01b513 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -355,24 +355,6 @@ 一星 - - 国服 官方服 - - - 国服 渠道服 - - - 国际服 亚服 - - - 国际服 台服 - - - 国际服 欧服 - - - 国际服 美服 - Need EXACT same string in game @@ -2876,8 +2858,29 @@ 下载链接复制成功 + + 无效的服务器 + 无效的 UID + + + 国服 官方服 + + + 国服 渠道服 + + + 国际服 亚服 + + + 国际服 台服 + + + 国际服 欧服 + + + 国际服 美服 胡桃服务维护中 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs index 65efd10f..a6754d27 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IAnnouncementService.cs @@ -1,7 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Model.Intrinsic; +using Snap.Hutao.Web.Hoyolab; using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; namespace Snap.Hutao.Service.Abstraction; @@ -19,5 +19,5 @@ internal interface IAnnouncementService /// 服务器 /// 取消令牌 /// 公告包装器 - ValueTask GetAnnouncementWrapperAsync(string languageCode, RegionType region, CancellationToken cancellationToken = default); + ValueTask GetAnnouncementWrapperAsync(string languageCode, Region 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 49b1d9b2..fcd004cc 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs @@ -2,8 +2,8 @@ // Licensed under the MIT license. using Microsoft.Extensions.Caching.Memory; -using Snap.Hutao.Model.Intrinsic; 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; @@ -26,7 +26,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService private readonly IMemoryCache memoryCache; /// - public async ValueTask GetAnnouncementWrapperAsync(string languageCode, RegionType region, CancellationToken cancellationToken = default) + public async ValueTask GetAnnouncementWrapperAsync(string languageCode, Region region, CancellationToken cancellationToken = default) { // 缓存中存在记录,直接返回 if (memoryCache.TryGetRequiredValue($"{CacheKey}.{languageCode}.{region}", out AnnouncementWrapper? cache)) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index a6646454..e87f66a1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -5,8 +5,8 @@ using Microsoft.Extensions.Primitives; using Snap.Hutao.Core.Windowing; using Snap.Hutao.Model; using Snap.Hutao.Model.Entity; -using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Service.Abstraction; +using Snap.Hutao.Web.Hoyolab; using System.Globalization; using System.IO; @@ -20,7 +20,7 @@ internal sealed partial class AppOptions : DbStoreOptions private bool? isEmptyHistoryWishVisible; private BackdropType? backdropType; private CultureInfo? currentCulture; - private RegionType? regionType; + private Region? region; private string? geetestCustomCompositeUrl; public string PowerShellPath @@ -74,12 +74,12 @@ internal sealed partial class AppOptions : DbStoreOptions set => SetOption(ref currentCulture, SettingEntry.Culture, value, value => value.Name); } - public List> RegionTypes { get; } = SupportedRegionTypes.Get(); + public List Regions { get; } = KnownRegions.Get(); - public RegionType RegionType + public Region Region { - get => GetOption(ref regionType, SettingEntry.RegionType, v => Enum.Parse(v), RegionType.CN_GF01).Value; - set => SetOption(ref regionType, SettingEntry.RegionType, value, value => value.ToStringOrEmpty()); + get => GetOption(ref region, SettingEntry.Region, v => Region.FromRegion(v), Regions[0]).Value; + set => SetOption(ref region, SettingEntry.Region, value, value => value.Value.Value); } public string GeetestCustomCompositeUrl diff --git a/src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs b/src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs new file mode 100644 index 00000000..08b30bc7 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs @@ -0,0 +1,29 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Web.Hoyolab; + +namespace Snap.Hutao.Service; + +internal static class KnownRegions +{ + private static readonly Region RegionCnGf01 = new("cn_gf01"); + private static readonly Region RegionCnQd01 = new("cn_qd01"); + private static readonly Region RegionOsUsa = new("os_usa"); + private static readonly Region RegionOsEuro = new("os_euro"); + private static readonly Region RegionOsAsia = new("os_asia"); + private static readonly Region RegionOsCht = new("os_cht"); + + public static List Get() + { + return + [ + RegionCnGf01, + RegionCnQd01, + RegionOsUsa, + RegionOsEuro, + RegionOsAsia, + RegionOsCht, + ]; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs b/src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs deleted file mode 100644 index 5e585cf7..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Service/SupportedRegionTypes.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Snap.Hutao.Model; -using Snap.Hutao.Model.Intrinsic; - -namespace Snap.Hutao.Service; - -internal static class SupportedRegionTypes -{ - private static readonly List> Cultures = - [ - ToNameValue(RegionType.CN_GF01), - ToNameValue(RegionType.CN_QD01), - ToNameValue(RegionType.OS_USA), - ToNameValue(RegionType.OS_EURO), - ToNameValue(RegionType.OS_ASIA), - ToNameValue(RegionType.OS_CHT), - ]; - - public static List> Get() - { - return Cultures; - } - - private static NameValue ToNameValue(RegionType regionType) - { - return new( - regionType switch - { - RegionType.CN_GF01 => SH.ModelIntrinsicRegionTypeCnGf01, - RegionType.CN_QD01 => SH.ModelIntrinsicRegionTypeCnQd01, - RegionType.OS_USA => SH.ModelIntrinsicRegionTypeOsUsa, - RegionType.OS_EURO => SH.ModelIntrinsicRegionTypeOsEuro, - RegionType.OS_ASIA => SH.ModelIntrinsicRegionTypeOsAsia, - RegionType.OS_CHT => SH.ModelIntrinsicRegionTypeOsCht, - _ => SH.ModelIntrinsicRegionTypeCnGf01, - }, - regionType); - } -} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml index d35822a4..f42a22c6 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml @@ -18,7 +18,7 @@ mc:Ignorable="d"> - + @@ -30,20 +30,20 @@ VerticalAlignment="Stretch" cw:UIElementExtensions.ClipToBounds="True" CornerRadius="{ThemeResource ControlCornerRadius}"> - + - - - + + + + Source="ms-appx:///Assets/Square44x44Logo.targetsize-256.png" /> + Content="{shcm:ResourceString Name=ViewPageSettingUpdateCheckAction}" /> + Content="{shcm:ResourceString Name=ViewPageSettingStoreReviewNavigate}" /> + NavigateUri="{StaticResource DocumentLink_Home}" /> + NavigateUri="{StaticResource DocumentLink_BugReport}" /> + NavigateUri="{StaticResource DocumentLink_Translate}" /> + NavigateUri="{StaticResource Sponsor_Afadian}" /> + TextWrapping="Wrap" /> @@ -109,9 +109,9 @@ Command="{Binding CopyDeviceIdCommand}" Description="{Binding HutaoOptions.DeviceId}" Header="{shcm:ResourceString Name=ViewPageSettingDeviceIdHeader}" - IsClickEnabled="True"/> - - + IsClickEnabled="True" /> + +