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