diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssStatisticsCache.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssStatisticsCache.cs index 598612a3..c9b889ce 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssStatisticsCache.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssStatisticsCache.cs @@ -27,28 +27,20 @@ internal sealed partial class HutaoSpiralAbyssStatisticsCache : IHutaoSpiralAbys private TaskCompletionSource? wikiAvatarViewModelTaskSource; private TaskCompletionSource? wikiWeaponViewModelTaskSource; - /// public List? AvatarUsageRanks { get; set; } - /// public List? AvatarAppearanceRanks { get; set; } - /// public List? AvatarConstellationInfos { get; set; } - /// public List? TeamAppearances { get; set; } - /// public Overview? Overview { get; set; } - /// public Dictionary? AvatarCollocations { get; set; } - /// public Dictionary? WeaponCollocations { get; set; } - /// public async ValueTask InitializeForSpiralAbyssViewAsync() { if (databaseViewModelTaskSource is not null) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdAvatarWithPlayersSource.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdAvatarWithPlayersSource.cs new file mode 100644 index 00000000..89cb49e4 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdAvatarWithPlayersSource.cs @@ -0,0 +1,8 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Service.Metadata.ContextAbstraction; + +internal interface IMetadataDictionaryIdAvatarWithPlayersSource : IMetadataDictionaryIdAvatarSource +{ +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdListTowerLevelSource.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdListTowerLevelSource.cs new file mode 100644 index 00000000..b9829abb --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdListTowerLevelSource.cs @@ -0,0 +1,12 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Metadata.Tower; +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Service.Metadata.ContextAbstraction; + +internal interface IMetadataDictionaryIdListTowerLevelSource +{ + Dictionary> IdListTowerLevelMap { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdMonsterSource.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdMonsterSource.cs new file mode 100644 index 00000000..65e15e24 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdMonsterSource.cs @@ -0,0 +1,12 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Metadata.Monster; +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Service.Metadata.ContextAbstraction; + +internal interface IMetadataDictionaryIdMonsterSource +{ + Dictionary IdMonsterMap { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdTowerFloorSource.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdTowerFloorSource.cs new file mode 100644 index 00000000..1482a61e --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdTowerFloorSource.cs @@ -0,0 +1,12 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Metadata.Tower; +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Service.Metadata.ContextAbstraction; + +internal interface IMetadataDictionaryIdTowerFloorSource +{ + Dictionary IdTowerFloorMap { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdTowerScheduleSource.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdTowerScheduleSource.cs new file mode 100644 index 00000000..9a02b31f --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataDictionaryIdTowerScheduleSource.cs @@ -0,0 +1,12 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Metadata.Tower; +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Service.Metadata.ContextAbstraction; + +internal interface IMetadataDictionaryIdTowerScheduleSource +{ + Dictionary IdTowerScheduleMap { 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 93d19017..41b8ec9f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Snap.Hutao.Model.Metadata; using Snap.Hutao.Model.Metadata.Avatar; using Snap.Hutao.Model.Metadata.Item; using Snap.Hutao.Model.Metadata.Weapon; @@ -64,6 +65,16 @@ internal static class MetadataServiceContextExtension if (context is IMetadataDictionaryIdAvatarSource dictionaryIdAvatarSource) { dictionaryIdAvatarSource.IdAvatarMap = await metadataService.GetIdToAvatarMapAsync(token).ConfigureAwait(false); + + if (context is IMetadataDictionaryIdAvatarWithPlayersSource) + { + dictionaryIdAvatarSource.IdAvatarMap = AvatarIds.WithPlayers(dictionaryIdAvatarSource.IdAvatarMap); + } + } + + if (context is IMetadataDictionaryIdListTowerLevelSource dictionaryIdListTowerLevelSource) + { + dictionaryIdListTowerLevelSource.IdListTowerLevelMap = await metadataService.GetGroupIdToTowerLevelGroupMapAsync(token).ConfigureAwait(false); } if (context is IMetadataDictionaryIdMaterialSource dictionaryIdMaterialSource) @@ -71,6 +82,11 @@ internal static class MetadataServiceContextExtension dictionaryIdMaterialSource.IdMaterialMap = await metadataService.GetIdToMaterialMapAsync(token).ConfigureAwait(false); } + if (context is IMetadataDictionaryIdMonsterSource dictionaryIdMonsterSource) + { + dictionaryIdMonsterSource.IdMonsterMap = await metadataService.GetRelationshipIdToMonsterMapAsync(token).ConfigureAwait(false); + } + if (context is IMetadataDictionaryIdReliquarySource dictionaryIdReliquarySource) { dictionaryIdReliquarySource.IdReliquaryMap = await metadataService.GetIdToReliquaryMapAsync(token).ConfigureAwait(false); @@ -96,6 +112,16 @@ internal static class MetadataServiceContextExtension dictionaryIdReliquarySubAffixSource.IdReliquarySubAffixMap = await metadataService.GetIdToReliquarySubAffixMapAsync(token).ConfigureAwait(false); } + if (context is IMetadataDictionaryIdTowerFloorSource dictionaryIdTowerFloorSource) + { + dictionaryIdTowerFloorSource.IdTowerFloorMap = await metadataService.GetIdToTowerFloorMapAsync(token).ConfigureAwait(false); + } + + if (context is IMetadataDictionaryIdTowerScheduleSource dictionaryIdTowerScheduleSource) + { + dictionaryIdTowerScheduleSource.IdTowerScheduleMap = await metadataService.GetIdToTowerScheduleMapAsync(token).ConfigureAwait(false); + } + if (context is IMetadataDictionaryIdWeaponSource dictionaryIdWeaponSource) { dictionaryIdWeaponSource.IdWeaponMap = await metadataService.GetIdToWeaponMapAsync(token).ConfigureAwait(false); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs index 403f0459..1179fb97 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs @@ -3,8 +3,8 @@ using Snap.Hutao.Core.DependencyInjection.Abstraction; using Snap.Hutao.Model.Entity; -using Snap.Hutao.Model.Metadata; using Snap.Hutao.Service.Metadata; +using Snap.Hutao.Service.Metadata.ContextAbstraction; using Snap.Hutao.ViewModel.SpiralAbyss; using Snap.Hutao.ViewModel.User; using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord; @@ -34,15 +34,7 @@ internal sealed partial class SpiralAbyssRecordService : ISpiralAbyssRecordServi { if (await metadataService.InitializeAsync().ConfigureAwait(false)) { - // TODO replace to IMetadataContext - metadataContext = new() - { - IdScheduleMap = await metadataService.GetIdToTowerScheduleMapAsync().ConfigureAwait(false), - IdFloorMap = await metadataService.GetIdToTowerFloorMapAsync().ConfigureAwait(false), - IdLevelGroupMap = await metadataService.GetGroupIdToTowerLevelGroupMapAsync().ConfigureAwait(false), - IdMonsterMap = await metadataService.GetRelationshipIdToMonsterMapAsync().ConfigureAwait(false), - IdAvatarMap = AvatarIds.WithPlayers(await metadataService.GetIdToAvatarMapAsync().ConfigureAwait(false)), - }; + metadataContext = await metadataService.GetContextAsync().ConfigureAwait(false); return true; } @@ -64,7 +56,7 @@ internal sealed partial class SpiralAbyssRecordService : ISpiralAbyssRecordServi Dictionary entryMap = spiralAbyssRecordDbService.GetSpiralAbyssEntryMapByUid(userAndUid.Uid.Value); ArgumentNullException.ThrowIfNull(metadataContext); - spiralAbysses = metadataContext.IdScheduleMap.Values + spiralAbysses = metadataContext.IdTowerScheduleMap.Values .Select(sch => SpiralAbyssView.From(entryMap.GetValueOrDefault(sch.Id), sch, metadataContext)) .OrderByDescending(e => e.ScheduleId) .ToObservableCollection(); diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/FloorView.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/FloorView.cs index 9105fe06..3558211d 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/FloorView.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/FloorView.cs @@ -18,7 +18,7 @@ internal sealed class FloorView : IMappingFrom l.Index).SelectList(l => LevelView.From(l, context)); + Levels = context.IdListTowerLevelMap[floor.LevelGroupId].SortBy(l => l.Index).SelectList(l => LevelView.From(l, context)); } public bool Engaged { get; private set; } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssMetadataContext.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssMetadataContext.cs index 20f94fa2..60b1a2ea 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssMetadataContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssMetadataContext.cs @@ -5,17 +5,22 @@ using Snap.Hutao.Model.Metadata.Avatar; using Snap.Hutao.Model.Metadata.Monster; using Snap.Hutao.Model.Metadata.Tower; using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Service.Metadata.ContextAbstraction; namespace Snap.Hutao.ViewModel.SpiralAbyss; -// TODO: replace this -internal sealed class SpiralAbyssMetadataContext +internal sealed class SpiralAbyssMetadataContext : IMetadataContext, + IMetadataDictionaryIdTowerScheduleSource, + IMetadataDictionaryIdTowerFloorSource, + IMetadataDictionaryIdListTowerLevelSource, + IMetadataDictionaryIdMonsterSource, + IMetadataDictionaryIdAvatarWithPlayersSource { - public Dictionary IdScheduleMap { get; set; } = default!; + public Dictionary IdTowerScheduleMap { get; set; } = default!; - public Dictionary IdFloorMap { get; set; } = default!; + public Dictionary IdTowerFloorMap { get; set; } = default!; - public Dictionary> IdLevelGroupMap { get; set; } = default!; + public Dictionary> IdListTowerLevelMap { get; set; } = default!; public Dictionary IdMonsterMap { get; set; } = default!; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssView.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssView.cs index 71323753..cf72021d 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssView.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssView.cs @@ -17,7 +17,7 @@ internal sealed partial class SpiralAbyssView : IEntityAccess private readonly SpiralAbyssEntry? entity; private SpiralAbyssView(SpiralAbyssEntry entity, SpiralAbyssMetadataContext context) - : this(context.IdScheduleMap[entity.ScheduleId], context) + : this(context.IdTowerScheduleMap[entity.ScheduleId], context) { this.entity = entity; @@ -50,7 +50,7 @@ internal sealed partial class SpiralAbyssView : IEntityAccess BlessingName = towerSchedule.BuffName; Blessings = towerSchedule.Descriptions; - Floors = towerSchedule.FloorIds.Select(id => FloorView.From(context.IdFloorMap[id], context)).Reverse().ToList(); + Floors = towerSchedule.FloorIds.Select(id => FloorView.From(context.IdTowerFloorMap[id], context)).Reverse().ToList(); } public uint ScheduleId { get; }