mirror of
https://jihulab.com/DGP-Studio/Snap.Hutao.git
synced 2025-11-19 21:02:53 +08:00
replace all region
This commit is contained in:
@@ -281,7 +281,10 @@ internal static class ApiEndpoints
|
||||
/// <summary>
|
||||
/// 公告列表
|
||||
/// </summary>
|
||||
public static string AnnList(string languageCode, string region)
|
||||
/// <param name="languageCode">语言代码</param>
|
||||
/// <param name="region">服务器</param>
|
||||
/// <returns>公告列表Url</returns>
|
||||
public static string AnnList(string languageCode, in Region region)
|
||||
{
|
||||
return $"{Hk4eApiAnnouncementApi}/getAnnList?{AnnouncementQuery(languageCode, region)}";
|
||||
}
|
||||
@@ -289,7 +292,10 @@ internal static class ApiEndpoints
|
||||
/// <summary>
|
||||
/// 公告内容
|
||||
/// </summary>
|
||||
public static string AnnContent(string languageCode, string region)
|
||||
/// <param name="languageCode">语言代码</param>
|
||||
/// <param name="region">服务器</param>
|
||||
/// <returns>公告列表Url</returns>
|
||||
public static string AnnContent(string languageCode, in Region region)
|
||||
{
|
||||
return $"{Hk4eApiAnnouncementApi}/getAnnContent?{AnnouncementQuery(languageCode, region)}";
|
||||
}
|
||||
@@ -428,7 +434,7 @@ internal static class ApiEndpoints
|
||||
/// </summary>
|
||||
public const string WebStaticMihoyoReferer = "https://webstatic.mihoyo.com";
|
||||
|
||||
private static string AnnouncementQuery(string languageCode, string region)
|
||||
private static string AnnouncementQuery(string languageCode, in Region region)
|
||||
{
|
||||
return $"game=hk4e&game_biz=hk4e_cn&lang={languageCode}&bundle_id=hk4e_cn&platform=pc®ion={region}&level=55&uid=100000000";
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ internal static class ApiOsEndpoints
|
||||
/// </summary>
|
||||
/// <param name="region">地区代号</param>
|
||||
/// <returns>用户游戏角色字符串</returns>
|
||||
public static string UserGameRolesByLtoken(string region)
|
||||
public static string UserGameRolesByLtoken(in Region region)
|
||||
{
|
||||
return $"{ApiAccountOsBindingApi}/getUserGameRolesByLtoken?game_biz=hk4e_global®ion={region}";
|
||||
}
|
||||
@@ -197,7 +197,7 @@ internal static class ApiOsEndpoints
|
||||
/// <param name="languageCode">语言代码</param>
|
||||
/// <param name="region">服务器</param>
|
||||
/// <returns>公告列表Url</returns>
|
||||
public static string AnnList(string languageCode, string region)
|
||||
public static string AnnList(string languageCode, in Region region)
|
||||
{
|
||||
return $"{Hk4eApiOsAnnouncementApi}/getAnnList?{AnnouncementQuery(languageCode, region)}";
|
||||
}
|
||||
@@ -208,7 +208,7 @@ internal static class ApiOsEndpoints
|
||||
/// <param name="languageCode">语言代码</param>
|
||||
/// <param name="region">服务器</param>
|
||||
/// <returns>公告内容Url</returns>
|
||||
public static string AnnContent(string languageCode, string region)
|
||||
public static string AnnContent(string languageCode, in Region region)
|
||||
{
|
||||
return $"{Hk4eApiOsAnnouncementApi}/getAnnContent?{AnnouncementQuery(languageCode, region)}";
|
||||
}
|
||||
@@ -360,7 +360,7 @@ internal static class ApiOsEndpoints
|
||||
/// </summary>
|
||||
public const string AppHoyolabReferer = "https://app.hoyolab.com/";
|
||||
|
||||
private static string AnnouncementQuery(string languageCode, string region)
|
||||
private static string AnnouncementQuery(string languageCode, in Region region)
|
||||
{
|
||||
return $"game=hk4e&game_biz=hk4e_global&lang={languageCode}&bundle_id=hk4e_global&platform=pc®ion={region}&level=55&uid=100000000";
|
||||
}
|
||||
|
||||
@@ -41,7 +41,8 @@ internal sealed class GachaLogPage : IJsonOnDeserialized
|
||||
/// 地区
|
||||
/// </summary>
|
||||
[JsonPropertyName("region")]
|
||||
public string Region { get; set; } = default!;
|
||||
[JsonConverter(typeof(RegionConverter))]
|
||||
public Region Region { get; set; } = default!;
|
||||
|
||||
public void OnDeserialized()
|
||||
{
|
||||
|
||||
@@ -17,18 +17,18 @@ internal readonly partial struct PlayerUid
|
||||
/// <summary>
|
||||
/// 地区代码
|
||||
/// </summary>
|
||||
public readonly string Region;
|
||||
public readonly Region Region;
|
||||
|
||||
/// <summary>
|
||||
/// 构造一个新的玩家 Uid 结构
|
||||
/// </summary>
|
||||
/// <param name="value">uid</param>
|
||||
/// <param name="region">服务器,当提供该参数时会无条件信任</param>
|
||||
public PlayerUid(string value, string? region = default)
|
||||
public PlayerUid(string value, in Region? region = default)
|
||||
{
|
||||
Must.Argument(HoyolabRegex.UidRegex().IsMatch(value), SH.WebHoyolabInvalidUid);
|
||||
Value = value;
|
||||
Region = region ?? EvaluateRegion(value.AsSpan()[0]);
|
||||
Region = region ?? Region.FromUid(value);
|
||||
}
|
||||
|
||||
public static implicit operator PlayerUid(string source)
|
||||
@@ -67,12 +67,12 @@ internal readonly partial struct PlayerUid
|
||||
};
|
||||
}
|
||||
|
||||
public static TimeSpan GetRegionTimeZoneUtcOffsetForRegion(string region)
|
||||
public static TimeSpan GetRegionTimeZoneUtcOffsetForRegion(in Region region)
|
||||
{
|
||||
// 美服 UTC-05
|
||||
// 欧服 UTC+01
|
||||
// 其他 UTC+08
|
||||
return region switch
|
||||
return region.Value switch
|
||||
{
|
||||
"os_usa" => ServerRegionTimeZone.AmericaServerOffset,
|
||||
"os_euro" => ServerRegionTimeZone.EuropeServerOffset,
|
||||
@@ -85,21 +85,4 @@ internal readonly partial struct PlayerUid
|
||||
{
|
||||
return Value;
|
||||
}
|
||||
|
||||
private static string EvaluateRegion(in char first)
|
||||
{
|
||||
return first switch
|
||||
{
|
||||
// CN
|
||||
>= '1' and <= '4' => "cn_gf01", // 国服
|
||||
'5' => "cn_qd01", // 渠道
|
||||
|
||||
// OS
|
||||
'6' => "os_usa", // 美服
|
||||
'7' => "os_euro", // 欧服
|
||||
'8' => "os_asia", // 亚服
|
||||
'9' => "os_cht", // 台服
|
||||
_ => throw Must.NeverHappen(),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ internal static class PlayerUidExtension
|
||||
{
|
||||
NameValueCollection collection = [];
|
||||
collection.Set("role_id", playerUid.Value);
|
||||
collection.Set("server", playerUid.Region);
|
||||
collection.Set("server", playerUid.Region.Value);
|
||||
|
||||
return collection.ToQueryString();
|
||||
}
|
||||
@@ -21,7 +21,7 @@ internal static class PlayerUidExtension
|
||||
{
|
||||
NameValueCollection collection = [];
|
||||
collection.Set("uid", playerUid.Value);
|
||||
collection.Set("region", playerUid.Region);
|
||||
collection.Set("region", playerUid.Region.Value);
|
||||
|
||||
return collection.ToQueryString();
|
||||
}
|
||||
|
||||
22
src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionConverter.cs
Normal file
22
src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/RegionConverter.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Web.Hoyolab;
|
||||
|
||||
internal sealed class RegionConverter : JsonConverter<Region>
|
||||
{
|
||||
public override Region Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
if (reader.GetString() is { } regionValue)
|
||||
{
|
||||
return Region.FromRegion(regionValue);
|
||||
}
|
||||
|
||||
return default;
|
||||
}
|
||||
|
||||
public override void Write(Utf8JsonWriter writer, Region value, JsonSerializerOptions options)
|
||||
{
|
||||
writer.WriteStringValue(value.ToString());
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ internal sealed class GenAuthKeyData
|
||||
AuthAppId = authAppId;
|
||||
GameBiz = gameBiz;
|
||||
GameUid = int.Parse(uid.Value, CultureInfo.InvariantCulture);
|
||||
Region = uid.Region;
|
||||
Region = uid.Region.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -50,7 +50,8 @@ internal sealed class GenAuthKeyData
|
||||
/// 区域
|
||||
/// </summary>
|
||||
[JsonPropertyName("region")]
|
||||
public string Region { get; set; } = default!;
|
||||
[JsonConverter(typeof(RegionConverter))]
|
||||
public Region Region { get; set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// 创建为祈愿记录验证密钥提交数据
|
||||
|
||||
@@ -19,7 +19,8 @@ internal sealed class UserGameRole
|
||||
/// 服务器
|
||||
/// </summary>
|
||||
[JsonPropertyName("region")]
|
||||
public string Region { get; set; } = default!;
|
||||
[JsonConverter(typeof(RegionConverter))]
|
||||
public Region Region { get; set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// 游戏Uid
|
||||
|
||||
@@ -17,7 +17,7 @@ internal sealed class SignInData
|
||||
public SignInData(PlayerUid uid, bool isOversea)
|
||||
{
|
||||
ActivityId = isOversea ? ApiOsEndpoints.SignInRewardActivityId : ApiEndpoints.LunaActivityId;
|
||||
Region = uid.Region;
|
||||
Region = uid.Region.Value;
|
||||
Uid = uid.Value;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,8 @@ internal sealed class SignInData
|
||||
/// 地区代码
|
||||
/// </summary>
|
||||
[JsonPropertyName("region")]
|
||||
public string Region { get; }
|
||||
[JsonConverter(typeof(RegionConverter))]
|
||||
public Region Region { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Uid
|
||||
|
||||
@@ -55,7 +55,7 @@ internal sealed partial class CalculateClient
|
||||
public async ValueTask<List<Avatar>> GetAvatarsAsync(UserAndUid userAndUid, CancellationToken token = default)
|
||||
{
|
||||
int currentPage = 1;
|
||||
SyncAvatarFilter filter = new() { Uid = userAndUid.Uid.Value, Region = userAndUid.Uid.Region };
|
||||
SyncAvatarFilter filter = new() { Uid = userAndUid.Uid.Value, Region = userAndUid.Uid.Region.Value };
|
||||
|
||||
List<Avatar> avatars = [];
|
||||
Response<ListWrapper<Avatar>>? resp;
|
||||
@@ -181,7 +181,8 @@ internal sealed partial class CalculateClient
|
||||
public string Uid { get; set; } = default!;
|
||||
|
||||
[JsonPropertyName("region")]
|
||||
public string Region { get; set; } = default!;
|
||||
[JsonConverter(typeof(RegionConverter))]
|
||||
public Region Region { get; set; } = default!;
|
||||
}
|
||||
|
||||
private class IdCount
|
||||
|
||||
@@ -20,7 +20,7 @@ internal sealed class CharacterData
|
||||
{
|
||||
CharacterIds = characterIds;
|
||||
Uid = uid.Value;
|
||||
Server = uid.Region;
|
||||
Server = uid.Region.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -25,7 +25,8 @@ internal sealed class Role
|
||||
/// 服务器
|
||||
/// </summary>
|
||||
[JsonPropertyName("region")]
|
||||
public string Region { get; set; } = default!;
|
||||
[JsonConverter(typeof(RegionConverter))]
|
||||
public Region Region { get; set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// 等级
|
||||
|
||||
@@ -26,7 +26,8 @@ internal sealed class BasicRoleInfo
|
||||
/// 区域代码
|
||||
/// </summary>
|
||||
[JsonPropertyName("region")]
|
||||
public string Region { get; set; } = default!;
|
||||
[JsonConverter(typeof(RegionConverter))]
|
||||
public Region Region { get; set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// 等级
|
||||
|
||||
Reference in New Issue
Block a user