diff --git a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs index b65a7468..fa053f12 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs @@ -153,31 +153,14 @@ internal static class ApiEndpoints #region ApiTakumiEventCalculate - /// - /// 计算器角色列表 size 20 - /// + #region V1 public const string CalculateAvatarList = $"{ApiTakumiEventCalculate}/v1/avatar/list"; - /// - /// 计算器角色技能列表 - /// - /// 元素类型 - /// 技能列表 public static string CalculateAvatarSkillList(Hoyolab.Takumi.Event.Calculate.Avatar avatar) { return $"{ApiTakumiEventCalculate}/v1/avatarSkill/list?avatar_id={avatar.Id}&element_attr_id={(int)avatar.ElementAttrId}"; } - /// - /// 计算器结果 - /// - public const string CalculateCompute = $"{ApiTakumiEventCalculate}/v2/compute"; - - /// - /// 计算器洞天摹本 - /// - /// 分享码 - /// 洞天摹本 public static string CalculateFurnitureBlueprint(string shareCode) { // ®ion=cn_gf01 @@ -185,38 +168,30 @@ internal static class ApiEndpoints return $"{ApiTakumiEventCalculate}/v1/furniture/blueprint?share_code={shareCode}"; } - /// - /// 计算器家具计算 - /// public const string CalculateFurnitureCompute = $"{ApiTakumiEventCalculate}/v1/furniture/compute"; - /// - /// 计算器家具列表 size 32 - /// public const string CalculateFurnitureList = $"{ApiTakumiEventCalculate}/v1/furniture/list"; - /// - /// 计算器同步角色详情 size 20 - /// - /// 角色Id - /// uid - /// 角色详情 public static string CalculateSyncAvatarDetail(in AvatarId avatarId, in PlayerUid uid) { return $"{ApiTakumiEventCalculate}/v1/sync/avatar/detail?avatar_id={avatarId.Value}&uid={uid.Value}®ion={uid.Region}"; } - /// - /// 计算器同步角色列表 size 20 - /// public const string CalculateSyncAvatarList = $"{ApiTakumiEventCalculate}/v1/sync/avatar/list"; - /// - /// 计算器武器列表 size 20 - /// public const string CalculateWeaponList = $"{ApiTakumiEventCalculate}/v1/weapon/list"; #endregion + #region V2 + public const string CalculateCompute = $"{ApiTakumiEventCalculate}/v2/compute"; + #endregion + + #region V3 + public const string CalculateBatchCompute = $"{ApiTakumiEventCalculate}/v3/batch_compute"; + #endregion + + #endregion + #region ApiTakumiEventLuna public const string LunaActivityId = "e202311201442471"; diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/BatchConsumption.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/BatchConsumption.cs new file mode 100644 index 00000000..b43e7f8f --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/BatchConsumption.cs @@ -0,0 +1,19 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate; + +internal sealed class BatchConsumption +{ + [JsonPropertyName("items")] + public List? Items { get; set; } + + [JsonPropertyName("available_material")] + public List? AvailableMaterial { get; set; } + + [JsonPropertyName("overall_consume")] + public List? OverallConsume { get; set; } + + [JsonPropertyName("has_user_info")] + public bool HasUserInfo { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/BatchSkillCosumption.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/BatchSkillCosumption.cs new file mode 100644 index 00000000..68cd9390 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/BatchSkillCosumption.cs @@ -0,0 +1,13 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate; + +internal sealed class BatchSkillCosumption +{ + [JsonPropertyName("consume_list")] + public List ConsumeList { get; set; } = default!; + + [JsonPropertyName("skill_info")] + public PromotionDelta SkillInfo { get; set; } = default!; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Calculable.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Calculable.cs index 6120b957..8e250bac 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Calculable.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Calculable.cs @@ -7,14 +7,8 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate; /// 可计算的物品 /// [HighQuality] -internal class Calculable +internal class Calculable : PromotionDelta { - /// - /// Id - /// - [JsonPropertyName("id")] - public uint Id { get; set; } - /// /// 名称 /// @@ -27,24 +21,12 @@ internal class Calculable [JsonPropertyName("icon_url")] public Uri Icon { get; set; } = default!; - /// - /// 默认值设为1,因为部分API不返回该字段 - /// - [JsonPropertyName("level_current")] - public uint LevelCurrent { get; set; } = 1; - /// /// 最大等级 /// [JsonPropertyName("max_level")] public int MaxLevel { get; set; } - /// - /// 目标等级 - /// - [JsonIgnore] - public uint LevelTarget { get; set; } - /// /// 转化到提升差异 /// @@ -58,4 +40,4 @@ internal class Calculable Id = Id, }; } -} +} \ No newline at end of file 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 e3e050f0..bd41c15a 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 @@ -34,6 +34,30 @@ internal sealed partial class CalculateClient return Response.Response.DefaultIfNull(resp); } + public async ValueTask> BatchComputeAsync(UserAndUid userAndUid, List deltas, CancellationToken token = default) + { + ArgumentOutOfRangeException.ThrowIfGreaterThan(deltas.Count, 8); + + BatchConsumptionData data = new() + { + Items = deltas, + Region = userAndUid.Uid.Region, + Uid = userAndUid.Uid.ToString(), + }; + + HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() + .SetRequestUri(ApiEndpoints.CalculateBatchCompute) + .SetUserCookieAndFpHeader(userAndUid.User, CookieType.Cookie) + .SetReferer(userAndUid.IsOversea ? ApiOsEndpoints.ActHoyolabReferer : ApiEndpoints.WebStaticMihoyoReferer) + .PostJson(data); + + Response? resp = await builder + .TryCatchSendAsync>(httpClient, logger, token) + .ConfigureAwait(false); + + return Response.Response.DefaultIfNull(resp); + } + public async ValueTask> GetAvatarsAsync(UserAndUid userAndUid, CancellationToken token = default) { int currentPage = 1; @@ -153,4 +177,16 @@ internal sealed partial class CalculateClient [JsonPropertyName("id")] public uint Id { get; set; } } + + private class BatchConsumptionData + { + [JsonPropertyName("items")] + public List Items { get; set; } = default!; + + [JsonPropertyName("region")] + public Region Region { get; set; } = default!; + + [JsonPropertyName("uid")] + public string Uid { get; set; } = default!; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Consumption.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Consumption.cs index ea046c87..f5fd8615 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Consumption.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Consumption.cs @@ -7,7 +7,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate; /// 消耗 /// [HighQuality] -internal sealed class Consumption +internal class Consumption { /// /// 角色等级消耗 @@ -26,4 +26,7 @@ internal sealed class Consumption /// [JsonPropertyName("weapon_consume")] public List? WeaponConsume { get; set; } + + [JsonPropertyName("skills_consume")] + public List? SkillsComsume { get; set; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Item.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Item.cs index ba897985..b0a7b62e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Item.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/Item.cs @@ -40,4 +40,7 @@ internal sealed class Item /// [JsonPropertyName("level")] public QualityType Level { get; set; } + + [JsonPropertyName("lack_num")] + public uint LackNum { get; set; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/PromotionDelta.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/PromotionDelta.cs index c32c939d..f2a7fa78 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/PromotionDelta.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/Event/Calculate/PromotionDelta.cs @@ -7,7 +7,7 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate; /// 计算信息 /// [HighQuality] -internal sealed class PromotionDelta +internal class PromotionDelta { /// /// 物品Id