diff --git a/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs index 45365467..f2fd9c83 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs @@ -21,6 +21,7 @@ internal class SpiralAbyssRecordService : ISpiralAbyssRecordService { private readonly AppDbContext appDbContext; private readonly GameRecordClient gameRecordClient; + private readonly GameRecordClientOs gameRecordClientOs; private string? uid; private ObservableCollection? spiralAbysses; @@ -30,10 +31,11 @@ internal class SpiralAbyssRecordService : ISpiralAbyssRecordService /// /// 数据库上下文 /// 游戏记录客户端 - public SpiralAbyssRecordService(AppDbContext appDbContext, GameRecordClient gameRecordClient) + public SpiralAbyssRecordService(AppDbContext appDbContext, GameRecordClient gameRecordClient, GameRecordClientOs gameRecordClientOs) { this.appDbContext = appDbContext; this.gameRecordClient = gameRecordClient; + this.gameRecordClientOs = gameRecordClientOs; } /// @@ -70,9 +72,21 @@ internal class SpiralAbyssRecordService : ISpiralAbyssRecordService private async Task RefreshSpiralAbyssCoreAsync(UserAndUid userAndUid, SpiralAbyssSchedule schedule) { - Response response = await gameRecordClient + Response response; + + // server determination + if (userAndUid.Uid.Region == "cn_gf01" || userAndUid.Uid.Region == "cn_qd01") + { + response = await gameRecordClient .GetSpiralAbyssAsync(userAndUid, schedule) .ConfigureAwait(false); + } + else + { + response = await gameRecordClientOs + .GetSpiralAbyssAsync(userAndUid, schedule) + .ConfigureAwait(false); + } if (response.IsOk()) { 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 new file mode 100644 index 00000000..375461af --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClientOs.cs @@ -0,0 +1,58 @@ +using Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient; +using Snap.Hutao.Model.Binding.User; +using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Service.Abstraction; +using Snap.Hutao.Web.Hoyolab.Annotation; +using Snap.Hutao.Web.Hoyolab.DynamicSecret; +using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.Avatar; +using Snap.Hutao.Web.Response; +using System.Net.Http; + +namespace Snap.Hutao.Web.Hoyolab.Takumi.GameRecord; + +/// +/// Hoyoverse game record provider +/// +[HighQuality] +[UseDynamicSecret] +[HttpClient(HttpClientConfigration.XRpc3)] +[PrimaryHttpMessageHandler(UseCookies = false)] +internal sealed class GameRecordClientOs +{ + private readonly HttpClient httpClient; + private readonly JsonSerializerOptions options; + private readonly ILogger logger; + + /// + /// 构造一个新的游戏记录提供器 + /// + /// 请求器 + /// json序列化选项 + /// 日志器 + public GameRecordClientOs(HttpClient httpClient, JsonSerializerOptions options, ILogger logger) + { + this.httpClient = httpClient; + this.options = options; + this.logger = logger; + } + + /// + /// 获取玩家深渊信息 + /// + /// 用户 + /// 1:当期,2:上期 + /// 取消令牌 + /// 深渊信息 + [ApiInformation(Cookie = CookieType.Cookie, Salt = SaltType.OS)] + public async Task> GetSpiralAbyssAsync(UserAndUid userAndUid, SpiralAbyssSchedule schedule, CancellationToken token = default) + { + System.Net.Http.Headers.HttpRequestHeaders headers = httpClient.DefaultRequestHeaders; + Response? resp = await httpClient + .SetUser(userAndUid.User, CookieType.Cookie) + .UseDynamicSecret(DynamicSecretVersion.Gen1, SaltType.OS, false) + .TryCatchGetFromJsonAsync>(ApiOsEndpoints.GameRecordSpiralAbyss(schedule, userAndUid.Uid), options, logger, token) + .ConfigureAwait(false); + + return Response.Response.DefaultIfNull(resp); + } +}