From 1a29908e5d28dbc7f9e7915699e82daa8c4452d2 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Sat, 20 Apr 2024 10:57:58 +0800 Subject: [PATCH 1/9] partial impl #1203 --- .../Snap.Hutao/View/Page/DailyNotePage.xaml | 38 +++++++++++++++ .../DailyNote/ArchonQuestProgress.cs | 48 +++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml index 62875649..e0d5ca7d 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml @@ -108,6 +108,44 @@ Grid.Row="1" Margin="0,8,0,0" Spacing="6"> + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/ArchonQuestProgress.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/ArchonQuestProgress.cs index fd16627b..8308fd42 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/ArchonQuestProgress.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/ArchonQuestProgress.cs @@ -5,9 +5,57 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote; internal sealed class ArchonQuestProgress { + public List ArchonQuestIds { get; } = [ + 1001U, 1002U, 1003U, + 1101U, 1102U, 1103U, 1104U, + 1201U, 1202U, 1203U, 1204U, 1205U, 1206U, 1207U, + 1301U, 1302U, 1303U, 1304U, 1305U, 1306U, 1307U, 1308U, + 1401U, 1402U, 1403U, 1404U, 1405U + ]; + [JsonPropertyName("list")] public List List { get; set; } = default!; + public int ArchonQuestStatusValue + { + get + { + if (List.IsNullOrEmpty()) + { + return ArchonQuestIds.Count; + } + + return ArchonQuestIds.IndexOf(List.Single().Id); + } + } + + public string ArchonQuestStatusFormatted + { + get + { + if (List.IsNullOrEmpty()) + { + return SH.WebDailyNoteArchonQuestStatusFinished; + } + + return List.Single().Status.GetLocalizedDescription(); + } + } + + public string ArchonQuestChapterFormatted + { + get + { + if (List.IsNullOrEmpty()) + { + return string.Empty; + } + + ArchonQuest quest = List.Single(); + return $"{quest.ChapterNum} {quest.ChapterTitle}"; + } + } + [JsonPropertyName("is_open_archon_quest")] public bool IsOpenArchonQuest { get; set; } From 883c1ca95fc58284ddc833e28e790b0b929d7579 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Mon, 22 Apr 2024 19:43:05 +0800 Subject: [PATCH 2/9] 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}"/> From 44ba0a90a6334b2c1b9fb4994b5b8a3b0ea01f1f Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Tue, 23 Apr 2024 11:10:01 +0800 Subject: [PATCH 3/9] remove unnecessary abstraction --- .../Service/DailyNote/DailyNoteMetadataContext.cs | 4 +++- .../Service/DailyNote/IDailyNoteMetadataContext.cs | 11 ----------- 2 files changed, 3 insertions(+), 12 deletions(-) delete mode 100644 src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteMetadataContext.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.cs index 00f5369d..c2636753 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteMetadataContext.cs @@ -2,10 +2,12 @@ // Licensed under the MIT license. using Snap.Hutao.Model.Metadata; +using Snap.Hutao.Service.Metadata.ContextAbstraction; namespace Snap.Hutao.Service.DailyNote; -internal class DailyNoteMetadataContext : IDailyNoteMetadataContext +internal class DailyNoteMetadataContext : IMetadataContext, + IMetadataListChapterSource { public List Chapters { get; set; } = default!; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteMetadataContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteMetadataContext.cs deleted file mode 100644 index 0537f786..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteMetadataContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Snap.Hutao.Service.Metadata.ContextAbstraction; - -namespace Snap.Hutao.Service.DailyNote; - -internal interface IDailyNoteMetadataContext : IMetadataContext, - IMetadataListChapterSource -{ -} From 5fad960b20b54351b0d34a301e4b1e2b52160d7e Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Mon, 29 Apr 2024 18:41:31 +0800 Subject: [PATCH 4/9] fix build --- src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs index fe6be396..5f27fb24 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs @@ -90,7 +90,7 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient().GetContextAsync(token).ConfigureAwait(false); - List entryList = await dailyNoteDbService.GetDailyNoteEntryIncludeUserListAsync(token).ConfigureAwait(false); + List entryList = await dailyNoteDbService.GetDailyNoteEntryListIncludingUserAsync(token).ConfigureAwait(false); entryList.ForEach(entry => { entry.UserGameRole = userService.GetUserGameRoleByUid(entry.Uid); From c8592c798b09d7fa92f8a6d7a3c4022a9c95dc23 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Mon, 29 Apr 2024 23:32:04 +0800 Subject: [PATCH 5/9] add icon --- src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml | 7 +++++-- src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml | 3 +-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml index 090e6817..39e369c8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml @@ -17,8 +17,11 @@ https://api.snapgenshin.com/static/raw/Bg/UI_Icon_Intee_Explore_1.png https://api.snapgenshin.com/static/raw/Bg/UI_ImgSign_ItemIcon.png https://api.snapgenshin.com/static/raw/Bg/UI_ItemIcon_None.png - https://api.snapgenshin.com/static/raw/Bg/UI_MarkQuest_Events_Proce.png - https://api.snapgenshin.com/static/raw/Bg/UI_MarkTower.png + + + https://api.snapgenshin.com/static/raw/Mark/UI_MarkQuest_Events_Proce.png + https://api.snapgenshin.com/static/raw/Mark/UI_MarkQuest_Main_Start.png + https://api.snapgenshin.com/static/raw/Mark/UI_MarkTower.png https://api.snapgenshin.com/static/raw/ItemIcon/UI_ItemIcon_201.png diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml index d167ae57..6ae5ce6b 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml @@ -127,8 +127,7 @@ Margin="4" VerticalAlignment="Center" shch:FrameworkElementHelper.SquareLength="32" - Source="{StaticResource UI_ItemIcon_210}"/> - + Source="{StaticResource UI_MarkQuest_Main_Start}"/> Date: Tue, 30 Apr 2024 00:04:26 +0800 Subject: [PATCH 6/9] use different icon for different state --- .../Snap.Hutao/Control/Theme/Uri.xaml | 2 + .../Snap.Hutao/Model/Entity/DailyNoteEntry.cs | 2 +- .../Snap.Hutao/Resource/Localization/SH.resx | 3 ++ .../Snap.Hutao/View/Page/DailyNotePage.xaml | 50 ++++++++++++------- .../DailyNote/ArchonQuestProgress.cs | 48 ------------------ 5 files changed, 37 insertions(+), 68 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml index 39e369c8..2d8cbaa4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml @@ -20,6 +20,8 @@ https://api.snapgenshin.com/static/raw/Mark/UI_MarkQuest_Events_Proce.png + https://api.snapgenshin.com/static/raw/Mark/UI_MarkQuest_Events_Start.png + https://api.snapgenshin.com/static/raw/Mark/UI_MarkQuest_Main_Proce.png https://api.snapgenshin.com/static/raw/Mark/UI_MarkQuest_Main_Start.png https://api.snapgenshin.com/static/raw/Mark/UI_MarkTower.png diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs index 003217fc..fb72909d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs @@ -96,7 +96,7 @@ internal sealed class DailyNoteEntry : ObservableObject, IMappingFrom 已复制到剪贴板 + + 所有魔神任务已完成 + 全部完成 diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml index 6ae5ce6b..f3c2bef1 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml @@ -3,7 +3,8 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cw="using:CommunityToolkit.WinUI" - xmlns:cwc="using:CommunityToolkit.WinUI.Controls" + xmlns:cwcont="using:CommunityToolkit.WinUI.Controls" + xmlns:cwconv="using:CommunityToolkit.WinUI.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mxi="using:Microsoft.Xaml.Interactivity" @@ -26,6 +27,17 @@ + + + + @@ -127,7 +139,7 @@ Margin="4" VerticalAlignment="Center" shch:FrameworkElementHelper.SquareLength="32" - Source="{StaticResource UI_MarkQuest_Main_Start}"/> + Source="{Binding DailyNote.ArchonQuestProgress.List.Count, Converter={StaticResource ArchonQuestIconConverter}}"/> + Source="{Binding DailyNote.DailyTask.IsExtraTaskRewardReceived, Converter={StaticResource DailyTaskIconConverter}}"/> - @@ -487,16 +499,16 @@ 0 - - + - + - - + - + - - + - + - - - + - + - + - ArchonQuestIds { get; } = [ - 1001U, 1002U, 1003U, - 1101U, 1102U, 1103U, 1104U, - 1201U, 1202U, 1203U, 1204U, 1205U, 1206U, 1207U, - 1301U, 1302U, 1303U, 1304U, 1305U, 1306U, 1307U, 1308U, - 1401U, 1402U, 1403U, 1404U, 1405U - ]; - [JsonPropertyName("list")] public List List { get; set; } = default!; - public int ArchonQuestStatusValue - { - get - { - if (List.IsNullOrEmpty()) - { - return ArchonQuestIds.Count; - } - - return ArchonQuestIds.IndexOf(List.Single().Id); - } - } - - public string ArchonQuestStatusFormatted - { - get - { - if (List.IsNullOrEmpty()) - { - return SH.WebDailyNoteArchonQuestStatusFinished; - } - - return List.Single().Status.GetLocalizedDescription(); - } - } - - public string ArchonQuestChapterFormatted - { - get - { - if (List.IsNullOrEmpty()) - { - return string.Empty; - } - - ArchonQuest quest = List.Single(); - return $"{quest.ChapterNum} {quest.ChapterTitle}"; - } - } - [JsonPropertyName("is_open_archon_quest")] public bool IsOpenArchonQuest { get; set; } From 86c6c9574b9f33197a608f36667022a8af1eb1e1 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Tue, 30 Apr 2024 12:13:45 +0800 Subject: [PATCH 7/9] ensure metadata --- .../ViewModel/DailyNote/DailyNoteViewModel.cs | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteViewModel.cs index 0a08086e..bb0e89b0 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteViewModel.cs @@ -7,6 +7,7 @@ using Snap.Hutao.Core; using Snap.Hutao.Factory.ContentDialog; using Snap.Hutao.Model.Entity; using Snap.Hutao.Service.DailyNote; +using Snap.Hutao.Service.Metadata; using Snap.Hutao.Service.Notification; using Snap.Hutao.Service.User; using Snap.Hutao.View.Control; @@ -27,6 +28,7 @@ internal sealed partial class DailyNoteViewModel : Abstraction.ViewModel private readonly IContentDialogFactory contentDialogFactory; private readonly IDailyNoteService dailyNoteService; private readonly DailyNoteOptions dailyNoteOptions; + private readonly IMetadataService metadataService; private readonly IInfoBarService infoBarService; private readonly RuntimeOptions runtimeOptions; private readonly ITaskContext taskContext; @@ -53,22 +55,26 @@ internal sealed partial class DailyNoteViewModel : Abstraction.ViewModel protected override async ValueTask InitializeUIAsync() { - try + if (await metadataService.InitializeAsync().ConfigureAwait(false)) { - await taskContext.SwitchToBackgroundAsync(); - ObservableCollection roles = await userService.GetRoleCollectionAsync().ConfigureAwait(false); - ObservableCollection entries = await dailyNoteService.GetDailyNoteEntryCollectionAsync().ConfigureAwait(false); + try + { + await taskContext.SwitchToBackgroundAsync(); + ObservableCollection roles = await userService.GetRoleCollectionAsync().ConfigureAwait(false); + ObservableCollection entries = await dailyNoteService.GetDailyNoteEntryCollectionAsync().ConfigureAwait(false); - await taskContext.SwitchToMainThreadAsync(); - UserAndUids = roles; - DailyNoteEntries = entries; - return true; - } - catch (Core.ExceptionService.UserdataCorruptedException ex) - { - infoBarService.Error(ex); - return false; + await taskContext.SwitchToMainThreadAsync(); + UserAndUids = roles; + DailyNoteEntries = entries; + return true; + } + catch (Core.ExceptionService.UserdataCorruptedException ex) + { + infoBarService.Error(ex); + } } + + return false; } [Command("TrackRoleCommand")] From a57933388d6ee800eba689d0b45f972db1ff8b03 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Thu, 2 May 2024 16:12:37 +0800 Subject: [PATCH 8/9] add static resource --- src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs index d51c1de4..dec258d7 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs @@ -33,6 +33,7 @@ internal static class StaticResource { "IconElement", 0 }, { "ItemIcon", 0 }, { "LoadingPic", 0 }, + { "Mark", 0 }, { "MonsterIcon", 0 }, { "MonsterSmallIcon", 0 }, { "NameCardIcon", 0 }, @@ -62,6 +63,7 @@ internal static class StaticResource { "IconElement", 3 }, { "ItemIcon", 4 }, { "LoadingPic", 2 }, + { "Mark", 0 }, { "MonsterIcon", 3 }, { "MonsterSmallIcon", 2 }, { "NameCardIcon", 3 }, From 77067d27d040881ebaa9e1b966c01d6219d8eeb7 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Tue, 7 May 2024 14:23:54 +0800 Subject: [PATCH 9/9] code style --- .../Snap.Hutao/Model/Entity/DailyNoteEntry.cs | 46 +---------- .../Service/DailyNote/DailyNoteService.cs | 6 +- .../Snap.Hutao/View/Page/DailyNotePage.xaml | 20 ++--- .../DailyNote/DailyNoteArchonQuestView.cs | 82 +++++++++++++++++++ .../Takumi/GameRecord/DailyNote/DailyNote.cs | 6 ++ 5 files changed, 102 insertions(+), 58 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteArchonQuestView.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs index fb72909d..f4d0f945 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs @@ -5,6 +5,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.DailyNote; using Snap.Hutao.ViewModel.User; using Snap.Hutao.Web.Hoyolab.Takumi.Binding; using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote; @@ -55,50 +56,7 @@ internal sealed class DailyNoteEntry : ObservableObject, IMappingFrom 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 SH.WebDailyNoteArchonQuestChapterFinished; - } - } + public DailyNoteArchonQuestView ArchonQuestView { 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 5f27fb24..eb3fe322 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs @@ -9,6 +9,7 @@ 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.DailyNote; using Snap.Hutao.ViewModel.User; using Snap.Hutao.Web.Hoyolab; using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord; @@ -94,10 +95,7 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient { entry.UserGameRole = userService.GetUserGameRoleByUid(entry.Uid); - entry.ArchonQuestIds = context.Chapters - .Where(chapter => chapter.QuestType is Model.Intrinsic.QuestType.AQ) - .Select(chapter => chapter.Id) - .ToList(); + entry.ArchonQuestView = DailyNoteArchonQuestView.Create(entry.DailyNote, context.Chapters); }); entries = entryList.ToObservableCollection(); } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml index f3c2bef1..d695ac9f 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml @@ -13,6 +13,7 @@ xmlns:shch="using:Snap.Hutao.Control.Helper" xmlns:shci="using:Snap.Hutao.Control.Image" xmlns:shcm="using:Snap.Hutao.Control.Markup" + xmlns:shme="using:Snap.Hutao.Model.Entity" xmlns:shvc="using:Snap.Hutao.View.Control" xmlns:shvcp="using:Snap.Hutao.View.Card.Primitive" xmlns:shvd="using:Snap.Hutao.ViewModel.DailyNote" @@ -32,11 +33,10 @@ FalseValue="{StaticResource UI_MarkQuest_Events_Start}" TrueValue="{StaticResource UI_MarkQuest_Events_Proce}"/> - + FalseValue="{StaticResource UI_MarkQuest_Main_Start}" + TrueValue="{StaticResource UI_MarkQuest_Main_Proce}"/> @@ -55,7 +55,7 @@ - + @@ -131,28 +131,28 @@ MinHeight="48" Background="{x:Null}" CornerRadius="{ThemeResource ControlCornerRadius}" - Maximum="{Binding ArchonQuestIds.Count, Mode=OneWay}" + Maximum="{Binding ArchonQuestView.Ids.Count, Mode=OneWay}" Opacity="{StaticResource LargeBackgroundProgressBarOpacity}" - Value="{Binding ArchonQuestStatusValue, Mode=OneWay}"/> + Value="{Binding ArchonQuestView.ProgressValue, Mode=OneWay}"/> + Source="{Binding DailyNote.IsArchonQuestFinished, Converter={StaticResource ArchonQuestIconConverter}}"/> diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteArchonQuestView.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteArchonQuestView.cs new file mode 100644 index 00000000..52240ac7 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNote/DailyNoteArchonQuestView.cs @@ -0,0 +1,82 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Intrinsic; +using Snap.Hutao.Model.Metadata; +using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote; +using WebDailyNote = Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote.DailyNote; + +namespace Snap.Hutao.ViewModel.DailyNote; + +internal sealed class DailyNoteArchonQuestView +{ + private readonly WebDailyNote? dailyNote; + + private DailyNoteArchonQuestView(WebDailyNote? dailyNote, List chapters) + { + this.dailyNote = dailyNote; + Ids = chapters + .Where(chapter => chapter.QuestType is QuestType.AQ) + .Select(chapter => chapter.Id) + .ToList(); + } + + public List Ids { get; set; } = default!; + + public int ProgressValue + { + get + { + if (TryGetFirstArchonQuest(out ArchonQuest? quest)) + { + return Ids.IndexOf(quest.Id); + } + + return Ids.Count; + } + } + + public string ProgressFormatted + { + get + { + if (TryGetFirstArchonQuest(out ArchonQuest? quest)) + { + return quest.Status.GetLocalizedDescription(); + } + + return SH.WebDailyNoteArchonQuestStatusFinished; + } + } + + public string ChapterFormatted + { + get + { + if (TryGetFirstArchonQuest(out ArchonQuest? quest)) + { + return $"{quest.ChapterNum} {quest.ChapterTitle}"; + } + + return SH.WebDailyNoteArchonQuestChapterFinished; + } + } + + public static DailyNoteArchonQuestView Create(WebDailyNote? dailyNote, List chapters) + { + return new(dailyNote, chapters); + } + + private bool TryGetFirstArchonQuest([NotNullWhen(true)] out ArchonQuest? archonQuest) + { + if (dailyNote is { ArchonQuestProgress.List: [{ } target, ..] }) + { + archonQuest = target; + return true; + } + + archonQuest = default; + return false; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/DailyNote.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/DailyNote.cs index a88b0459..9ed8402c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/DailyNote.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/DailyNote/DailyNote.cs @@ -132,4 +132,10 @@ internal sealed class DailyNote : DailyNoteCommon [JsonPropertyName("archon_quest_progress")] public ArchonQuestProgress ArchonQuestProgress { get; set; } = default!; + + [JsonIgnore] + public bool IsArchonQuestFinished + { + get => ArchonQuestProgress.List.Count == 0; + } } \ No newline at end of file