diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml
index fd034633..0ab1ee34 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml
@@ -24,20 +24,15 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
@@ -50,22 +45,34 @@
-
-
-
-
-
-
-
-
-
-
+ Placement="Full">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteWebViewerSource.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteWebViewerSource.cs
index 4207da74..623a92c7 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteWebViewerSource.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteWebViewerSource.cs
@@ -18,7 +18,7 @@ internal sealed class DailyNoteWebViewerSource : IWebViewerSource
public string GetSource(UserAndUid userAndUid)
{
- string query = userAndUid.Uid.ToQueryString();
+ string query = userAndUid.Uid.ToRoleIdServerQueryString();
return $"https://webstatic.mihoyo.com/app/community-game-records/index.html?bbs_presentation_style=fullscreen#/ys/daily/?{query}";
}
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs
index 038eeed5..64ffdee8 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs
@@ -144,49 +144,6 @@ internal static class ApiEndpoints
}
#endregion
- #region ApiTakumiEventBbsSignReward
-
- ///
- /// 签到活动Id
- ///
- public const string SignInRewardActivityId = "e202009291139501";
-
- ///
- /// 签到
- ///
- public const string SignInRewardHome = $"{ApiTakumi}/event/bbs_sign_reward/home?act_id={SignInRewardActivityId}";
-
- ///
- /// 签到
- ///
- public const string SignInRewardSign = $"{ApiTakumi}/event/bbs_sign_reward/sign";
-
- ///
- /// 补签
- ///
- public const string SignInRewardReSign = $"{ApiTakumi}/event/bbs_sign_reward/resign";
-
- ///
- /// 补签信息
- ///
- /// uid
- /// 补签信息字符串
- public static string SignInRewardResignInfo(in PlayerUid uid)
- {
- return $"{ApiTakumi}/event/bbs_sign_reward/resign_info?act_id={SignInRewardActivityId}®ion={uid.Region}&uid={uid.Value}";
- }
-
- ///
- /// 签到信息
- ///
- /// uid
- /// 签到信息字符串
- public static string SignInRewardInfo(in PlayerUid uid)
- {
- return $"{ApiTakumi}/event/bbs_sign_reward/info?act_id={SignInRewardActivityId}®ion={uid.Region}&uid={uid.Value}";
- }
- #endregion
-
#region ApiTakumiEventCalculate
///
@@ -253,6 +210,34 @@ internal static class ApiEndpoints
public const string CalculateWeaponList = $"{ApiTakumiEventCalculate}/v1/weapon/list";
#endregion
+ #region ApiTakumiEventLuna
+ public const string LunaActivityId = "e202311201442471";
+
+ public static string LunaHome(string languageCode)
+ {
+ return $"{ApiTakumiEventLuna}/home?lang={languageCode}&act_id={LunaActivityId}";
+ }
+
+ public const string LunaSign = $"{ApiTakumiEventLuna}/sign";
+
+ public const string LunaReSign = $"{ApiTakumiEventLuna}/resign";
+
+ public static string LunaExtraAward(in PlayerUid uid, string languageCode)
+ {
+ return $"{ApiTakumiEventLuna}/home?act_id={LunaActivityId}&{uid.ToUidRegionQueryString()}&lang={languageCode}";
+ }
+
+ public static string LunaResignInfo(in PlayerUid uid)
+ {
+ return $"{ApiTakumiEventLuna}/resign_info?act_id={LunaActivityId}&{uid.ToUidRegionQueryString()}";
+ }
+
+ public static string LunaInfo(in PlayerUid uid, string languageCode)
+ {
+ return $"{ApiTakumiEventLuna}/info?lang={languageCode}&act_id={LunaActivityId}&{uid.ToUidRegionQueryString()}";
+ }
+ #endregion
+
#region AppAuthApi
///
@@ -382,16 +367,14 @@ internal static class ApiEndpoints
private const string ApiTakumiEvent = $"{ApiTakumi}/event";
private const string ApiTakumiEventCalculate = $"{ApiTakumiEvent}/e20200928calculate";
+ private const string ApiTakumiEventLuna = $"{ApiTakumiEvent}/luna";
private const string ApiTakumiRecord = "https://api-takumi-record.mihoyo.com";
private const string ApiTakumiRecordApi = $"{ApiTakumiRecord}/game_record/app/genshin/api";
private const string ApiTakumiRecordAapi = $"{ApiTakumiRecord}/game_record/app/genshin/aapi";
- ///
- /// Referer: https://app.mihoyo.com
- ///
- public const string AppMihoyoReferer = "https://app.mihoyo.com";
private const string AppAuthApi = $"{AppMihoyoReferer}/account/auth/api";
+ public const string AppMihoyoReferer = "https://app.mihoyo.com";
private const string BbsApi = "https://bbs-api.mihoyo.com";
private const string BbsApiUserApi = $"{BbsApi}/user/wapi";
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUidExtension.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUidExtension.cs
index ffabae36..538827a8 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUidExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUidExtension.cs
@@ -8,7 +8,7 @@ namespace Snap.Hutao.Web.Hoyolab;
internal static class PlayerUidExtension
{
- public static string ToQueryString(this in PlayerUid playerUid)
+ public static string ToRoleIdServerQueryString(this in PlayerUid playerUid)
{
NameValueCollection collection = [];
collection.Set("role_id", playerUid.Value);
@@ -16,4 +16,13 @@ internal static class PlayerUidExtension
return collection.ToQueryString();
}
+
+ public static string ToUidRegionQueryString(this in PlayerUid playerUid)
+ {
+ NameValueCollection collection = [];
+ collection.Set("uid", playerUid.Value);
+ collection.Set("region", playerUid.Region);
+
+ return collection.ToQueryString();
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Award.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Award.cs
index 255112da..dc7765d8 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Award.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Award.cs
@@ -6,7 +6,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.BbsSignReward;
///
/// 奖励物品
///
-internal sealed class Award
+internal class Award
{
///
/// 图标
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ExtraAward.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ExtraAward.cs
new file mode 100644
index 00000000..00e3382d
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ExtraAward.cs
@@ -0,0 +1,13 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.BbsSignReward;
+
+internal sealed class ExtraAward : Award
+{
+ [JsonPropertyName("id")]
+ public int Id { get; set; }
+
+ [JsonPropertyName("sign_day")]
+ public int SignDay { get; set; }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ExtraAwardInfo.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ExtraAwardInfo.cs
new file mode 100644
index 00000000..c778128d
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ExtraAwardInfo.cs
@@ -0,0 +1,22 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.BbsSignReward;
+
+internal sealed class ExtraAwardInfo
+{
+ [JsonPropertyName("awards")]
+ public List Awards { get; set; } = default!;
+
+ [JsonPropertyName("total_cnt")]
+ public int TotalCount { get; set; }
+
+ [JsonPropertyName("ys_first_award")]
+ public bool YsFirstAward { get; set; }
+
+ [JsonPropertyName("has_short_act")]
+ public bool HasShortAct { get; set; }
+
+ [JsonPropertyName("short_act_info")]
+ public ShortActInfo ShortActInfo { get; set; } = default!;
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Reward.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Reward.cs
index 1fb9bd1d..12f49d4f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Reward.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/Reward.cs
@@ -17,9 +17,15 @@ internal sealed class Reward
[JsonPropertyName("awards")]
public List Awards { get; set; } = default!;
+ [JsonPropertyName("biz")]
+ public string Biz { get; set; } = default!;
+
///
/// 支持补签
///
[JsonPropertyName("resign")]
public bool Resign { get; set; }
+
+ [JsonPropertyName("short_extra_award")]
+ public ShortExtraAward ShortExtraAward { get; set; } = default!;
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ShortActInfo.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ShortActInfo.cs
new file mode 100644
index 00000000..29a286e3
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ShortActInfo.cs
@@ -0,0 +1,21 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.BbsSignReward;
+
+internal sealed class ShortActInfo
+{
+ [JsonPropertyName("awards")]
+ public List Awards { get; set; } = default!;
+
+ [JsonPropertyName("start_timestamp")]
+ [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
+ public long StartTimestamp { get; set; }
+
+ [JsonPropertyName("end_timestamp")]
+ [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
+ public long EndTimestamp { get; set; }
+
+ [JsonPropertyName("total_cnt")]
+ public int TotalCount { get; set; }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ShortExtraAward.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ShortExtraAward.cs
new file mode 100644
index 00000000..858a1de6
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/ShortExtraAward.cs
@@ -0,0 +1,27 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.BbsSignReward;
+
+internal sealed class ShortExtraAward
+{
+ [JsonPropertyName("has_extra_award")]
+ public bool HasExtraAward { get; set; }
+
+ [JsonPropertyName("start_time")]
+ public string StartTime { get; set; } = default!;
+
+ [JsonPropertyName("end_time")]
+ public string EndTime { get; set; } = default!;
+
+ [JsonPropertyName("list")]
+ public List List { get; set; } = default!;
+
+ [JsonPropertyName("start_timestamp")]
+ [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
+ public long StartTimestamp { get; set; } = default!;
+
+ [JsonPropertyName("end_timestamp")]
+ [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
+ public long EndTimestamp { get; set; } = default!;
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInClient.cs
index 8095921c..33f5c9d1 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInClient.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license.
using Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient;
+using Snap.Hutao.Service.Metadata;
using Snap.Hutao.ViewModel.User;
using Snap.Hutao.Web.Hoyolab.DataSigning;
using Snap.Hutao.Web.Hutao.Geetest;
@@ -22,14 +23,33 @@ internal sealed partial class SignInClient : ISignInClient
{
private readonly IHttpRequestMessageBuilderFactory httpRequestMessageBuilderFactory;
private readonly HomaGeetestClient homaGeetestClient;
+ private readonly MetadataOptions metadataOptions;
private readonly ILogger logger;
private readonly HttpClient httpClient;
+ public async ValueTask> GetExtraAwardInfoAsync(UserAndUid userAndUid, CancellationToken token = default)
+ {
+ HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create()
+ .SetRequestUri(ApiEndpoints.LunaExtraAward(userAndUid.Uid, metadataOptions.LanguageCode))
+ .SetUserCookieAndFpHeader(userAndUid, CookieType.CookieToken)
+ .SetHeader("x-rpc-signgame", "hk4e")
+ .Get();
+
+ await builder.SignDataAsync(DataSignAlgorithmVersion.Gen1, SaltType.LK2, true).ConfigureAwait(false);
+
+ Response? resp = await builder
+ .TryCatchSendAsync>(httpClient, logger, token)
+ .ConfigureAwait(false);
+
+ return Response.Response.DefaultIfNull(resp);
+ }
+
public async ValueTask> GetInfoAsync(UserAndUid userAndUid, CancellationToken token = default)
{
HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create()
- .SetRequestUri(ApiEndpoints.SignInRewardInfo(userAndUid.Uid))
+ .SetRequestUri(ApiEndpoints.LunaInfo(userAndUid.Uid, metadataOptions.LanguageCode))
.SetUserCookieAndFpHeader(userAndUid, CookieType.CookieToken)
+ .SetHeader("x-rpc-signgame", "hk4e")
.Get();
await builder.SignDataAsync(DataSignAlgorithmVersion.Gen1, SaltType.LK2, true).ConfigureAwait(false);
@@ -44,8 +64,9 @@ internal sealed partial class SignInClient : ISignInClient
public async ValueTask> GetResignInfoAsync(UserAndUid userAndUid, CancellationToken token = default)
{
HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create()
- .SetRequestUri(ApiEndpoints.SignInRewardResignInfo(userAndUid.Uid))
+ .SetRequestUri(ApiEndpoints.LunaResignInfo(userAndUid.Uid))
.SetUserCookieAndFpHeader(userAndUid, CookieType.CookieToken)
+ .SetHeader("x-rpc-signgame", "hk4e")
.Get();
await builder.SignDataAsync(DataSignAlgorithmVersion.Gen1, SaltType.LK2, true).ConfigureAwait(false);
@@ -60,8 +81,9 @@ internal sealed partial class SignInClient : ISignInClient
public async ValueTask> GetRewardAsync(Model.Entity.User user, CancellationToken token = default)
{
HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create()
- .SetRequestUri(ApiEndpoints.SignInRewardHome)
+ .SetRequestUri(ApiEndpoints.LunaHome(metadataOptions.LanguageCode))
.SetUserCookieAndFpHeader(user, CookieType.CookieToken)
+ .SetHeader("x-rpc-signgame", "hk4e")
.Get();
Response? resp = await builder
@@ -74,8 +96,9 @@ internal sealed partial class SignInClient : ISignInClient
public async ValueTask> ReSignAsync(UserAndUid userAndUid, CancellationToken token = default)
{
HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create()
- .SetRequestUri(ApiEndpoints.SignInRewardReSign)
+ .SetRequestUri(ApiEndpoints.LunaReSign)
.SetUserCookieAndFpHeader(userAndUid, CookieType.CookieToken)
+ .SetHeader("x-rpc-signgame", "hk4e")
.PostJson(new SignInData(userAndUid.Uid, false));
await builder.SignDataAsync(DataSignAlgorithmVersion.Gen1, SaltType.LK2, true).ConfigureAwait(false);
@@ -90,8 +113,9 @@ internal sealed partial class SignInClient : ISignInClient
public async ValueTask> SignAsync(UserAndUid userAndUid, CancellationToken token = default)
{
HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create()
- .SetRequestUri(ApiEndpoints.SignInRewardSign)
+ .SetRequestUri(ApiEndpoints.LunaSign)
.SetUserCookieAndFpHeader(userAndUid, CookieType.CookieToken)
+ .SetHeader("x-rpc-signgame", "hk4e")
.PostJson(new SignInData(userAndUid.Uid, false));
await builder.SignDataAsync(DataSignAlgorithmVersion.Gen1, SaltType.LK2, true).ConfigureAwait(false);
@@ -107,8 +131,9 @@ internal sealed partial class SignInClient : ISignInClient
if (verifyResponse is { Code: 0, Data: { Validate: string validate, Challenge: string challenge } })
{
HttpRequestMessageBuilder verifiedBuilder = httpRequestMessageBuilderFactory.Create()
- .SetRequestUri(ApiEndpoints.SignInRewardSign)
+ .SetRequestUri(ApiEndpoints.LunaSign)
.SetUserCookieAndFpHeader(userAndUid, CookieType.CookieToken)
+ .SetHeader("x-rpc-signgame", "hk4e")
.SetXrpcChallenge(challenge, validate)
.PostJson(new SignInData(userAndUid.Uid, false));
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInData.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInData.cs
index 12714813..d3f5b4cd 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInData.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInData.cs
@@ -16,7 +16,7 @@ internal sealed class SignInData
[SuppressMessage("", "SH002")]
public SignInData(PlayerUid uid, bool isOversea)
{
- ActivityId = isOversea ? ApiOsEndpoints.SignInRewardActivityId : ApiEndpoints.SignInRewardActivityId;
+ ActivityId = isOversea ? ApiOsEndpoints.SignInRewardActivityId : ApiEndpoints.LunaActivityId;
Region = uid.Region;
Uid = uid.Value;
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInResult.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInResult.cs
index 274be2c9..50920133 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInResult.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInResult.cs
@@ -3,38 +3,23 @@
namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.BbsSignReward;
-///
-/// 签到结果
-///
internal sealed class SignInResult
{
- ///
- /// 通常是 ""
- ///
[JsonPropertyName("code")]
public string Code { get; set; } = default!;
- ///
- /// 通常是 0
- ///
[JsonPropertyName("risk_code")]
public int RiskCode { get; set; }
- ///
- /// 通常是 ""
- ///
[JsonPropertyName("gt")]
public string Gt { get; set; } = default!;
- ///
- /// 通常是 ""
- ///
[JsonPropertyName("challenge")]
public string Challenge { get; set; } = default!;
- ///
- /// 通常是 ""
- ///
[JsonPropertyName("success")]
public int Success { get; set; }
+
+ [JsonPropertyName("is_risk")]
+ public bool IsRisk { get; set; }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInRewardInfo.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInRewardInfo.cs
index b11ed1c1..2ee32a28 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInRewardInfo.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/BbsSignReward/SignInRewardInfo.cs
@@ -3,14 +3,8 @@
namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.BbsSignReward;
-///
-/// 签到信息
-///
internal sealed class SignInRewardInfo
{
- ///
- /// 累积签到天数
- ///
[JsonPropertyName("total_sign_day")]
public int TotalSignDay { get; set; }
@@ -20,33 +14,17 @@ internal sealed class SignInRewardInfo
[JsonPropertyName("today")]
public string? Today { get; set; }
- ///
- /// 今日是否已签到
- ///
[JsonPropertyName("is_sign")]
public bool IsSign { get; set; }
- ///
- /// ?
- ///
[JsonPropertyName("is_sub")]
public bool IsSub { get; set; }
- ///
- /// 是否首次绑定
- ///
- [JsonPropertyName("first_bind")]
- public bool FirstBind { get; set; }
+ public string Region { get; set; } = default!;
- ///
- /// 是否为当月第一次
- ///
- [JsonPropertyName("month_first")]
- public bool MonthFirst { get; set; }
-
- ///
- /// 漏签天数
- ///
[JsonPropertyName("sign_cnt_missed")]
public int SignCountMissed { get; set; }
+
+ [JsonPropertyName("short_sign_day")]
+ public int ShortSignDay { get; set; }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Request/NameValueCollectionExtension.cs b/src/Snap.Hutao/Snap.Hutao/Web/Request/NameValueCollectionExtension.cs
index 660a28c0..8375b0ef 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Request/NameValueCollectionExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Request/NameValueCollectionExtension.cs
@@ -24,7 +24,7 @@ internal static class NameValueCollectionExtension
string? key = keys[i];
if (collection.GetValues(key) is { } values)
{
- foreach (string value in values)
+ foreach (ref readonly string value in values.AsSpan())
{
if (!string.IsNullOrEmpty(key))
{