From 173a1343c1a0a860302b5d6d6aa592b37e8ab72b Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Mon, 10 Jul 2023 09:31:16 +0800 Subject: [PATCH] Hutao GachaEvent Statistics 1 --- .../Extension/EnumerableExtension.cs | 4 +-- src/Snap.Hutao/Snap.Hutao/Program.cs | 2 +- .../Snap.Hutao/Service/AnnouncementService.cs | 4 +-- .../GachaLogQueryProviderExtension.cs | 2 +- ...ider.cs => GachaLogQuerySTokenProvider.cs} | 4 +-- .../Game/Locator/RegistryLauncherLocator.cs | 4 +-- .../Service/Game/Package/PackageConverter.cs | 4 +-- .../Service/Hutao/HutaoUserOptions.cs | 1 + .../Service/Metadata/MetadataOptions.cs | 2 +- .../Service/Metadata/MetadataService.cs | 4 +-- .../Service/Navigation/NavigationService.cs | 2 +- .../ViewModel/GachaLog/GachaStatisticsSlim.cs | 21 ++++++++++++++++ .../GachaLog/HutaoCloudStatisticsViewModel.cs | 16 ++++++++++++ .../ViewModel/GachaLog/HutaoCloudViewModel.cs | 13 ++++++---- .../ViewModel/GachaLog/HutaoWishSummary.cs | 9 +++++++ .../Web/Bridge/MiHoYoJSInterface.cs | 4 +-- .../Annotation/ApiInformationAttribute.cs | 1 - .../Hutao/GachaLog/GachaEventStatistics.cs | 25 +++++++++++++++++++ .../Web/Hutao/GachaLog/GachaItem.cs | 2 +- .../Web/Hutao/GachaLog/ItemCount.cs | 20 +++++++++++++++ .../Web/Hutao/HomaGachaLogClient.cs | 12 +++++++++ .../Snap.Hutao/Web/HutaoEndpoints.cs | 5 ++++ 22 files changed, 136 insertions(+), 25 deletions(-) rename src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/{GachaLogQuerySToken2Provider.cs => GachaLogQuerySTokenProvider.cs} (91%) create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudStatisticsViewModel.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoWishSummary.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/ItemCount.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs index c5e3e54e..b2246dbe 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs @@ -81,7 +81,7 @@ internal static partial class EnumerableExtension /// Collection to convert. Cannot be . /// Delimiter between elements in the final string. /// Converted collection into string. - public static string ToString(this IEnumerable collection, char separator = ',') + public static string ToString(this IEnumerable collection, char separator) { string result = string.Join(separator, collection); return result.Length > 0 ? result : string.Empty; @@ -95,7 +95,7 @@ internal static partial class EnumerableExtension /// Delimiter between elements in the final string. /// A string to be returned if collection has no elements. /// Converted collection into string. - public static string ToString(this IEnumerable collection, char separator = ',', string defaultValue = "") + public static string ToString(this IEnumerable collection, char separator, string defaultValue) { string result = string.Join(separator, collection); return result.Length > 0 ? result : defaultValue; diff --git a/src/Snap.Hutao/Snap.Hutao/Program.cs b/src/Snap.Hutao/Snap.Hutao/Program.cs index 575245c7..4b39db74 100644 --- a/src/Snap.Hutao/Snap.Hutao/Program.cs +++ b/src/Snap.Hutao/Snap.Hutao/Program.cs @@ -25,7 +25,7 @@ public static partial class Program [STAThread] private static void Main(string[] args) { - System.Diagnostics.Debug.WriteLine($"[Arguments]:[{EnumerableExtension.ToString(args)}]"); + System.Diagnostics.Debug.WriteLine($"[Arguments]:[{args.ToString(',')}]"); XamlCheckProcessRequirements(); ComWrappersSupport.InitializeComWrappers(); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs index 4d2ad0bb..c088e1e7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs @@ -65,7 +65,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService private static void JoinAnnouncements(Dictionary contentMap, List announcementListWrappers) { - Regex timeTagRegrex = XmlTagRegex(); + Regex timeTagRegex = XmlTagRegex(); foreach (ref AnnouncementListWrapper listWrapper in CollectionsMarshal.AsSpan(announcementListWrappers)) { @@ -74,7 +74,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService if (contentMap.TryGetValue(item.AnnId, out string? rawContent)) { // remove tag - rawContent = timeTagRegrex.Replace(rawContent!, x => x.Groups[1].Value); + rawContent = timeTagRegex.Replace(rawContent, x => x.Groups[1].Value); } item.Content = rawContent ?? string.Empty; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQueryProviderExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQueryProviderExtension.cs index aef7ec09..57642db0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQueryProviderExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQueryProviderExtension.cs @@ -21,7 +21,7 @@ internal static class GachaLogQueryProviderExtension string? name = option switch { RefreshOption.WebCache => nameof(GachaLogQueryWebCacheProvider), - RefreshOption.SToken => nameof(GachaLogQuerySToken2Provider), + RefreshOption.SToken => nameof(GachaLogQuerySTokenProvider), RefreshOption.ManualInput => nameof(GachaLogQueryManualInputProvider), _ => null, }; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQuerySToken2Provider.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQuerySTokenProvider.cs similarity index 91% rename from src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQuerySToken2Provider.cs rename to src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQuerySTokenProvider.cs index 7b2e0c8e..3c1e11f4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQuerySToken2Provider.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/QueryProvider/GachaLogQuerySTokenProvider.cs @@ -15,13 +15,13 @@ namespace Snap.Hutao.Service.GachaLog.QueryProvider; [HighQuality] [ConstructorGenerated] [Injection(InjectAs.Transient, typeof(IGachaLogQueryProvider))] -internal sealed partial class GachaLogQuerySToken2Provider : IGachaLogQueryProvider +internal sealed partial class GachaLogQuerySTokenProvider : IGachaLogQueryProvider { private readonly BindingClient2 bindingClient2; private readonly IUserService userService; /// - public string Name { get => nameof(GachaLogQuerySToken2Provider); } + public string Name { get => nameof(GachaLogQuerySTokenProvider); } /// public async Task> GetQueryAsync() diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/RegistryLauncherLocator.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/RegistryLauncherLocator.cs index 8f353984..65688bc4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/RegistryLauncherLocator.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/RegistryLauncherLocator.cs @@ -36,7 +36,7 @@ internal sealed partial class RegistryLauncherLocator : IGameLocator { string? path = Path.GetDirectoryName(result.Value); string configPath = Path.Combine(path!, GameConstants.ConfigFileName); - string? escapedPath = null; + string? escapedPath; using (FileStream stream = File.OpenRead(configPath)) { IEnumerable elements = IniSerializer.Deserialize(stream); @@ -79,7 +79,7 @@ internal sealed partial class RegistryLauncherLocator : IGameLocator private static string Unescape(string str) { - string? hex4Result = UTF16Regex().Replace(str, @"\u$1"); + string hex4Result = UTF16Regex().Replace(str, @"\u$1"); // 不包含中文 // Some one's folder might begin with 'u' diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs index 42bb05df..38c3d98a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs @@ -320,7 +320,7 @@ internal sealed partial class PackageConverter Dictionary results = new(); using (StreamReader reader = new(stream)) { - while (await reader.ReadLineAsync().ConfigureAwait(false) is string raw) + while (await reader.ReadLineAsync().ConfigureAwait(false) is { } raw) { if (string.IsNullOrEmpty(raw)) { @@ -341,7 +341,7 @@ internal sealed partial class PackageConverter using (StreamReader reader = new(stream)) { - while (await reader.ReadLineAsync().ConfigureAwait(false) is string raw) + while (await reader.ReadLineAsync().ConfigureAwait(false) is { } raw) { if (string.IsNullOrEmpty(raw)) { diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs index 819e7744..4a0492c8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs @@ -85,6 +85,7 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions DateTimeOffset.Now; GachaLogExpireAt = string.Format(SH.ServiceHutaoUserGachaLogExpiredAt, userInfo.GachaLogExpireAt); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs index bef766b0..b15f7bed 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs @@ -97,7 +97,7 @@ internal sealed partial class MetadataOptions : IOptions while (true) { - if (cultureInfo == CultureInfo.InvariantCulture) + if (Equals(cultureInfo, CultureInfo.InvariantCulture)) { // Fallback to Chinese. return "CHS"; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs index 9e4ccc10..95609d21 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs @@ -144,7 +144,7 @@ internal sealed partial class MetadataService : IMetadataService, IMetadataServi { using (StreamWriter streamWriter = File.CreateText(metadataOptions.GetLocalizedLocalFile(fileFullName))) { - while (await streamReader.ReadLineAsync(token).ConfigureAwait(false) is string line) + while (await streamReader.ReadLineAsync(token).ConfigureAwait(false) is { } line) { await streamWriter.WriteAsync(line).ConfigureAwait(false); @@ -182,7 +182,7 @@ internal sealed partial class MetadataService : IMetadataService, IMetadataServi else { FileNotFoundException exception = new(SH.ServiceMetadataFileNotFound, fileName); - throw ThrowHelper.UserdataCorrupted(SH.ServiceMetadataFileNotFound, null!); + throw ThrowHelper.UserdataCorrupted(SH.ServiceMetadataFileNotFound, exception); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs index d794dd24..964224e6 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs @@ -203,7 +203,7 @@ internal sealed partial class NavigationService : INavigationService, INavigatio private void OnBackRequested(NavigationView sender, NavigationViewBackRequestedEventArgs args) { - if (frame != null && frame.CanGoBack) + if (frame is { CanGoBack: true }) { frame.GoBack(); SyncSelectedNavigationViewItemWith(frame.Content.GetType()); diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatisticsSlim.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatisticsSlim.cs index 75beb5f3..6a52e1d3 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatisticsSlim.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatisticsSlim.cs @@ -27,4 +27,25 @@ internal sealed class GachaStatisticsSlim /// 奔行世间 /// public TypedWishSummarySlim StandardWish { get; set; } = default!; +} + +/// +/// 简化的祈愿统计 +/// +internal sealed class HutaoStatistics +{ + /// + /// 角色活动 + /// + public TypedWishSummarySlim AvatarEvent { get; set; } = default!; + + /// + /// 角色活动2 + /// + public TypedWishSummarySlim AvatarEvent2 { get; set; } = default!; + + /// + /// 神铸赋形 + /// + public TypedWishSummarySlim WeaponWish { get; set; } = default!; } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudStatisticsViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudStatisticsViewModel.cs new file mode 100644 index 00000000..d087f81f --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudStatisticsViewModel.cs @@ -0,0 +1,16 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.ViewModel.GachaLog; + +/// +/// 胡桃云服务统计视图模型 +/// +[ConstructorGenerated] +[Injection(InjectAs.Scoped)] +internal sealed partial class HutaoCloudStatisticsViewModel +{ + +} + +public \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs index 32ce6b56..d29d2229 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs @@ -130,12 +130,15 @@ internal sealed partial class HutaoCloudViewModel : Abstraction.ViewModel private async Task RefreshUidCollectionAsync() { - Response> resp = await hutaoCloudService.GetUidsAsync().ConfigureAwait(false); - - await taskContext.SwitchToMainThreadAsync(); - if (Options.IsCloudServiceAllowed = resp.IsOk()) + if (Options.IsCloudServiceAllowed) { - Uids = resp.Data!.ToObservableCollection(); + Response> resp = await hutaoCloudService.GetUidsAsync().ConfigureAwait(false); + + await taskContext.SwitchToMainThreadAsync(); + if (resp.IsOk()) + { + Uids = resp.Data!.ToObservableCollection(); + } } } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoWishSummary.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoWishSummary.cs new file mode 100644 index 00000000..da6c60a0 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoWishSummary.cs @@ -0,0 +1,9 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.ViewModel.GachaLog; + +internal sealed class HutaoWishSummary +{ + public GachaEvent +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs index 97a80306..1ca00360 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs @@ -72,7 +72,7 @@ internal class MiHoYoJSInterface User user = serviceProvider.GetRequiredService().Current!; return await serviceProvider .GetRequiredService() - .GetActionTicketBySTokenAsync(jsParam.Payload!.ActionType, user.Entity) + .GetActionTicketBySTokenAsync(jsParam.Payload.ActionType, user.Entity) .ConfigureAwait(false); } @@ -200,7 +200,7 @@ internal class MiHoYoJSInterface { IUserService userService = serviceProvider.GetRequiredService(); User user = userService.Current!; - if (param.Payload!.ForceRefresh) + if (param.Payload.ForceRefresh) { await userService.RefreshCookieTokenAsync(user).ConfigureAwait(false); } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Annotation/ApiInformationAttribute.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Annotation/ApiInformationAttribute.cs index 26163c0d..00f54be0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Annotation/ApiInformationAttribute.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Annotation/ApiInformationAttribute.cs @@ -9,7 +9,6 @@ namespace Snap.Hutao.Web.Hoyolab.Annotation; /// API 信息 /// 指示此API 已经经过验证,且明确其调用 /// -/// API 的返回类型 [AttributeUsage(AttributeTargets.Method)] internal sealed class ApiInformationAttribute : Attribute { diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs new file mode 100644 index 00000000..845c231d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs @@ -0,0 +1,25 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hutao.GachaLog; + +/// +/// 祈愿活动统计 +/// +internal sealed class GachaEventStatistics +{ + /// + /// 角色活动1 + /// + public List AvatarEvent { get; set; } = default!; + + /// + /// 角色活动2 + /// + public List AvatarEvent2 { get; set; } = default!; + + /// + /// 武器活动 + /// + public List WeaponEvent { get; set; } = default!; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs index 066894a2..058a3081 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs @@ -36,4 +36,4 @@ internal sealed class GachaItem /// Id /// public long Id { get; set; } -} +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/ItemCount.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/ItemCount.cs new file mode 100644 index 00000000..50849f1e --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/ItemCount.cs @@ -0,0 +1,20 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hutao.GachaLog; + +/// +/// 物品与个数 +/// +internal sealed class ItemCount +{ + /// + /// 物品 Id + /// + public uint Item { get; set; } + + /// + /// 个数 + /// + public uint Count { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaGachaLogClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaGachaLogClient.cs index 405732d0..08f35a23 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaGachaLogClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaGachaLogClient.cs @@ -35,7 +35,19 @@ internal sealed class HomaGachaLogClient httpClient.DefaultRequestHeaders.Authorization = new("Bearer", hutaoUserOptions.Token); } + /// + /// 异步获取祈愿统计信息 + /// + /// 取消令牌 + /// 祈愿统计信息 + public async Task> GetGachaEventStatisticsAsync(CancellationToken token = default) + { + Response? resp = await httpClient + .TryCatchGetFromJsonAsync>(HutaoEndpoints.GachaLogUids, options, logger, token) + .ConfigureAwait(false); + return Response.Response.DefaultIfNull(resp); + } /// /// 异步获取 Uid 列表 diff --git a/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs index e75df285..617e069e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs @@ -52,6 +52,11 @@ internal static class HutaoEndpoints { return $"{HomaSnapGenshinApi}/GachaLog/Delete?Uid={uid}"; } + + /// + /// 获取祈愿统计信息 + /// + public const string GachaLogStatisticsCurrentEvents = $"{HomaSnapGenshinApi}/GachaLog/Statistics/CurrentEventStatistics"; #endregion #region Passport