From 883c1ca95fc58284ddc833e28e790b0b929d7579 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Mon, 22 Apr 2024 19:43:05 +0800 Subject: [PATCH] refactor --- .../Snap.Hutao/IdentityStructs.json | 18 +++++++ .../Snap.Hutao/Model/Entity/DailyNoteEntry.cs | 49 ++++++++++++++++++- .../Snap.Hutao/Model/Intrinsic/QuestType.cs | 30 +++++++++++- .../Snap.Hutao/Model/Metadata/Chapter.cs | 34 +++++++++++++ .../Snap.Hutao/Model/Metadata/City.cs | 1 + .../DailyNote/DailyNoteMetadataContext.cs | 11 +++++ .../Service/DailyNote/DailyNoteService.cs | 23 +++++++-- .../DailyNote/IDailyNoteMetadataContext.cs | 11 +++++ .../IMetadataListChapterSource.cs | 11 +++++ .../MetadataServiceContextExtension.cs | 5 ++ .../Service/Metadata/MetadataFileNames.cs | 1 + .../Metadata/MetadataServiceListExtension.cs | 5 ++ .../Snap.Hutao/View/Page/DailyNotePage.xaml | 8 +-- 13 files changed, 197 insertions(+), 10 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Metadata/Chapter.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteMetadataContext.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/IMetadataListChapterSource.cs diff --git a/src/Snap.Hutao/Snap.Hutao/IdentityStructs.json b/src/Snap.Hutao/Snap.Hutao/IdentityStructs.json index cd8c0019..9a59b452 100644 --- a/src/Snap.Hutao/Snap.Hutao/IdentityStructs.json +++ b/src/Snap.Hutao/Snap.Hutao/IdentityStructs.json @@ -23,6 +23,18 @@ "Equatable": true, "EqualityOperators": true }, + { + "Name": "ChapterId", + "Documentation": "章节 Id", + "Equatable": true, + "EqualityOperators": true + }, + { + "Name": "ChapterGroupId", + "Documentation": "章节分组 Id", + "Equatable": true, + "EqualityOperators": true + }, { "Name": "EquipAffixId", "Documentation": "装备属性 Id", @@ -113,6 +125,12 @@ "Equatable": true, "EqualityOperators": true }, + { + "Name": "QuestId", + "Documentation": "任务 Id", + "Equatable": true, + "EqualityOperators": true + }, { "Name": "ReliquaryLevel", "Documentation": "圣遗物等级 1 - 21", diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs index 2707e75d..003217fc 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs @@ -4,6 +4,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using Snap.Hutao.Core.Abstraction; using Snap.Hutao.Model.Entity.Abstraction; +using Snap.Hutao.Model.Primitive; using Snap.Hutao.ViewModel.User; using Snap.Hutao.Web.Hoyolab.Takumi.Binding; using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote; @@ -53,6 +54,52 @@ internal sealed class DailyNoteEntry : ObservableObject, IMappingFrom public DailyNote? DailyNote { get; set; } + [NotMapped] + public List ArchonQuestIds { get; set; } = default!; + + [NotMapped] + public int ArchonQuestStatusValue + { + get + { + if (DailyNote is { ArchonQuestProgress.List: { Count: > 0 } list }) + { + return ArchonQuestIds.IndexOf(list.Single().Id); + } + + return ArchonQuestIds.Count; + } + } + + [NotMapped] + public string ArchonQuestStatusFormatted + { + get + { + if (DailyNote is { ArchonQuestProgress.List: { Count: > 0 } list }) + { + return list.Single().Status.GetLocalizedDescription(); + } + + return SH.WebDailyNoteArchonQuestStatusFinished; + } + } + + [NotMapped] + public string ArchonQuestChapterFormatted + { + get + { + if (DailyNote is { ArchonQuestProgress.List: { Count: > 0 } list }) + { + ArchonQuest quest = list.Single(); + return $"{quest.ChapterNum} {quest.ChapterTitle}"; + } + + return string.Empty; + } + } + /// /// 刷新时间 /// @@ -128,4 +175,4 @@ internal sealed class DailyNoteEntry : ObservableObject, IMappingFrom + /// Archon Quest 魔神任务 + /// AQ, + + /// + /// Fractions Quest 帮派任务 + /// FQ, + + /// + /// Legend Quest 传说任务 + /// LQ, + + /// + /// Event Quest 活动任务 + /// EQ, + + /// + /// Daily Quest 日常任务 + /// DQ, + + /// + /// Indescribable Quest 不可描述的任务? + /// IQ, + VQ, + + /// + /// World Quest 世界任务 + /// WQ, } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Chapter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Chapter.cs new file mode 100644 index 00000000..01434f40 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Chapter.cs @@ -0,0 +1,34 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Intrinsic; +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Model.Metadata; + +internal sealed class Chapter +{ + public ChapterId Id { get; set; } + + public ChapterGroupId GroupId { get; set; } + + public QuestId BeginQuestId { get; set; } + + public QuestId EndQuestId { get; set; } + + public uint NeedPlayerLevel { get; set; } + + public string Number { get; set; } = default!; + + public string Title { get; set; } = default!; + + public string Icon { get; set; } = default!; + + public string ImageTitle { get; set; } = default!; + + public string SerialNumberIcon { get; set; } = default!; + + public City CityId { get; set; } + + public QuestType QuestType { get; set; } +} diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/City.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/City.cs index 799fbb51..2cbb5ed1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/City.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/City.cs @@ -6,6 +6,7 @@ namespace Snap.Hutao.Model.Metadata; // CityTaskOpenExcelConfig internal enum City : uint { + None = 0, Mondstadt = 1, Liyue = 2, Inazuma = 3, diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.cs new file mode 100644 index 00000000..00f5369d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.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.DailyNote; + +internal class DailyNoteMetadataContext : IDailyNoteMetadataContext +{ + public List Chapters { get; set; } = default!; +} diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs index 68897c1f..fe6be396 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs @@ -5,6 +5,9 @@ using CommunityToolkit.Mvvm.Messaging; using Snap.Hutao.Core.DependencyInjection.Abstraction; using Snap.Hutao.Message; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Service.Abstraction; +using Snap.Hutao.Service.Metadata; +using Snap.Hutao.Service.Metadata.ContextAbstraction; using Snap.Hutao.Service.User; using Snap.Hutao.ViewModel.User; using Snap.Hutao.Web.Hoyolab; @@ -83,9 +86,21 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient entryList = await dailyNoteDbService.GetDailyNoteEntryListIncludingUserAsync(token).ConfigureAwait(false); - entryList.ForEach(entry => { entry.UserGameRole = userService.GetUserGameRoleByUid(entry.Uid); }); - entries = entryList.ToObservableCollection(); + using (IServiceScope scope = serviceProvider.CreateScope()) + { + DailyNoteMetadataContext context = await scope.GetRequiredService().GetContextAsync(token).ConfigureAwait(false); + + List entryList = await dailyNoteDbService.GetDailyNoteEntryIncludeUserListAsync(token).ConfigureAwait(false); + entryList.ForEach(entry => + { + entry.UserGameRole = userService.GetUserGameRoleByUid(entry.Uid); + entry.ArchonQuestIds = context.Chapters + .Where(chapter => chapter.QuestType is Model.Intrinsic.QuestType.AQ) + .Select(chapter => chapter.Id) + .ToList(); + }); + entries = entryList.ToObservableCollection(); + } } return entries; @@ -159,4 +174,4 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient Chapters { get; set; } +} 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 7cd18212..fd17f81d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs @@ -23,6 +23,11 @@ internal static class MetadataServiceContextExtension listAchievementSource.Achievements = await metadataService.GetAchievementListAsync(token).ConfigureAwait(false); } + if (context is IMetadataListChapterSource listChapterSource) + { + listChapterSource.Chapters = await metadataService.GetChapterListAsync(token).ConfigureAwait(false); + } + if (context is IMetadataListGachaEventSource listGachaEventSource) { listGachaEventSource.GachaEvents = await metadataService.GetGachaEventListAsync(token).ConfigureAwait(false); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataFileNames.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataFileNames.cs index f668c965..6a2e2b5c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataFileNames.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataFileNames.cs @@ -10,6 +10,7 @@ internal static class MetadataFileNames public const string FileNameAvatar = "Avatar"; public const string FileNameAvatarCurve = "AvatarCurve"; public const string FileNameAvatarPromote = "AvatarPromote"; + public const string FileNameChapter = "Chapter"; public const string FileNameDisplayItem = "DisplayItem"; public const string FileNameGachaEvent = "GachaEvent"; public const string FileNameMaterial = "Material"; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataServiceListExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataServiceListExtension.cs index 4377b0e3..1532e245 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataServiceListExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataServiceListExtension.cs @@ -20,6 +20,11 @@ internal static class MetadataServiceListExtension return metadataService.FromCacheOrFileAsync>(FileNameAchievement, token); } + public static ValueTask> GetChapterListAsync(this IMetadataService metadataService, CancellationToken token = default) + { + return metadataService.FromCacheOrFileAsync>(FileNameChapter, token); + } + public static ValueTask> GetAchievementGoalListAsync(this IMetadataService metadataService, CancellationToken token = default) { return metadataService.FromCacheOrFileAsync>(FileNameAchievementGoal, token); diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml index e0d5ca7d..d167ae57 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml @@ -119,9 +119,9 @@ MinHeight="48" Background="{x:Null}" CornerRadius="{ThemeResource ControlCornerRadius}" - Maximum="{Binding DailyNote.ArchonQuestProgress.ArchonQuestIds.Count, Mode=OneWay}" + Maximum="{Binding ArchonQuestIds.Count, Mode=OneWay}" Opacity="{StaticResource LargeBackgroundProgressBarOpacity}" - Value="{Binding DailyNote.ArchonQuestProgress.ArchonQuestStatusValue, Mode=OneWay}"/> + Value="{Binding ArchonQuestStatusValue, Mode=OneWay}"/>