From 09abb46159f118d93744aa094fe22b755e7f7bb0 Mon Sep 17 00:00:00 2001
From: DismissedLight <1686188646@qq.com>
Date: Sat, 25 Mar 2023 21:26:17 +0800
Subject: [PATCH] fixup some code style phase 1
---
.../HttpClientGenerator.cs | 65 +++---
.../InjectionGenerator.cs | 45 +++--
.../Snap.Hutao/Core/Caching/ImageCache.cs | 2 +-
.../Snap.Hutao/Core/CoreEnvironment.cs | 16 +-
.../HttpClient/HttpClientAttribute.cs | 2 +-
...igration.cs => HttpClientConfiguration.cs} | 2 +-
.../IocHttpClientConfiguration.cs | 10 +-
.../Snap.Hutao/Model/Binding/User/User.cs | 190 +++++++++---------
.../Snap.Hutao/Model/Entity/User.cs | 2 +-
.../Resource/Localization/SH.Designer.cs | 9 +
.../Snap.Hutao/Resource/Localization/SH.resx | 3 +
.../Service/Game/Package/PackageConverter.cs | 2 +-
.../Service/Metadata/MetadataService.cs | 2 +-
.../Snap.Hutao/Service/User/UserService.cs | 2 +-
.../View/Dialog/SignInWebViewDialog.xaml.cs | 2 +-
.../Web/Bridge/CoreWebView2Extension.cs | 4 +-
.../Snap.Hutao/Web/Enka/EnkaClient.cs | 2 +-
.../Snap.Hutao/Web/Geetest/GeetestClient.cs | 2 +-
.../Web/Hoyolab/App/Account/AccountClient.cs | 2 +-
.../Web/Hoyolab/Bbs/User/UserClient.cs | 2 +-
.../Snap.Hutao/Web/Hoyolab/Cookie.cs | 2 +-
.../Common/Announcement/AnnouncementClient.cs | 2 +-
.../Hk4e/Event/GachaInfo/GachaInfoClient.cs | 2 +-
.../Web/Hoyolab/Passport/PassportClient.cs | 2 +-
.../Web/Hoyolab/Passport/PassportClient2.cs | 2 +-
.../Web/Hoyolab/Passport/PassportClientOs.cs | 2 +-
.../SdkStatic/Hk4e/Launcher/ResourceClient.cs | 2 +-
.../Web/Hoyolab/Takumi/Auth/AuthClient.cs | 2 +-
.../Web/Hoyolab/Takumi/Auth/AuthClientOs.cs | 2 +-
.../Hoyolab/Takumi/Binding/BindingClient.cs | 2 +-
.../Hoyolab/Takumi/Binding/BindingClient2.cs | 2 +-
.../Takumi/Event/Calculate/CalculateClient.cs | 2 +-
.../Hoyolab/Takumi/GameRecord/CardClient.cs | 2 +-
.../Takumi/GameRecord/GameRecordClient.cs | 2 +-
.../Takumi/GameRecord/GameRecordClientOs.cs | 2 +-
.../Web/Hutao/HomaLogUploadClient.cs | 2 +-
.../Web/Hutao/HomaPassportClient.cs | 2 +-
.../Web/Hutao/HomaSpiralAbyssClient.cs | 2 +-
38 files changed, 213 insertions(+), 189 deletions(-)
rename src/Snap.Hutao/Snap.Hutao.SourceGeneration/{DedendencyInjection => DependencyInjection}/HttpClientGenerator.cs (79%)
rename src/Snap.Hutao/Snap.Hutao.SourceGeneration/{DedendencyInjection => DependencyInjection}/InjectionGenerator.cs (83%)
rename src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/{HttpClientConfigration.cs => HttpClientConfiguration.cs} (93%)
diff --git a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DedendencyInjection/HttpClientGenerator.cs b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DependencyInjection/HttpClientGenerator.cs
similarity index 79%
rename from src/Snap.Hutao/Snap.Hutao.SourceGeneration/DedendencyInjection/HttpClientGenerator.cs
rename to src/Snap.Hutao/Snap.Hutao.SourceGeneration/DependencyInjection/HttpClientGenerator.cs
index a83e2136..00fd6703 100644
--- a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DedendencyInjection/HttpClientGenerator.cs
+++ b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DependencyInjection/HttpClientGenerator.cs
@@ -11,7 +11,7 @@ using System.Collections.Immutable;
using System.Linq;
using System.Text;
-namespace Snap.Hutao.SourceGeneration.DedendencyInjection;
+namespace Snap.Hutao.SourceGeneration.DependencyInjection;
///
/// 注入HttpClient代码生成器
@@ -21,10 +21,10 @@ namespace Snap.Hutao.SourceGeneration.DedendencyInjection;
[Generator]
public class HttpClientGenerator : ISourceGenerator
{
- private const string DefaultName = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfigration.Default";
- private const string XRpcName = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfigration.XRpc";
- private const string XRpc2Name = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfigration.XRpc2";
- private const string XRpc3Name = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfigration.XRpc3";
+ private const string DefaultName = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfiguration.Default";
+ private const string XRpcName = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfiguration.XRpc";
+ private const string XRpc2Name = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfiguration.XRpc2";
+ private const string XRpc3Name = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.HttpClientConfiguration.XRpc3";
private const string PrimaryHttpMessageHandlerAttributeName = "Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient.PrimaryHttpMessageHandlerAttribute";
private const string DynamicSecretAttributeName = "Snap.Hutao.Web.Hoyolab.DynamicSecret.UseDynamicSecretAttribute";
@@ -49,29 +49,34 @@ public class HttpClientGenerator : ISourceGenerator
StringBuilder sourceCodeBuilder = new();
- sourceCodeBuilder.Append($@"// Copyright (c) DGP Studio. All rights reserved.
-// Licensed under the MIT license.
-
-// This class is generated by Snap.Hutao.SourceGeneration
-
-using Microsoft.Extensions.DependencyInjection;
-using Snap.Hutao.Web.Hoyolab.DynamicSecret;
-using System.Net.Http;
-
-namespace Snap.Hutao.Core.DependencyInjection;
-
-internal static partial class IocHttpClientConfiguration
-{{
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""{toolName}"",""1.0.0.0"")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- public static partial IServiceCollection AddHttpClients(this IServiceCollection services)
- {{");
+ sourceCodeBuilder.Append($$"""
+ // Copyright (c) DGP Studio. All rights reserved.
+ // Licensed under the MIT license.
+
+ // This class is generated by Snap.Hutao.SourceGeneration
+
+ using Microsoft.Extensions.DependencyInjection;
+ using Snap.Hutao.Web.Hoyolab.DynamicSecret;
+ using System.Net.Http;
+
+ namespace Snap.Hutao.Core.DependencyInjection;
+
+ internal static partial class IocHttpClientConfiguration
+ {
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{toolName}}","1.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static partial IServiceCollection AddHttpClients(this IServiceCollection services)
+ {
+ """);
FillWithInjectionServices(receiver, sourceCodeBuilder);
- sourceCodeBuilder.Append(@"
- return services;
- }
-}");
+
+ sourceCodeBuilder.Append("""
+
+ return services;
+ }
+ }
+ """);
context.AddSource("IocHttpClientConfiguration.g.cs", SourceText.From(sourceCodeBuilder.ToString(), Encoding.UTF8));
}
@@ -110,7 +115,7 @@ internal static partial class IocHttpClientConfiguration
lineBuilder.Append("XRpc3Configuration)");
break;
default:
- throw new InvalidOperationException($"非法的HttpClientConfigration值: [{injectAsName}]");
+ throw new InvalidOperationException($"非法的 HttpClientConfiguration 值: [{injectAsName}]");
}
AttributeData? handlerInfo = classSymbol
@@ -124,11 +129,11 @@ internal static partial class IocHttpClientConfiguration
foreach (KeyValuePair property in properties)
{
- lineBuilder.Append(" ");
+ lineBuilder.Append(' ');
lineBuilder.Append(property.Key);
lineBuilder.Append(" = ");
lineBuilder.Append(property.Value.ToCSharpString());
- lineBuilder.Append(",");
+ lineBuilder.Append(',');
}
lineBuilder.Append(" })");
@@ -139,7 +144,7 @@ internal static partial class IocHttpClientConfiguration
lineBuilder.Append(".AddHttpMessageHandler()");
}
- lineBuilder.Append(";");
+ lineBuilder.Append(';');
lines.Add(lineBuilder.ToString());
}
diff --git a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DedendencyInjection/InjectionGenerator.cs b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DependencyInjection/InjectionGenerator.cs
similarity index 83%
rename from src/Snap.Hutao/Snap.Hutao.SourceGeneration/DedendencyInjection/InjectionGenerator.cs
rename to src/Snap.Hutao/Snap.Hutao.SourceGeneration/DependencyInjection/InjectionGenerator.cs
index d55b18de..9423035b 100644
--- a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DedendencyInjection/InjectionGenerator.cs
+++ b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/DependencyInjection/InjectionGenerator.cs
@@ -11,7 +11,7 @@ using System.Collections.Immutable;
using System.Linq;
using System.Text;
-namespace Snap.Hutao.SourceGeneration.DedendencyInjection;
+namespace Snap.Hutao.SourceGeneration.DependencyInjection;
///
/// 注入代码生成器
@@ -44,27 +44,30 @@ public class InjectionGenerator : ISourceGenerator
string toolName = this.GetGeneratorType().FullName;
StringBuilder sourceCodeBuilder = new();
- sourceCodeBuilder.Append($@"// Copyright (c) DGP Studio. All rights reserved.
-// Licensed under the MIT license.
-
-// This class is generated by Snap.Hutao.SourceGeneration
-
-using Microsoft.Extensions.DependencyInjection;
-
-namespace Snap.Hutao.Core.DependencyInjection;
-
-internal static partial class ServiceCollectionExtension
-{{
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""{toolName}"",""1.0.0.0"")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- public static partial IServiceCollection AddInjections(this IServiceCollection services)
- {{");
+ sourceCodeBuilder.Append($$"""
+ // Copyright (c) DGP Studio. All rights reserved.
+ // Licensed under the MIT license.
+
+ // This class is generated by Snap.Hutao.SourceGeneration
+
+ using Microsoft.Extensions.DependencyInjection;
+
+ namespace Snap.Hutao.Core.DependencyInjection;
+
+ internal static partial class ServiceCollectionExtension
+ {
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{toolName}}","1.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static partial IServiceCollection AddInjections(this IServiceCollection services)
+ {
+ """);
FillWithInjectionServices(receiver, sourceCodeBuilder);
- sourceCodeBuilder.Append(@"
- return services;
- }
-}");
+ sourceCodeBuilder.Append("""
+ return services;
+ }
+ }
+ """);
context.AddSource("ServiceCollectionExtension.g.cs", SourceText.From(sourceCodeBuilder.ToString(), Encoding.UTF8));
}
@@ -153,4 +156,4 @@ internal static partial class ServiceCollectionExtension
}
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs b/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs
index 23a8a390..81181c6a 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs
@@ -18,7 +18,7 @@ namespace Snap.Hutao.Core.Caching;
///
[HighQuality]
[Injection(InjectAs.Singleton, typeof(IImageCache))]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
[PrimaryHttpMessageHandler(MaxConnectionsPerServer = 8)]
internal sealed class ImageCache : IImageCache, IImageCacheFilePathOperation
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs b/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs
index 4684dc78..435770cf 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs
@@ -24,21 +24,31 @@ internal static class CoreEnvironment
///
public const string HoyolabUA = $"Mozilla/5.0 (Windows NT 10.0; Win64; x64) miHoYoBBS/{HoyolabXrpcVersion}";
+ ///
+ /// Hoyolab请求UA
+ ///
+ public const string HoyolabOsUA = $"Mozilla/5.0 (Windows NT 10.0; Win64; x64) miHoYoBBSOversea/{HoyolabOsXrpcVersion}";
+
///
/// 米游社移动端请求UA
///
public const string HoyolabMobileUA = $"Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBS/{HoyolabXrpcVersion}";
///
- /// Hoyolab iPhone 移动端请求UA
+ /// Hoyolab 移动端请求UA
///
- public const string HoyolabOsMobileUA = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBSOversea/2.28.0";
+ public const string HoyolabOsMobileUA = $"Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBSOversea/{HoyolabOsXrpcVersion}";
///
/// 米游社 Rpc 版本
///
public const string HoyolabXrpcVersion = "2.44.1";
+ ///
+ /// Hoyolab Rpc 版本
+ ///
+ public const string HoyolabOsXrpcVersion = "2.28.0";
+
///
/// 盐
///
@@ -50,6 +60,8 @@ internal static class CoreEnvironment
[SaltType.X4] = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs",
[SaltType.X6] = "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
[SaltType.PROD] = "JwYDpKvLj6MrMqqYU6jTKF17KNO2PXoS",
+
+ // This SALT is not reliable
[SaltType.OS] = "6cqshh5dhw73bzxn20oexa9k516chk7s",
}.ToImmutableDictionary();
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientAttribute.cs b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientAttribute.cs
index f3f77c84..b8a8145a 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientAttribute.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientAttribute.cs
@@ -15,7 +15,7 @@ internal sealed class HttpClientAttribute : Attribute
/// 构造一个新的特性
///
/// 配置
- public HttpClientAttribute(HttpClientConfigration configration)
+ public HttpClientAttribute(HttpClientConfiguration configration)
{
}
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientConfigration.cs b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientConfiguration.cs
similarity index 93%
rename from src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientConfigration.cs
rename to src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientConfiguration.cs
index 6bc5419c..76609c09 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientConfigration.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/Annotation/HttpClient/HttpClientConfiguration.cs
@@ -7,7 +7,7 @@ namespace Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient;
/// Http客户端配置
///
[HighQuality]
-internal enum HttpClientConfigration
+internal enum HttpClientConfiguration
{
///
/// 默认配置
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs
index dc6de29b..451a1c66 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs
@@ -12,6 +12,8 @@ namespace Snap.Hutao.Core.DependencyInjection;
[HighQuality]
internal static partial class IocHttpClientConfiguration
{
+ private const string ApplicationJson = "application/json";
+
///
/// 添加
///
@@ -37,7 +39,7 @@ internal static partial class IocHttpClientConfiguration
{
client.Timeout = Timeout.InfiniteTimeSpan;
client.DefaultRequestHeaders.UserAgent.ParseAdd(CoreEnvironment.HoyolabUA);
- client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
+ client.DefaultRequestHeaders.Accept.ParseAdd(ApplicationJson);
client.DefaultRequestHeaders.Add("x-rpc-app_version", CoreEnvironment.HoyolabXrpcVersion);
client.DefaultRequestHeaders.Add("x-rpc-client_type", "5");
client.DefaultRequestHeaders.Add("x-rpc-device_id", CoreEnvironment.HoyolabDeviceId);
@@ -51,7 +53,7 @@ internal static partial class IocHttpClientConfiguration
{
client.Timeout = Timeout.InfiniteTimeSpan;
client.DefaultRequestHeaders.UserAgent.ParseAdd(CoreEnvironment.HoyolabUA);
- client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
+ client.DefaultRequestHeaders.Accept.ParseAdd(ApplicationJson);
client.DefaultRequestHeaders.Add("x-rpc-aigis", string.Empty);
client.DefaultRequestHeaders.Add("x-rpc-app_id", "bll8iq97cem8");
client.DefaultRequestHeaders.Add("x-rpc-app_version", CoreEnvironment.HoyolabXrpcVersion);
@@ -69,8 +71,8 @@ internal static partial class IocHttpClientConfiguration
private static void XRpc3Configuration(HttpClient client)
{
client.Timeout = Timeout.InfiniteTimeSpan;
- client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36");
- client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
+ client.DefaultRequestHeaders.UserAgent.ParseAdd(CoreEnvironment.HoyolabOsUA);
+ client.DefaultRequestHeaders.Accept.ParseAdd(ApplicationJson);
client.DefaultRequestHeaders.Add("x-rpc-app_version", "1.5.0");
client.DefaultRequestHeaders.Add("x-rpc-client_type", "4");
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/User.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/User.cs
index d420b50e..0cbeff53 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/User.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/User.cs
@@ -4,7 +4,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Extensions.DependencyInjection;
-using Snap.Hutao.Migrations;
using Snap.Hutao.Web.Hoyolab;
using Snap.Hutao.Web.Hoyolab.Bbs.User;
using Snap.Hutao.Web.Hoyolab.Passport;
@@ -104,20 +103,13 @@ internal sealed class User : ObservableObject
internal static async Task ResumeAsync(EntityUser inner, CancellationToken token = default)
{
User user = new(inner);
- bool isOk = false;
-
- if (!user.Entity.IsOversea)
- {
- isOk = await user.InitializeCoreAsync(token).ConfigureAwait(false);
- }
- else
- {
- isOk = await user.InitializeCoreOsAsync(token).ConfigureAwait(false);
- }
+ bool isOk = user.Entity.IsOversea
+ ? await user.InitializeCoreOsAsync(token).ConfigureAwait(false)
+ : await user.InitializeCoreAsync(token).ConfigureAwait(false);
if (!isOk)
{
- user.UserInfo = new UserInfo() { Nickname = "网络异常" };
+ user.UserInfo = new() { Nickname = SH.ModelBindingUserInitializationFailed };
user.UserGameRoles = new();
}
@@ -137,7 +129,6 @@ internal sealed class User : ObservableObject
entity.Aid = cookie.GetValueOrDefault(Cookie.STUID);
entity.Mid = cookie.GetValueOrDefault(Cookie.MID);
- entity.IsOversea = false;
if (entity.Aid != null && entity.Mid != null)
{
@@ -153,20 +144,20 @@ internal sealed class User : ObservableObject
}
///
- /// 创建并初始化国际服用户(临时)
+ /// 创建并初始化国际服用户
///
/// cookie
/// 取消令牌
/// 用户
- internal static async Task CreateOsUserAsync(Cookie cookie, CancellationToken token = default)
+ internal static async Task CreateOsAsync(Cookie cookie, CancellationToken token = default)
{
// 这里只负责创建实体用户,稍后在用户服务中保存到数据库
EntityUser entity = EntityUser.CreateOs(cookie);
entity.Aid = cookie.GetValueOrDefault(Cookie.STUID);
- // Note: Currently we dont know how to get "mid" for hoyolab user,
- // mid is set as the same value of ltuid(stuid/user id)
+ // Note: Currently we don't know how to get "mid" for hoyolab user,
+ // mid is set as the same value of ltuid/stuid
entity.Mid = entity.Aid;
entity.IsOversea = true;
@@ -224,6 +215,88 @@ internal sealed class User : ObservableObject
return isInitialized = true;
}
+ private async Task InitializeCoreOsAsync(CancellationToken token = default)
+ {
+ if (isInitialized)
+ {
+ return true;
+ }
+
+ if (SToken == null)
+ {
+ return false;
+ }
+
+ using (IServiceScope scope = Ioc.Default.CreateScope())
+ {
+ // 自动填充 Ltoken
+ if (LToken == null)
+ {
+ Response ltokenResponse = await scope.ServiceProvider
+ .GetRequiredService()
+ .GetLtokenBySTokenAsync(Entity, token)
+ .ConfigureAwait(false);
+
+ if (ltokenResponse.IsOk())
+ {
+ Cookie ltokenCookie = Cookie.Parse($"ltuid={Entity.Aid};ltoken={ltokenResponse.Data.Ltoken}");
+ Entity.LToken = ltokenCookie;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Fetch user info
+ Response response = await scope.ServiceProvider
+ .GetRequiredService()
+ .GetOsUserFullInfoAsync(Entity, token)
+ .ConfigureAwait(false);
+ UserInfo = response.Data?.UserInfo;
+
+ // 自动填充 CookieToken
+ if (CookieToken == null)
+ {
+ Response cookieTokenResponse = await scope.ServiceProvider
+ .GetRequiredService()
+ .GetCookieAccountInfoBySTokenAsync(Entity, token)
+ .ConfigureAwait(false);
+
+ if (cookieTokenResponse.IsOk())
+ {
+ Cookie cookieTokenCookie = Cookie.Parse($"account_id={Entity.Aid};cookie_token={cookieTokenResponse.Data.CookieToken}");
+ Entity.CookieToken = cookieTokenCookie;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // 获取游戏角色
+ Response> userGameRolesResponse = await scope.ServiceProvider
+ .GetRequiredService()
+ .GetOsUserGameRolesByCookieAsync(Entity, token)
+ .ConfigureAwait(false);
+
+ if (userGameRolesResponse.IsOk())
+ {
+ UserGameRoles = userGameRolesResponse.Data.List;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ SelectedUserGameRole = UserGameRoles.FirstOrFirstOrDefault(role => role.IsChosen);
+
+ isInitialized = true;
+
+ return UserInfo != null && UserGameRoles.Any();
+ }
+
private async Task TrySetLTokenAsync(IServiceProvider provider, CancellationToken token)
{
if (LToken != null)
@@ -311,87 +384,4 @@ internal sealed class User : ObservableObject
return false;
}
}
-
- private async Task InitializeCoreOsAsync(CancellationToken token = default)
- {
- if (isInitialized)
- {
- return true;
- }
-
- if (SToken == null)
- {
- return false;
- }
-
- using (IServiceScope scope = Ioc.Default.CreateScope())
- {
-
- // 自动填充 Ltoken
- if (LToken == null)
- {
- Response ltokenResponse = await scope.ServiceProvider
- .GetRequiredService()
- .GetLtokenBySTokenAsync(Entity, token)
- .ConfigureAwait(false);
-
- if (ltokenResponse.IsOk())
- {
- Cookie ltokenCookie = Cookie.Parse($"ltuid={Entity.Aid};ltoken={ltokenResponse.Data.Ltoken}");
- Entity.LToken = ltokenCookie;
- }
- else
- {
- return false;
- }
- }
-
- // Fetch user info
- Response response = await scope.ServiceProvider
- .GetRequiredService()
- .GetOsUserFullInfoAsync(Entity, token)
- .ConfigureAwait(false);
- UserInfo = response.Data?.UserInfo;
-
- // 自动填充 CookieToken
- if (CookieToken == null)
- {
- Response cookieTokenResponse = await scope.ServiceProvider
- .GetRequiredService()
- .GetCookieAccountInfoBySTokenAsync(Entity, token)
- .ConfigureAwait(false);
-
- if (cookieTokenResponse.IsOk())
- {
- Cookie cookieTokenCookie = Cookie.Parse($"account_id={Entity.Aid};cookie_token={cookieTokenResponse.Data.CookieToken}");
- Entity.CookieToken = cookieTokenCookie;
- }
- else
- {
- return false;
- }
- }
-
- // 获取游戏角色
- Response> userGameRolesResponse = await scope.ServiceProvider
- .GetRequiredService()
- .GetOsUserGameRolesByCookieAsync(Entity, token)
- .ConfigureAwait(false);
-
- if (userGameRolesResponse.IsOk())
- {
- UserGameRoles = userGameRolesResponse.Data.List;
- }
- else
- {
- return false;
- }
- }
-
- SelectedUserGameRole = UserGameRoles.FirstOrFirstOrDefault(role => role.IsChosen);
-
- isInitialized = true;
-
- return UserInfo != null && UserGameRoles.Any();
- }
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/User.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/User.cs
index d77bfff2..8c4450fc 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/User.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/User.cs
@@ -81,7 +81,7 @@ internal sealed class User : ISelectable
/// 新创建的用户
public static User CreateOs(Cookie cookie)
{
- _ = cookie.TryGetAsStokenV1(out Cookie? stoken);
+ _ = cookie.TryGetAsLegacyStoken(out Cookie? stoken);
_ = cookie.TryGetAsLtoken(out Cookie? ltoken);
_ = cookie.TryGetAsCookieToken(out Cookie? cookieToken);
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
index 3fba8d01..87ae6114 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
@@ -411,6 +411,15 @@ namespace Snap.Hutao.Resource.Localization {
}
}
+ ///
+ /// 查找类似 网络异常 的本地化字符串。
+ ///
+ internal static string ModelBindingUserInitializationFailed {
+ get {
+ return ResourceManager.GetString("ModelBindingUserInitializationFailed", resourceCulture);
+ }
+ }
+
///
/// 查找类似 第 {0} 期 的本地化字符串。
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
index 82831ddc..6d9af48d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
@@ -1806,4 +1806,7 @@
立即登录或注册
+
+ 网络异常
+
\ No newline at end of file
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 749aef85..aeea4eaa 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
@@ -16,7 +16,7 @@ namespace Snap.Hutao.Service.Game.Package;
/// 游戏文件包转换器
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class PackageConverter
{
private readonly JsonSerializerOptions options;
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs
index 2e613867..f97e23d4 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs
@@ -19,7 +19,7 @@ namespace Snap.Hutao.Service.Metadata;
///
[HighQuality]
[Injection(InjectAs.Singleton, typeof(IMetadataService))]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed partial class MetadataService : IMetadataService, IMetadataServiceInitialization
{
private const string MetaFileName = "Meta.json";
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs
index a4aa33cd..588fcdd9 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs
@@ -329,7 +329,7 @@ internal class UserService : IUserService
// 判断是否为国际服
if (isOversea)
{
- newUser = await BindingUser.CreateOsUserAsync(cookie).ConfigureAwait(false);
+ newUser = await BindingUser.CreateOsAsync(cookie).ConfigureAwait(false);
}
else
{
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs
index 33a686e0..97c8416d 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs
+++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs
@@ -49,7 +49,7 @@ internal sealed partial class SignInWebViewDialog : ContentDialog
if (user.Entity.IsOversea)
{
- coreWebView2.SetCookie(user.CookieToken, user.LToken, null).SetOsMobileUserAgent();
+ coreWebView2.SetCookie(user.CookieToken, user.LToken, null).SetMobileOsUserAgent();
signInJsInterface = new(coreWebView2, scope.ServiceProvider);
coreWebView2.Navigate("https://act.hoyolab.com/ys/event/signin-sea-v3/index.html?act_id=e202102251931481&hyl_presentation_style=fullscreen");
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/CoreWebView2Extension.cs b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/CoreWebView2Extension.cs
index c32bd1ab..eb6b13ec 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/CoreWebView2Extension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/CoreWebView2Extension.cs
@@ -24,11 +24,11 @@ internal static class CoreWebView2Extension
}
///
- /// 设置 移动端UA
+ /// 设置 移动端OsUA
///
/// webview2
/// 链式调用的WebView2
- public static CoreWebView2 SetOsMobileUserAgent(this CoreWebView2 webView)
+ public static CoreWebView2 SetMobileOsUserAgent(this CoreWebView2 webView)
{
webView.Settings.UserAgent = Core.CoreEnvironment.HoyolabOsMobileUA;
return webView;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Enka/EnkaClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Enka/EnkaClient.cs
index 93ff907a..a3a57db7 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Enka/EnkaClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Enka/EnkaClient.cs
@@ -12,7 +12,7 @@ namespace Snap.Hutao.Web.Enka;
/// Enka API 客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class EnkaClient
{
private const string EnkaAPI = "https://enka.network/api/uid/{0}";
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Geetest/GeetestClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Geetest/GeetestClient.cs
index 345b1ab4..f17ee448 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Geetest/GeetestClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Geetest/GeetestClient.cs
@@ -11,7 +11,7 @@ namespace Snap.Hutao.Web.Geetest;
/// 极验客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class GeetestClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/App/Account/AccountClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/App/Account/AccountClient.cs
index 1ea0a8ae..84ee96be 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/App/Account/AccountClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/App/Account/AccountClient.cs
@@ -16,7 +16,7 @@ namespace Snap.Hutao.Web.Hoyolab.App.Account;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc)]
+[HttpClient(HttpClientConfiguration.XRpc)]
internal sealed class AccountClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs
index d5f1c5a2..c2d54bea 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs
@@ -14,7 +14,7 @@ namespace Snap.Hutao.Web.Hoyolab.Bbs.User;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc)]
+[HttpClient(HttpClientConfiguration.XRpc)]
internal sealed class UserClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Cookie.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Cookie.cs
index 93d7265f..e15374f1 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Cookie.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Cookie.cs
@@ -122,7 +122,7 @@ internal sealed partial class Cookie
///
/// A cookie contains stoken and stuid, without mid.
/// 是否获取成功
- public bool TryGetAsStokenV1([NotNullWhen(true)] out Cookie? cookie)
+ public bool TryGetAsLegacyStoken([NotNullWhen(true)] out Cookie? cookie)
{
bool hasStoken = TryGetValue(STOKEN, out string? stoken);
bool hasStuid = TryGetValue(STUID, out string? stuid);
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 4a9224b0..97965579 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
@@ -10,7 +10,7 @@ namespace Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement;
///
/// 公告客户端
///
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class AnnouncementClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaInfoClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaInfoClient.cs
index 44ad80e3..1454db93 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaInfoClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaInfoClient.cs
@@ -11,7 +11,7 @@ namespace Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo;
/// 祈愿记录客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class GachaInfoClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient.cs
index bbed4295..61ce91a8 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient.cs
@@ -13,7 +13,7 @@ namespace Snap.Hutao.Web.Hoyolab.Passport;
/// 通行证客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class PassportClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs
index b9542300..8c8d6b21 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs
@@ -16,7 +16,7 @@ namespace Snap.Hutao.Web.Hoyolab.Passport;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc2)]
+[HttpClient(HttpClientConfiguration.XRpc2)]
internal sealed class PassportClient2
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClientOs.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClientOs.cs
index 6c29d9bc..aa1ad5b3 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClientOs.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClientOs.cs
@@ -14,7 +14,7 @@ namespace Snap.Hutao.Web.Hoyolab.Passport;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc3)]
+[HttpClient(HttpClientConfiguration.XRpc3)]
internal sealed class PassportClientOs
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/SdkStatic/Hk4e/Launcher/ResourceClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/SdkStatic/Hk4e/Launcher/ResourceClient.cs
index 06a76df3..46e8b0b6 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/SdkStatic/Hk4e/Launcher/ResourceClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/SdkStatic/Hk4e/Launcher/ResourceClient.cs
@@ -12,7 +12,7 @@ namespace Snap.Hutao.Web.Hoyolab.SdkStatic.Hk4e.Launcher;
/// 游戏资源客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class ResourceClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClient.cs
index d67b4359..d8c652be 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClient.cs
@@ -16,7 +16,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Auth;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class AuthClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClientOs.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClientOs.cs
index 27027284..31a0e07f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClientOs.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Auth/AuthClientOs.cs
@@ -13,7 +13,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Auth;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class AuthClientOs
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient.cs
index fa8b55b9..44e65240 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient.cs
@@ -13,7 +13,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Binding;
/// 绑定客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class BindingClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient2.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient2.cs
index a1c6ce14..6245eefa 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient2.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Binding/BindingClient2.cs
@@ -15,7 +15,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Binding;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc)]
+[HttpClient(HttpClientConfiguration.XRpc)]
internal sealed class BindingClient2
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/CalculateClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/CalculateClient.cs
index 6199ca06..bae2eb16 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/CalculateClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/CalculateClient.cs
@@ -13,7 +13,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate;
/// 养成计算器客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class CalculateClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs
index 601e8663..b863f3ce 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs
@@ -16,7 +16,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.GameRecord;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc)]
+[HttpClient(HttpClientConfiguration.XRpc)]
internal sealed class CardClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs
index 86f2cbf7..d8bfd86b 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs
@@ -18,7 +18,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.GameRecord;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc)]
+[HttpClient(HttpClientConfiguration.XRpc)]
[PrimaryHttpMessageHandler(UseCookies = false)]
internal sealed class GameRecordClient
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClientOs.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClientOs.cs
index 39f5e55d..8b0b2b1d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClientOs.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClientOs.cs
@@ -15,7 +15,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.GameRecord;
///
[HighQuality]
[UseDynamicSecret]
-[HttpClient(HttpClientConfigration.XRpc3)]
+[HttpClient(HttpClientConfiguration.XRpc3)]
[PrimaryHttpMessageHandler(UseCookies = false)]
internal sealed class GameRecordClientOs
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaLogUploadClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaLogUploadClient.cs
index d7d91cec..84ef3834 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaLogUploadClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaLogUploadClient.cs
@@ -12,7 +12,7 @@ namespace Snap.Hutao.Web.Hutao;
/// 胡桃日志客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class HomaLogUploadClient
{
private readonly HttpClient httpClient;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportClient.cs
index 9b6e3c0a..af0e6243 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportClient.cs
@@ -13,7 +13,7 @@ namespace Snap.Hutao.Web.Hutao;
/// 胡桃通行证客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class HomaPassportClient
{
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaSpiralAbyssClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaSpiralAbyssClient.cs
index 076c9b2e..ee7949ba 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaSpiralAbyssClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaSpiralAbyssClient.cs
@@ -18,7 +18,7 @@ namespace Snap.Hutao.Web.Hutao;
/// 胡桃API客户端
///
[HighQuality]
-[HttpClient(HttpClientConfigration.Default)]
+[HttpClient(HttpClientConfiguration.Default)]
internal sealed class HomaSpiralAbyssClient
{
private readonly HttpClient httpClient;