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