replace all region

This commit is contained in:
qhy040404
2023-12-20 15:25:46 +08:00
parent 3661822852
commit 05a8ab990c
13 changed files with 60 additions and 42 deletions

View File

@@ -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&region={region}&level=55&uid=100000000";
}

View File

@@ -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&region={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&region={region}&level=55&uid=100000000";
}

View File

@@ -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()
{

View File

@@ -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(),
};
}
}

View File

@@ -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();
}

View 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());
}
}

View File

@@ -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>
/// 创建为祈愿记录验证密钥提交数据

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -20,7 +20,7 @@ internal sealed class CharacterData
{
CharacterIds = characterIds;
Uid = uid.Value;
Server = uid.Region;
Server = uid.Region.Value;
}
/// <summary>

View File

@@ -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>
/// 等级

View File

@@ -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>
/// 等级