From 8a2fa3c7017a621ef0a4aac78bc272f87e1059e2 Mon Sep 17 00:00:00 2001
From: Lightczx <1686188646@qq.com>
Date: Sun, 3 Mar 2024 17:25:51 +0800
Subject: [PATCH] factory completed
---
.../Core/ExceptionService/HutaoException.cs | 8 ++++++
.../ExceptionService/HutaoExceptionKind.cs | 1 +
.../Snap.Hutao/Model/Entity/GachaItem.cs | 4 +--
.../Model/InterChange/GachaLog/UIGFItem.cs | 2 +-
.../Snap.Hutao/Model/Metadata/GachaEvent.cs | 2 +-
.../Snap.Hutao/Resource/Localization/SH.resx | 6 ++++
.../Factory/GachaConfigTypeComparer.cs | 6 ++--
.../Factory/GachaStatisticsExtension.cs | 2 +-
.../Factory/GachaStatisticsFactory.cs | 12 ++++++--
.../Factory/GachaStatisticsSlimFactory.cs | 20 ++++++++++---
.../GachaLog/Factory/HistoryWishBuilder.cs | 12 ++++++--
.../Factory/HutaoStatisticsFactory.cs | 15 ++++++----
.../HutaoStatisticsFactoryMetadataContext.cs | 19 ++++++-------
.../Factory/TypedWishSummaryBuilder.cs | 6 ++--
.../Factory/TypedWishSummaryBuilderContext.cs | 16 +++++++----
.../Service/GachaLog/GachaItemSaveContext.cs | 4 +--
.../Snap.Hutao/Service/GachaLog/GachaLog.cs | 10 +++----
.../Service/GachaLog/GachaLogDbService.cs | 18 ++++++------
.../Service/GachaLog/GachaLogFetchContext.cs | 4 +--
.../Service/GachaLog/GachaLogFetchStatus.cs | 4 +--
.../GachaLog/GachaLogHutaoCloudService.cs | 12 ++++----
.../Service/GachaLog/GachaLogService.cs | 2 +-
.../Service/GachaLog/IGachaLogDbService.cs | 18 ++++++------
.../Service/GachaLog/UIGFImportService.cs | 2 +-
.../IMetadataListGachaEventSource.cs | 11 ++++++++
.../MetadataServiceContextExtension.cs | 5 ++++
.../Snap.Hutao/View/Page/GachaLogPage.xaml | 2 +-
.../ViewModel/GachaLog/GachaStatistics.cs | 5 ++++
.../ViewModel/GachaLog/HutaoStatistics.cs | 7 ++++-
.../GachaInfo/GachaConfigTypeExtension.cs | 4 +--
.../Hk4e/Event/GachaInfo/GachaLogItem.cs | 2 +-
.../Event/GachaInfo/GachaLogQueryOptions.cs | 4 +--
.../{GachaConfigType.cs => GachaType.cs} | 25 +++++++++--------
.../Snap.Hutao/Web/Hutao/GachaLog/EndIds.cs | 28 +++++++++----------
.../Hutao/GachaLog/GachaDistributionType.cs | 5 ++++
.../Hutao/GachaLog/GachaEventStatistics.cs | 5 ++++
.../Web/Hutao/GachaLog/GachaItem.cs | 4 +--
37 files changed, 198 insertions(+), 114 deletions(-)
create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataListGachaEventSource.cs
rename src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/{GachaConfigType.cs => GachaType.cs} (68%)
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoException.cs b/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoException.cs
index 33194edd..85aadfae 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoException.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoException.cs
@@ -1,6 +1,8 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
+using System.Numerics;
+
namespace Snap.Hutao.Core.ExceptionService;
internal sealed class HutaoException : Exception
@@ -37,4 +39,10 @@ internal sealed class HutaoException : Exception
string message = $"This instance of '{typeof(TFrom).FullName}' '{name}' doesn't implement '{typeof(TTo).FullName}'";
throw new HutaoException(HutaoExceptionKind.ServiceTypeCastFailed, message, innerException);
}
+
+ public static HutaoException GachaStatisticsInvalidItemId(uint id, Exception? innerException = default)
+ {
+ string message = SH.FormatServiceGachaStatisticsFactoryItemIdInvalid(id);
+ throw new HutaoException(HutaoExceptionKind.GachaStatisticsInvalidItemId, message, innerException);
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoExceptionKind.cs b/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoExceptionKind.cs
index 1848aae4..382c2ed0 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoExceptionKind.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/HutaoExceptionKind.cs
@@ -9,4 +9,5 @@ internal enum HutaoExceptionKind
ServiceTypeCastFailed,
FileSystemCreateFileInsufficientPermissions,
PrivateNamedPipeContentHashIncorrect,
+ GachaStatisticsInvalidItemId,
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/GachaItem.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/GachaItem.cs
index cf7407b5..158bd4a6 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/GachaItem.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/GachaItem.cs
@@ -42,14 +42,14 @@ internal sealed partial class GachaItem
///
/// 祈愿记录分类
///
- public GachaConfigType GachaType { get; set; }
+ public GachaType GachaType { get; set; }
///
/// 祈愿记录查询分类
/// 合并保底的卡池使用此属性
/// 仅4种(不含400)
///
- public GachaConfigType QueryType { get; set; }
+ public GachaType QueryType { get; set; }
///
/// 物品Id
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs
index 1f7df4fd..a0b6fe2f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs
@@ -20,7 +20,7 @@ internal sealed class UIGFItem : GachaLogItem, IMappingFrom
[JsonPropertyName("uigf_gacha_type")]
[JsonEnum(JsonSerializeType.NumberString)]
- public GachaConfigType UIGFGachaType { get; set; } = default!;
+ public GachaType UIGFGachaType { get; set; } = default!;
public static UIGFItem From(GachaItem item, INameQuality nameQuality)
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs
index dac8a7a7..6360b379 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs
@@ -49,7 +49,7 @@ internal sealed class GachaEvent
///
/// 卡池类型
///
- public GachaConfigType Type { get; set; }
+ public GachaType Type { get; set; }
///
/// 五星列表
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
index 13e56bf4..eb7bdfde 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
@@ -860,6 +860,9 @@
角色活动
+
+ 集录祈愿
+
奔行世间
@@ -3047,6 +3050,9 @@
角色活动祈愿-2
+
+ 集录祈愿
+
新手祈愿
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs
index 533ff220..9771397f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs
@@ -10,7 +10,7 @@ namespace Snap.Hutao.Service.GachaLog.Factory;
///
/// 祈愿配置类型比较器
///
-internal sealed class GachaConfigTypeComparer : IComparer
+internal sealed class GachaConfigTypeComparer : IComparer
{
private static readonly Lazy LazyShared = new(() => new());
private static readonly FrozenDictionary OrderMap = FrozenDictionary.ToFrozenDictionary(
@@ -28,13 +28,13 @@ internal sealed class GachaConfigTypeComparer : IComparer
public static GachaConfigTypeComparer Shared { get => LazyShared.Value; }
///
- public int Compare(GachaConfigType x, GachaConfigType y)
+ public int Compare(GachaType x, GachaType y)
{
return OrderOf(x) - OrderOf(y);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int OrderOf(GachaConfigType type)
+ private static int OrderOf(GachaType type)
{
return OrderMap.GetValueOrDefault(type, 0);
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs
index 7259e33f..9663e3b1 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs
@@ -62,4 +62,4 @@ internal static class GachaStatisticsExtension
ReadOnlySpan codes = MD5.HashData(Encoding.UTF8.GetBytes(name));
return Color.FromArgb(255, codes.Slice(0, 5).Average(), codes.Slice(5, 5).Average(), codes.Slice(10, 5).Average());
}
-}
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs
index 56506999..d484cd32 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs
@@ -54,6 +54,9 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
TypedWishSummaryBuilderContext weaponContext = TypedWishSummaryBuilderContext.WeaponEventWish(taskContext, gachaLogClient);
TypedWishSummaryBuilder weaponWishBuilder = new(weaponContext);
+ TypedWishSummaryBuilderContext chronicledContext = TypedWishSummaryBuilderContext.ChronicledWish(taskContext, gachaLogClient);
+ TypedWishSummaryBuilder chronicledWishBuilder = new(chronicledContext);
+
Dictionary orangeAvatarCounter = [];
Dictionary purpleAvatarCounter = [];
Dictionary orangeWeaponCounter = [];
@@ -61,7 +64,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
Dictionary blueWeaponCounter = [];
// Pre group builders
- Dictionary> historyWishBuilderMap = historyWishBuilders
+ Dictionary> historyWishBuilderMap = historyWishBuilders
.GroupBy(b => b.ConfigType)
.ToDictionary(g => g.Key, g => g.ToList().SortBy(b => b.From));
@@ -70,7 +73,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
foreach (Model.Entity.GachaItem item in CollectionsMarshal.AsSpan(items))
{
// Find target history wish to operate. // w.From <= item.Time <= w.To
- HistoryWishBuilder? targetHistoryWishBuilder = item.GachaType is not (GachaConfigType.StandardWish or GachaConfigType.NoviceWish)
+ HistoryWishBuilder? targetHistoryWishBuilder = item.GachaType is not (GachaType.Standard or GachaType.NewBie)
? historyWishBuilderMap[item.GachaType].BinarySearch(w => item.Time < w.From ? -1 : item.Time > w.To ? 1 : 0)
: default;
@@ -98,6 +101,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
standardWishBuilder.Track(item, avatar, isUp);
avatarWishBuilder.Track(item, avatar, isUp);
weaponWishBuilder.Track(item, avatar, isUp);
+ chronicledWishBuilder.Track(item, avatar, isUp);
break;
}
@@ -127,12 +131,13 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
standardWishBuilder.Track(item, weapon, isUp);
avatarWishBuilder.Track(item, weapon, isUp);
weaponWishBuilder.Track(item, weapon, isUp);
+ chronicledWishBuilder.Track(item, weapon, isUp);
break;
}
default:
// ItemId string length not correct.
- ThrowHelper.UserdataCorrupted(SH.FormatServiceGachaStatisticsFactoryItemIdInvalid(item.ItemId), default!);
+ HutaoException.GachaStatisticsInvalidItemId(item.ItemId);
break;
}
}
@@ -162,6 +167,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
StandardWish = standardWishBuilder.ToTypedWishSummary(barrier),
AvatarWish = avatarWishBuilder.ToTypedWishSummary(barrier),
WeaponWish = weaponWishBuilder.ToTypedWishSummary(barrier),
+ ChronicledWish = chronicledWishBuilder.ToTypedWishSummary(barrier),
};
}
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsSlimFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsSlimFactory.cs
index daa3e0b6..22b02de4 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsSlimFactory.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsSlimFactory.cs
@@ -62,22 +62,29 @@ internal sealed partial class GachaStatisticsSlimFactory : IGachaStatisticsSlimF
int weaponPurpleTracker = 0;
TypedWishSummarySlim weaponWish = new(SH.ServiceGachaLogFactoryWeaponWishName, 80, 10);
+ int chronicledOrangeTracker = 0;
+ int chronicledPurpleTracker = 0;
+ TypedWishSummarySlim chronicledWish = new(SH.ServiceGachaLogFactoryChronicledWishName, 90, 10);
+
// O(n) operation
foreach (ref readonly GachaItem item in CollectionsMarshal.AsSpan(items))
{
INameQuality nameQuality = context.GetNameQualityByItemId(item.ItemId);
switch (item.QueryType)
{
- case GachaConfigType.StandardWish:
+ case GachaType.Standard:
Track(nameQuality, ref standardOrangeTracker, ref standardPurpleTracker);
break;
- case GachaConfigType.AvatarEventWish:
- case GachaConfigType.AvatarEventWish2:
+ case GachaType.ActivityAvatar:
+ case GachaType.SpecialActivityAvatar:
Track(nameQuality, ref avatarOrangeTracker, ref avatarPurpleTracker);
break;
- case GachaConfigType.WeaponEventWish:
+ case GachaType.ActivityWeapon:
Track(nameQuality, ref weaponOrangeTracker, ref weaponPurpleTracker);
break;
+ case GachaType.ActivityCity:
+ Track(nameQuality, ref chronicledOrangeTracker, ref chronicledPurpleTracker);
+ break;
default:
break;
}
@@ -85,11 +92,16 @@ internal sealed partial class GachaStatisticsSlimFactory : IGachaStatisticsSlimF
standardWish.LastOrangePull = standardOrangeTracker;
standardWish.LastPurplePull = standardPurpleTracker;
+
avatarWish.LastOrangePull = avatarOrangeTracker;
avatarWish.LastPurplePull = avatarPurpleTracker;
+
weaponWish.LastOrangePull = weaponOrangeTracker;
weaponWish.LastPurplePull = weaponPurpleTracker;
+ chronicledWish.LastOrangePull = chronicledOrangeTracker;
+ chronicledWish.LastPurplePull = chronicledPurpleTracker;
+
return new()
{
Uid = uid,
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HistoryWishBuilder.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HistoryWishBuilder.cs
index 043a43bb..55166473 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HistoryWishBuilder.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HistoryWishBuilder.cs
@@ -37,21 +37,27 @@ internal sealed class HistoryWishBuilder
switch (ConfigType)
{
- case GachaConfigType.AvatarEventWish or GachaConfigType.AvatarEventWish2:
+ case GachaType.ActivityAvatar or GachaType.SpecialActivityAvatar:
orangeUpCounter = gachaEvent.UpOrangeList.Select(id => context.IdAvatarMap[id]).ToDictionary(a => (IStatisticsItemSource)a, a => 0);
purpleUpCounter = gachaEvent.UpPurpleList.Select(id => context.IdAvatarMap[id]).ToDictionary(a => (IStatisticsItemSource)a, a => 0);
break;
- case GachaConfigType.WeaponEventWish:
+ case GachaType.ActivityWeapon:
orangeUpCounter = gachaEvent.UpOrangeList.Select(id => context.IdWeaponMap[id]).ToDictionary(w => (IStatisticsItemSource)w, w => 0);
purpleUpCounter = gachaEvent.UpPurpleList.Select(id => context.IdWeaponMap[id]).ToDictionary(w => (IStatisticsItemSource)w, w => 0);
break;
+ case GachaType.ActivityCity:
+
+ // Avatars are less than weapons, so we try to get the value from avatar map first
+ orangeUpCounter = gachaEvent.UpOrangeList.Select(id => (IStatisticsItemSource?)context.IdAvatarMap.GetValueOrDefault(id) ?? context.IdWeaponMap[id]).ToDictionary(c => c, c => 0);
+ purpleUpCounter = gachaEvent.UpPurpleList.Select(id => (IStatisticsItemSource?)context.IdAvatarMap.GetValueOrDefault(id) ?? context.IdWeaponMap[id]).ToDictionary(c => c, c => 0);
+ break;
}
}
///
/// 祈愿配置类型
///
- public GachaConfigType ConfigType { get; }
+ public GachaType ConfigType { get; }
///
public DateTimeOffset From { get => gachaEvent.From; }
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs
index feae8b55..1e4657a1 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs
@@ -18,18 +18,20 @@ internal sealed class HutaoStatisticsFactory
private readonly GachaEvent avatarEvent;
private readonly GachaEvent avatarEvent2;
private readonly GachaEvent weaponEvent;
+ private readonly GachaEvent chronicledEvent;
public HutaoStatisticsFactory(in HutaoStatisticsFactoryMetadataContext context)
{
this.context = context;
- // TODO: when in new verion
+ // when in new verion
// due to lack of newer metadata
// this can crash
DateTimeOffset now = DateTimeOffset.UtcNow;
- avatarEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.AvatarEventWish);
- avatarEvent2 = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.AvatarEventWish2);
- weaponEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.WeaponEventWish);
+ avatarEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.ActivityAvatar);
+ avatarEvent2 = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.SpecialActivityAvatar);
+ weaponEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.ActivityWeapon);
+ chronicledEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.ActivityCity);
}
public HutaoStatistics Create(GachaEventStatistics raw)
@@ -38,7 +40,8 @@ internal sealed class HutaoStatisticsFactory
{
AvatarEvent = CreateWishSummary(avatarEvent, raw.AvatarEvent),
AvatarEvent2 = CreateWishSummary(avatarEvent2, raw.AvatarEvent2),
- WeaponWish = CreateWishSummary(weaponEvent, raw.WeaponEvent),
+ WeaponEvent = CreateWishSummary(weaponEvent, raw.WeaponEvent),
+ ChronicledWish = CreateWishSummary(chronicledEvent, raw.Chronicled),
};
}
@@ -55,7 +58,7 @@ internal sealed class HutaoStatisticsFactory
{
8U => context.IdAvatarMap[item.Item],
5U => context.IdWeaponMap[item.Item],
- _ => throw ThrowHelper.UserdataCorrupted(SH.FormatServiceGachaStatisticsFactoryItemIdInvalid(item.Item), default!),
+ _ => throw HutaoException.GachaStatisticsInvalidItemId(item.Item),
};
StatisticsItem statisticsItem = source.ToStatisticsItem(unchecked((int)item.Count));
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs
index 9076274d..6ef7af42 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs
@@ -5,19 +5,18 @@ using Snap.Hutao.Model.Metadata;
using Snap.Hutao.Model.Metadata.Avatar;
using Snap.Hutao.Model.Metadata.Weapon;
using Snap.Hutao.Model.Primitive;
+using Snap.Hutao.Service.Metadata.ContextAbstraction;
namespace Snap.Hutao.Service.GachaLog.Factory;
-internal readonly struct HutaoStatisticsFactoryMetadataContext
+internal sealed class HutaoStatisticsFactoryMetadataContext : IMetadataContext,
+ IMetadataDictionaryIdAvatarSource,
+ IMetadataDictionaryIdWeaponSource,
+ IMetadataListGachaEventSource
{
- public readonly Dictionary IdAvatarMap;
- public readonly Dictionary IdWeaponMap;
- public readonly List GachaEvents;
+ public Dictionary IdAvatarMap { get; set; } = default!;
- public HutaoStatisticsFactoryMetadataContext(Dictionary idAvatarMap, Dictionary idWeaponMap, List gachaEvents)
- {
- IdAvatarMap = idAvatarMap;
- IdWeaponMap = idWeaponMap;
- GachaEvents = gachaEvents;
- }
+ public Dictionary IdWeaponMap { get; set; } = default!;
+
+ public List GachaEvents { get; set; } = default!;
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs
index db25c690..72e13b23 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs
@@ -18,17 +18,17 @@ internal sealed class TypedWishSummaryBuilder
///
/// 常驻祈愿
///
- public static readonly Func IsStandardWish = type => type is GachaConfigType.StandardWish;
+ public static readonly Func IsStandardWish = type => type is GachaType.Standard;
///
/// 角色活动
///
- public static readonly Func IsAvatarEventWish = type => type is GachaConfigType.AvatarEventWish or GachaConfigType.AvatarEventWish2;
+ public static readonly Func IsAvatarEventWish = type => type is GachaType.ActivityAvatar or GachaType.SpecialActivityAvatar;
///
/// 武器活动
///
- public static readonly Func IsWeaponEventWish = type => type is GachaConfigType.WeaponEventWish;
+ public static readonly Func IsWeaponEventWish = type => type is GachaType.ActivityWeapon;
private readonly TypedWishSummaryBuilderContext context;
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilderContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilderContext.cs
index 5c964feb..f75fb481 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilderContext.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilderContext.cs
@@ -14,12 +14,13 @@ internal readonly struct TypedWishSummaryBuilderContext
public readonly string Name;
public readonly int GuaranteeOrangeThreshold;
public readonly int GuaranteePurpleThreshold;
- public readonly Func TypeEvaluator;
+ public readonly Func TypeEvaluator;
public readonly GachaDistributionType DistributionType;
- private static readonly Func IsStandardWish = type => type is GachaConfigType.StandardWish;
- private static readonly Func IsAvatarEventWish = type => type is GachaConfigType.AvatarEventWish or GachaConfigType.AvatarEventWish2;
- private static readonly Func IsWeaponEventWish = type => type is GachaConfigType.WeaponEventWish;
+ private static readonly Func IsStandardWish = type => type is GachaType.Standard;
+ private static readonly Func IsAvatarEventWish = type => type is GachaType.ActivityAvatar or GachaType.SpecialActivityAvatar;
+ private static readonly Func IsWeaponEventWish = type => type is GachaType.ActivityWeapon;
+ private static readonly Func IsChronicledWish = type => type is GachaType.ActivityCity;
public TypedWishSummaryBuilderContext(
ITaskContext taskContext,
@@ -27,7 +28,7 @@ internal readonly struct TypedWishSummaryBuilderContext
string name,
int guaranteeOrangeThreshold,
int guaranteePurpleThreshold,
- Func typeEvaluator,
+ Func typeEvaluator,
GachaDistributionType distributionType)
{
TaskContext = taskContext;
@@ -54,6 +55,11 @@ internal readonly struct TypedWishSummaryBuilderContext
return new(taskContext, gachaLogClient, SH.ServiceGachaLogFactoryWeaponWishName, 80, 10, IsWeaponEventWish, GachaDistributionType.WeaponEvent);
}
+ public static TypedWishSummaryBuilderContext ChronicledWish(ITaskContext taskContext, HomaGachaLogClient gachaLogClient)
+ {
+ return new(taskContext, gachaLogClient, SH.ServiceGachaLogFactoryChronicledWishName, 90, 10, IsChronicledWish, GachaDistributionType.Chronicled);
+ }
+
public ValueTask> GetGachaDistributionAsync()
{
return GachaLogClient.GetGachaDistributionAsync(DistributionType);
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaItemSaveContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaItemSaveContext.cs
index b225eb64..4895bf5a 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaItemSaveContext.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaItemSaveContext.cs
@@ -21,7 +21,7 @@ internal readonly struct GachaItemSaveContext
///
public readonly bool IsLazy;
- public readonly GachaConfigType QueryType;
+ public readonly GachaType QueryType;
///
/// 结尾 Id
@@ -33,7 +33,7 @@ internal readonly struct GachaItemSaveContext
///
public readonly IGachaLogDbService GachaLogDbService;
- public GachaItemSaveContext(List itemsToAdd, bool isLazy, GachaConfigType queryType, long endId, IGachaLogDbService gachaLogDbService)
+ public GachaItemSaveContext(List itemsToAdd, bool isLazy, GachaType queryType, long endId, IGachaLogDbService gachaLogDbService)
{
ItemsToAdd = itemsToAdd;
IsLazy = isLazy;
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLog.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLog.cs
index 81de38be..bc85b90a 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLog.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLog.cs
@@ -14,11 +14,11 @@ internal static class GachaLog
///
/// 查询类型
///
- public static readonly FrozenSet QueryTypes = FrozenSet.ToFrozenSet(
+ public static readonly FrozenSet QueryTypes = FrozenSet.ToFrozenSet(
[
- GachaConfigType.NoviceWish,
- GachaConfigType.StandardWish,
- GachaConfigType.AvatarEventWish,
- GachaConfigType.WeaponEventWish,
+ GachaType.NewBie,
+ GachaType.Standard,
+ GachaType.ActivityAvatar,
+ GachaType.ActivityWeapon,
]);
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogDbService.cs
index 4d6b8abb..421f8951 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogDbService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogDbService.cs
@@ -73,7 +73,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
}
}
- public async ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaConfigType queryType, CancellationToken token)
+ public async ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaType queryType, CancellationToken token)
{
GachaItem? item = null;
@@ -103,7 +103,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
return item?.Id ?? 0L;
}
- public long GetNewestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaConfigType queryType)
+ public long GetNewestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaType queryType)
{
GachaItem? item = null;
@@ -132,7 +132,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
return item?.Id ?? 0L;
}
- public async ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaConfigType queryType)
+ public async ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaType queryType)
{
GachaItem? item = null;
@@ -205,7 +205,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
return item?.Id ?? long.MaxValue;
}
- public long GetOldestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaConfigType queryType)
+ public long GetOldestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaType queryType)
{
GachaItem? item = null;
@@ -226,7 +226,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
return item?.Id ?? long.MaxValue;
}
- public async ValueTask GetOldestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaConfigType queryType, CancellationToken token)
+ public async ValueTask GetOldestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaType queryType, CancellationToken token)
{
GachaItem? item = null;
@@ -266,7 +266,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
}
}
- public List GetHutaoGachaItemList(Guid archiveId, GachaConfigType queryType, long endId)
+ public List GetHutaoGachaItemList(Guid archiveId, GachaType queryType, long endId)
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
@@ -291,7 +291,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
}
}
- public async ValueTask> GetHutaoGachaItemListAsync(Guid archiveId, GachaConfigType queryType, long endId)
+ public async ValueTask> GetHutaoGachaItemListAsync(Guid archiveId, GachaType queryType, long endId)
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
@@ -368,7 +368,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
}
}
- public void RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndId(Guid archiveId, GachaConfigType queryType, long endId)
+ public void RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndId(Guid archiveId, GachaType queryType, long endId)
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
@@ -381,7 +381,7 @@ internal sealed partial class GachaLogDbService : IGachaLogDbService
}
}
- public async ValueTask RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndIdAsync(Guid archiveId, GachaConfigType queryType, long endId)
+ public async ValueTask RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndIdAsync(Guid archiveId, GachaType queryType, long endId)
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchContext.cs
index 5d7448eb..871ee384 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchContext.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchContext.cs
@@ -46,7 +46,7 @@ internal struct GachaLogFetchContext
///
/// 当前类型
///
- public GachaConfigType CurrentType;
+ public GachaType CurrentType;
private readonly GachaLogServiceMetadataContext serviceContext;
private readonly IGachaLogDbService gachaLogDbService;
@@ -66,7 +66,7 @@ internal struct GachaLogFetchContext
///
/// 卡池类型
/// 查询
- public void ResetForProcessingType(GachaConfigType configType, in GachaLogQuery query)
+ public void ResetForProcessingType(GachaType configType, in GachaLogQuery query)
{
DbEndId = null;
CurrentType = configType;
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchStatus.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchStatus.cs
index a01c15c4..55fa83d0 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchStatus.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogFetchStatus.cs
@@ -15,7 +15,7 @@ internal sealed class GachaLogFetchStatus
/// 构造一个新的祈愿记录获取状态
///
/// 卡池类型
- public GachaLogFetchStatus(GachaConfigType configType)
+ public GachaLogFetchStatus(GachaType configType)
{
ConfigType = configType;
}
@@ -28,7 +28,7 @@ internal sealed class GachaLogFetchStatus
///
/// 卡池类型
///
- public GachaConfigType ConfigType { get; set; }
+ public GachaType ConfigType { get; set; }
///
/// 当前获取的物品
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogHutaoCloudService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogHutaoCloudService.cs
index 9998565e..232eb10b 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogHutaoCloudService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogHutaoCloudService.cs
@@ -8,6 +8,7 @@ using Snap.Hutao.Model.Metadata.Weapon;
using Snap.Hutao.Model.Primitive;
using Snap.Hutao.Service.GachaLog.Factory;
using Snap.Hutao.Service.Metadata;
+using Snap.Hutao.Service.Metadata.ContextAbstraction;
using Snap.Hutao.ViewModel.GachaLog;
using Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo;
using Snap.Hutao.Web.Hutao.GachaLog;
@@ -40,7 +41,7 @@ internal sealed partial class GachaLogHutaoCloudService : IGachaLogHutaoCloudSer
if (await GetEndIdsFromCloudAsync(uid, token).ConfigureAwait(false) is { } endIds)
{
List items = [];
- foreach ((GachaConfigType type, long endId) in endIds)
+ foreach ((GachaType type, long endId) in endIds)
{
List part = await gachaLogDbService
.GetHutaoGachaItemListAsync(gachaArchive.InnerId, type, endId)
@@ -94,10 +95,9 @@ internal sealed partial class GachaLogHutaoCloudService : IGachaLogHutaoCloudSer
{
if (await metadataService.InitializeAsync().ConfigureAwait(false))
{
- Dictionary idAvatarMap = await metadataService.GetIdToAvatarMapAsync(token).ConfigureAwait(false);
- Dictionary idWeaponMap = await metadataService.GetIdToWeaponMapAsync(token).ConfigureAwait(false);
- List gachaEvents = await metadataService.GetGachaEventListAsync(token).ConfigureAwait(false);
- HutaoStatisticsFactoryMetadataContext context = new(idAvatarMap, idWeaponMap, gachaEvents);
+ HutaoStatisticsFactoryMetadataContext context = await metadataService
+ .GetContextAsync(token)
+ .ConfigureAwait(false);
GachaEventStatistics raw = response.Data;
try
@@ -126,7 +126,7 @@ internal sealed partial class GachaLogHutaoCloudService : IGachaLogHutaoCloudSer
private async ValueTask CreateEndIdsAsync(GachaArchive? archive, CancellationToken token)
{
EndIds endIds = new();
- foreach (GachaConfigType type in GachaLog.QueryTypes)
+ foreach (GachaType type in GachaLog.QueryTypes)
{
if (archive is not null)
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs
index 0f2416e8..d6a86465 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs
@@ -182,7 +182,7 @@ internal sealed partial class GachaLogService : IGachaLogService
ArgumentNullException.ThrowIfNull(ArchiveCollection);
GachaLogFetchContext fetchContext = new(gachaLogDbService, taskContext, context, isLazy);
- foreach (GachaConfigType configType in GachaLog.QueryTypes)
+ foreach (GachaType configType in GachaLog.QueryTypes)
{
fetchContext.ResetForProcessingType(configType, query);
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/IGachaLogDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/IGachaLogDbService.cs
index 43fba695..14d38197 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/IGachaLogDbService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/IGachaLogDbService.cs
@@ -19,7 +19,7 @@ internal interface IGachaLogDbService
ValueTask RemoveGachaArchiveByIdAsync(Guid archiveId);
- void RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndId(Guid archiveId, GachaConfigType queryType, long endId);
+ void RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndId(Guid archiveId, GachaType queryType, long endId);
ValueTask GetGachaArchiveByIdAsync(Guid archiveId, CancellationToken token);
@@ -31,25 +31,25 @@ internal interface IGachaLogDbService
ValueTask> GetGachaItemListByArchiveIdAsync(Guid archiveId);
- List GetHutaoGachaItemList(Guid archiveId, GachaConfigType queryType, long endId);
+ List GetHutaoGachaItemList(Guid archiveId, GachaType queryType, long endId);
- long GetNewestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaConfigType queryType);
+ long GetNewestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaType queryType);
- ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaConfigType queryType, CancellationToken token);
+ ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaType queryType, CancellationToken token);
long GetOldestGachaItemIdByArchiveId(Guid archiveId);
- long GetOldestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaConfigType queryType);
+ long GetOldestGachaItemIdByArchiveIdAndQueryType(Guid archiveId, GachaType queryType);
- ValueTask GetOldestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaConfigType queryType, CancellationToken token);
+ ValueTask GetOldestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaType queryType, CancellationToken token);
- ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaConfigType queryType);
+ ValueTask GetNewestGachaItemIdByArchiveIdAndQueryTypeAsync(Guid archiveId, GachaType queryType);
ValueTask GetOldestGachaItemIdByArchiveIdAsync(Guid archiveId);
- ValueTask> GetHutaoGachaItemListAsync(Guid archiveId, GachaConfigType queryType, long endId);
+ ValueTask> GetHutaoGachaItemListAsync(Guid archiveId, GachaType queryType, long endId);
ValueTask AddGachaItemRangeAsync(List items);
- ValueTask RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndIdAsync(Guid archiveId, GachaConfigType queryType, long endId);
+ ValueTask RemoveNewerGachaItemRangeByArchiveIdQueryTypeAndEndIdAsync(Guid archiveId, GachaType queryType, long endId);
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs
index 696d65cc..f4efebb5 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs
@@ -62,7 +62,7 @@ internal sealed partial class UIGFImportService : IUIGFImportService
Guid archiveId = archive.InnerId;
List fullItems = [];
- foreach (GachaConfigType queryType in GachaLog.QueryTypes)
+ foreach (GachaType queryType in GachaLog.QueryTypes)
{
long trimId = gachaLogDbService.GetOldestGachaItemIdByArchiveIdAndQueryType(archiveId, queryType);
logger.LogInformation("Last Id to trim with: [{Id}]", trimId);
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataListGachaEventSource.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataListGachaEventSource.cs
new file mode 100644
index 00000000..165cdcef
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataListGachaEventSource.cs
@@ -0,0 +1,11 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Model.Metadata;
+
+namespace Snap.Hutao.Service.Metadata.ContextAbstraction;
+
+internal interface IMetadataListGachaEventSource
+{
+ public List GachaEvents { get; set; }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs
index 114b56f5..e0db64dd 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs
@@ -21,6 +21,11 @@ internal static class MetadataServiceContextExtension
{
listMaterialSource.Materials = await metadataService.GetMaterialListAsync(token).ConfigureAwait(false);
}
+
+ if (context is IMetadataListGachaEventSource listGachaEventSource)
+ {
+ listGachaEventSource.GachaEvents = await metadataService.GetGachaEventListAsync(token).ConfigureAwait(false);
+ }
}
// Dictionary
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml
index 6116d098..67a608f3 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml
@@ -484,7 +484,7 @@
-
+
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatistics.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatistics.cs
index 3b1b2b51..d0512416 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatistics.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaStatistics.cs
@@ -19,6 +19,11 @@ internal sealed class GachaStatistics
///
public TypedWishSummary WeaponWish { get; set; } = default!;
+ ///
+ /// 集录祈愿
+ ///
+ public TypedWishSummary ChronicledWish { get; set; } = default!;
+
///
/// 奔行世间
///
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs
index 7abf372a..c3b68061 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs
@@ -21,5 +21,10 @@ internal sealed class HutaoStatistics
///
/// 神铸赋形
///
- public HutaoWishSummary WeaponWish { get; set; } = default!;
+ public HutaoWishSummary WeaponEvent { get; set; } = default!;
+
+ ///
+ /// 集录祈愿
+ ///
+ public HutaoWishSummary ChronicledWish { get; set; } = default!;
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaConfigTypeExtension.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaConfigTypeExtension.cs
index ddda41be..3850e975 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaConfigTypeExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaConfigTypeExtension.cs
@@ -10,11 +10,11 @@ internal static class GachaConfigTypeExtension
///
/// 配置类型
/// 祈愿查询类型
- public static GachaConfigType ToQueryType(this GachaConfigType configType)
+ public static GachaType ToQueryType(this GachaType configType)
{
return configType switch
{
- GachaConfigType.AvatarEventWish2 => GachaConfigType.AvatarEventWish,
+ GachaType.SpecialActivityAvatar => GachaType.ActivityAvatar,
_ => configType,
};
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogItem.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogItem.cs
index ee0a60bf..7b5a682f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogItem.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogItem.cs
@@ -23,7 +23,7 @@ internal class GachaLogItem
///
[JsonPropertyName("gacha_type")]
[JsonEnum(JsonSerializeType.NumberString)]
- public GachaConfigType GachaType { get; set; } = default!;
+ public GachaType GachaType { get; set; } = default!;
///
/// 总为
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogQueryOptions.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogQueryOptions.cs
index 11d31ea4..e8c33611 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogQueryOptions.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaLogQueryOptions.cs
@@ -31,7 +31,7 @@ internal struct GachaLogQueryOptions
///
public long EndId;
- public GachaConfigType Type;
+ public GachaType Type;
///
/// Keys required:
@@ -53,7 +53,7 @@ internal struct GachaLogQueryOptions
/// 原始查询字符串
/// 祈愿类型
/// 终止Id
- public GachaLogQueryOptions(in GachaLogQuery query, GachaConfigType queryType)
+ public GachaLogQueryOptions(in GachaLogQuery query, GachaType queryType)
{
IsOversea = query.IsOversea;
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaConfigType.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaType.cs
similarity index 68%
rename from src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaConfigType.cs
rename to src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaType.cs
index fa41947e..c23571a3 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaConfigType.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Event/GachaInfo/GachaType.cs
@@ -4,44 +4,45 @@
namespace Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo;
///
-/// 祈愿配置类型
+/// 祈愿类型
///
[HighQuality]
[Localization]
-internal enum GachaConfigType
+internal enum GachaType
{
///
/// 新手池
///
- [Description("新手祈愿")]
[LocalizationKey(nameof(SH.WebGachaConfigTypeNoviceWish))]
- NoviceWish = 100,
+ NewBie = 100,
///
/// 常驻池
///
- [Description("常驻祈愿")]
[LocalizationKey(nameof(SH.WebGachaConfigTypePermanentWish))]
- StandardWish = 200,
+ Standard = 200,
///
/// 角色1池
///
- [Description("角色活动祈愿")]
[LocalizationKey(nameof(SH.WebGachaConfigTypeAvatarEventWish))]
- AvatarEventWish = 301,
+ ActivityAvatar = 301,
///
/// 武器池
///
- [Description("武器活动祈愿")]
[LocalizationKey(nameof(SH.WebGachaConfigTypeWeaponEventWish))]
- WeaponEventWish = 302,
+ ActivityWeapon = 302,
///
/// 角色2池
///
- [Description("角色活动祈愿-2")]
[LocalizationKey(nameof(SH.WebGachaConfigTypeAvatarEventWish2))]
- AvatarEventWish2 = 400,
+ SpecialActivityAvatar = 400,
+
+ ///
+ /// 集录池
+ ///
+ [LocalizationKey(nameof(SH.WebGachaConfigTypeChronicledWish))]
+ ActivityCity = 500,
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/EndIds.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/EndIds.cs
index bfdb4578..07baf4a5 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/EndIds.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/EndIds.cs
@@ -39,16 +39,16 @@ internal sealed class EndIds
///
/// 类型
/// Last Id
- public long this[GachaConfigType type]
+ public long this[GachaType type]
{
get
{
return type switch
{
- GachaConfigType.NoviceWish => NoviceWish,
- GachaConfigType.StandardWish => StandardWish,
- GachaConfigType.AvatarEventWish => AvatarEventWish,
- GachaConfigType.WeaponEventWish => WeaponEventWish,
+ GachaType.NewBie => NoviceWish,
+ GachaType.Standard => StandardWish,
+ GachaType.ActivityAvatar => AvatarEventWish,
+ GachaType.ActivityWeapon => WeaponEventWish,
_ => 0,
};
}
@@ -57,16 +57,16 @@ internal sealed class EndIds
{
switch (type)
{
- case GachaConfigType.NoviceWish:
+ case GachaType.NewBie:
NoviceWish = value;
break;
- case GachaConfigType.StandardWish:
+ case GachaType.Standard:
StandardWish = value;
break;
- case GachaConfigType.AvatarEventWish:
+ case GachaType.ActivityAvatar:
AvatarEventWish = value;
break;
- case GachaConfigType.WeaponEventWish:
+ case GachaType.ActivityWeapon:
WeaponEventWish = value;
break;
}
@@ -77,11 +77,11 @@ internal sealed class EndIds
/// 获取枚举器
///
/// 枚举器
- public IEnumerator> GetEnumerator()
+ public IEnumerator> GetEnumerator()
{
- yield return new(GachaConfigType.NoviceWish, NoviceWish);
- yield return new(GachaConfigType.StandardWish, StandardWish);
- yield return new(GachaConfigType.AvatarEventWish, AvatarEventWish);
- yield return new(GachaConfigType.WeaponEventWish, WeaponEventWish);
+ yield return new(GachaType.NewBie, NoviceWish);
+ yield return new(GachaType.Standard, StandardWish);
+ yield return new(GachaType.ActivityAvatar, AvatarEventWish);
+ yield return new(GachaType.ActivityWeapon, WeaponEventWish);
}
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaDistributionType.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaDistributionType.cs
index 17a19c2f..ba924565 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaDistributionType.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaDistributionType.cs
@@ -18,6 +18,11 @@ internal enum GachaDistributionType
///
WeaponEvent,
+ ///
+ /// 集录
+ ///
+ Chronicled,
+
///
/// 常驻
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs
index 845c231d..e99fb580 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaEventStatistics.cs
@@ -22,4 +22,9 @@ internal sealed class GachaEventStatistics
/// 武器活动
///
public List WeaponEvent { get; set; } = default!;
+
+ ///
+ /// 集录祈愿
+ ///
+ public List Chronicled { get; set; } = default!;
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs
index 058a3081..e696819d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/GachaLog/GachaItem.cs
@@ -13,14 +13,14 @@ internal sealed class GachaItem
///
/// 祈愿记录分类
///
- public GachaConfigType GachaType { get; set; }
+ public GachaType GachaType { get; set; }
///
/// 祈愿记录查询分类
/// 合并保底的卡池使用此属性
/// 仅4种(不含400)
///
- public GachaConfigType QueryType { get; set; }
+ public GachaType QueryType { get; set; }
///
/// 物品Id