From 0165c03ae6e318771da9d46db3e4dfe765c22e68 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Sun, 1 Jan 2023 13:38:27 +0800 Subject: [PATCH] spiral abyss view --- .../FileSystem/Location/HutaoLocation.cs | 6 +- .../DependencyInjection/IocConfiguration.cs | 2 +- .../Snap.Hutao/Core/Logging/LogEntryQueue.cs | 2 +- .../Core/Windowing/SystemBackdrop.cs | 2 +- .../20220720121642_Init.Designer.cs | 2 +- .../20220813040006_AddAchievement.Designer.cs | 2 +- ...15133601_AddAchievementArchive.Designer.cs | 2 +- .../20220910080051_AddGacha.Designer.cs | 2 +- ...220914131149_AddGachaQueryType.Designer.cs | 2 +- ...0220918062300_RenameGachaTable.Designer.cs | 2 +- .../20220924135810_AddAvatarInfo.Designer.cs | 2 +- .../20221031104940_GameAccount.Designer.cs | 2 +- .../20221108081525_DailyNoteEntry.Designer.cs | 2 +- .../20221118095755_SplitStoken.Designer.cs | 2 +- .../20221118124745_AddAidMid.Designer.cs | 2 +- ...123060511_RenameCookieToLtoken.Designer.cs | 2 +- .../20221123110240_AddCookieToken.Designer.cs | 2 +- .../20221128115346_ObjectCache.Designer.cs | 2 +- .../20221202052444_Cultivation.Designer.cs | 2 +- .../20221210111128_Inventory.Designer.cs | 2 +- .../20221217061817_ItemFinishable.Designer.cs | 2 +- ...0221231104727_SpiralAbyssEntry.Designer.cs | 537 ++++++++++++++++++ .../20221231104727_SpiralAbyssEntry.cs | 36 ++ .../Migrations/AppDbContextModelSnapshot.cs | 24 +- .../LogDb/20220720121521_Logs.Designer.cs | 2 +- .../LogDb/20220903071033_LogTime.Designer.cs | 2 +- .../LogDb/LogDbContextModelSnapshot.cs | 2 +- .../Model/Binding/SpiralAbyss/Avatar.cs | 48 ++ .../Model/Binding/SpiralAbyss/BattleView.cs | 34 ++ .../Model/Binding/SpiralAbyss/FloorView.cs | 45 ++ .../Model/Binding/SpiralAbyss/LevelView.cs | 40 ++ .../Model/Binding/SpiralAbyss/RankAvatar.cs | 26 + .../Binding/SpiralAbyss/SpiralAbyssView.cs | 87 +++ .../Model/Binding/User/UserAndRole.cs | 10 + .../DailyNoteEntryConfiguration.cs | 2 +- .../SpiralAbyssEntryConfiguration.cs | 21 + .../Snap.Hutao/Model/Entity/DailyNoteEntry.cs | 10 +- .../Entity}/Database/AppDbContext.cs | 12 +- .../Database/AppDbContextDesignTimeFactory.cs | 1 + .../Entity}/Database/LogDbContext.cs | 2 +- .../Database/LogDbContextDesignTimeFactory.cs | 1 + .../Model/Entity/SpiralAbyssEntry.cs | 69 +++ .../Snap.Hutao/Model/Metadata/AvatarIds.cs | 9 + .../Snap.Hutao/Package.appxmanifest | 2 +- .../Resource/Icon/UI_Icon_Tower_Star.png | Bin 0 -> 3226 bytes .../Resource/Icon/UI_MarkTower_Tower.png | Bin 0 -> 5201 bytes .../Achievement/AchievementDbOperation.cs | 2 +- .../Service/Achievement/AchievementService.cs | 2 +- .../Service/AvatarInfo/AvatarInfoService.cs | 2 +- .../Service/Cultivation/CultivationService.cs | 3 +- .../Service/DailyNote/DailyNoteNotifier.cs | 88 ++- .../Service/DailyNote/DailyNoteService.cs | 2 +- .../Factory/GachaStatisticsFactory.cs | 2 +- .../Service/GachaLog/GachaLogService.cs | 2 +- .../Snap.Hutao/Service/Game/GameService.cs | 2 +- .../Snap.Hutao/Service/Hutao/HutaoCache.cs | 6 +- .../Snap.Hutao/Service/Hutao/HutaoService.cs | 2 +- .../SpiralAbyss/ISpiralAbyssRecordService.cs | 27 + .../SpiralAbyss/SpiralAbyssRecordService.cs | 109 ++++ .../Snap.Hutao/Service/User/UserService.cs | 2 +- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 12 +- src/Snap.Hutao/Snap.Hutao/View/MainView.xaml | 21 +- .../View/Page/HutaoDatabasePage.xaml | 41 +- .../Snap.Hutao/View/Page/SettingPage.xaml | 9 - .../View/Page/SpiralAbyssRecordPage.xaml | 291 ++++++++++ .../View/Page/SpiralAbyssRecordPage.xaml.cs | 22 + .../ViewModel/DailyNoteViewModel.cs | 2 +- .../ExperimentalFeaturesViewModel.cs | 29 +- .../ViewModel/LaunchGameViewModel.cs | 2 +- .../Snap.Hutao/ViewModel/SettingViewModel.cs | 2 +- .../ViewModel/SpiralAbyssRecordViewModel.cs | 174 ++++++ .../ViewModel/WikiWeaponViewModel.cs | 2 +- .../Web/Bridge/MiHoYoJSInterface.cs | 2 +- .../Takumi/GameRecord/GameRecordClient.cs | 12 + .../Takumi/GameRecord/SpiralAbyss/Battle.cs | 11 +- .../Takumi/GameRecord/SpiralAbyss/Floor.cs | 3 +- .../GameRecord/SpiralAbyss/SpiralAbyss.cs | 4 +- .../Snap.Hutao/Web/Hutao/Model/Overview.cs | 24 + 78 files changed, 1848 insertions(+), 134 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.Designer.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/Avatar.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/BattleView.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/FloorView.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/LevelView.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/RankAvatar.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/SpiralAbyssView.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/SpiralAbyssEntryConfiguration.cs rename src/Snap.Hutao/Snap.Hutao/{Context => Model/Entity}/Database/AppDbContext.cs (92%) rename src/Snap.Hutao/Snap.Hutao/{Context => Model/Entity}/Database/AppDbContextDesignTimeFactory.cs (94%) rename src/Snap.Hutao/Snap.Hutao/{Context => Model/Entity}/Database/LogDbContext.cs (96%) rename src/Snap.Hutao/Snap.Hutao/{Context => Model/Entity}/Database/LogDbContextDesignTimeFactory.cs (94%) create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Entity/SpiralAbyssEntry.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_Icon_Tower_Star.png create mode 100644 src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_MarkTower_Tower.png create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/ISpiralAbyssRecordService.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyssRecordViewModel.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Context/FileSystem/Location/HutaoLocation.cs b/src/Snap.Hutao/Snap.Hutao/Context/FileSystem/Location/HutaoLocation.cs index b55817fb..2f517b5e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Context/FileSystem/Location/HutaoLocation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Context/FileSystem/Location/HutaoLocation.cs @@ -20,9 +20,13 @@ internal class HutaoLocation : IFileSystemLocation if (string.IsNullOrEmpty(path)) { string myDocument = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); - +#if RELEASE // 将测试版与正式版的文件目录分离 string folderName = Package.Current.PublisherDisplayName == "DGP Studio CI" ? "HutaoAlpha" : "Hutao"; +#else + // 使得迁移能正常生成 + string folderName = "Hutao"; +#endif path = Path.GetFullPath(Path.Combine(myDocument, folderName)); } diff --git a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocConfiguration.cs b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocConfiguration.cs index c424a285..9157672c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocConfiguration.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocConfiguration.cs @@ -3,8 +3,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Context.Database; using Snap.Hutao.Context.FileSystem; +using Snap.Hutao.Model.Entity.Database; using System.Diagnostics; namespace Snap.Hutao.Core.DependencyInjection; diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Logging/LogEntryQueue.cs b/src/Snap.Hutao/Snap.Hutao/Core/Logging/LogEntryQueue.cs index c18f54f1..952635af 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Logging/LogEntryQueue.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Logging/LogEntryQueue.cs @@ -2,8 +2,8 @@ // Licensed under the MIT license. using Microsoft.EntityFrameworkCore; -using Snap.Hutao.Context.Database; using Snap.Hutao.Context.FileSystem; +using Snap.Hutao.Model.Entity.Database; using System.Collections.Concurrent; using System.Diagnostics; diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/SystemBackdrop.cs b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/SystemBackdrop.cs index c21c18ef..8df37991 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/SystemBackdrop.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/SystemBackdrop.cs @@ -5,9 +5,9 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Composition; using Microsoft.UI.Composition.SystemBackdrops; using Microsoft.UI.Xaml; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using System.Runtime.InteropServices; using Windows.System; using WinRT; diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20220720121642_Init.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20220720121642_Init.Designer.cs index 4883b4ce..001b7f5d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20220720121642_Init.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20220720121642_Init.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20220813040006_AddAchievement.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20220813040006_AddAchievement.Designer.cs index b188da55..884a475f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20220813040006_AddAchievement.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20220813040006_AddAchievement.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20220815133601_AddAchievementArchive.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20220815133601_AddAchievementArchive.Designer.cs index 19ef034d..b9c0102d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20220815133601_AddAchievementArchive.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20220815133601_AddAchievementArchive.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20220910080051_AddGacha.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20220910080051_AddGacha.Designer.cs index d4af58da..1501dde4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20220910080051_AddGacha.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20220910080051_AddGacha.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20220914131149_AddGachaQueryType.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20220914131149_AddGachaQueryType.Designer.cs index cab88401..5a1adf71 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20220914131149_AddGachaQueryType.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20220914131149_AddGachaQueryType.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20220918062300_RenameGachaTable.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20220918062300_RenameGachaTable.Designer.cs index ac413e07..ff5abd1a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20220918062300_RenameGachaTable.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20220918062300_RenameGachaTable.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20220924135810_AddAvatarInfo.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20220924135810_AddAvatarInfo.Designer.cs index 8a519fe8..bc6a2cae 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20220924135810_AddAvatarInfo.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20220924135810_AddAvatarInfo.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221031104940_GameAccount.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221031104940_GameAccount.Designer.cs index 1f33b341..f3019ea5 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221031104940_GameAccount.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221031104940_GameAccount.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221108081525_DailyNoteEntry.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221108081525_DailyNoteEntry.Designer.cs index 43118a2d..4fd53c70 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221108081525_DailyNoteEntry.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221108081525_DailyNoteEntry.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221118095755_SplitStoken.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221118095755_SplitStoken.Designer.cs index d4edeb9e..caaa85b1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221118095755_SplitStoken.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221118095755_SplitStoken.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221118124745_AddAidMid.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221118124745_AddAidMid.Designer.cs index 706b58d8..dcf42508 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221118124745_AddAidMid.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221118124745_AddAidMid.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221123060511_RenameCookieToLtoken.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221123060511_RenameCookieToLtoken.Designer.cs index b187feb2..2e69cb50 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221123060511_RenameCookieToLtoken.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221123060511_RenameCookieToLtoken.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221123110240_AddCookieToken.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221123110240_AddCookieToken.Designer.cs index 325cec7e..4422cd0b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221123110240_AddCookieToken.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221123110240_AddCookieToken.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221128115346_ObjectCache.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221128115346_ObjectCache.Designer.cs index 113d2204..064fe388 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221128115346_ObjectCache.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221128115346_ObjectCache.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221202052444_Cultivation.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221202052444_Cultivation.Designer.cs index e1183c4f..9f0cfc5b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221202052444_Cultivation.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221202052444_Cultivation.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221210111128_Inventory.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221210111128_Inventory.Designer.cs index cb43c6b6..23443a52 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221210111128_Inventory.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221210111128_Inventory.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221217061817_ItemFinishable.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221217061817_ItemFinishable.Designer.cs index 36deada4..b85ef5d4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20221217061817_ItemFinishable.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221217061817_ItemFinishable.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.Designer.cs new file mode 100644 index 00000000..8a699d98 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.Designer.cs @@ -0,0 +1,537 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Snap.Hutao.Model.Entity.Database; + +#nullable disable + +namespace Snap.Hutao.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20221231104727_SpiralAbyssEntry")] + partial class SpiralAbyssEntry + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.1"); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.Achievement", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ArchiveId") + .HasColumnType("TEXT"); + + b.Property("Current") + .HasColumnType("INTEGER"); + + b.Property("Id") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("Time") + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.HasIndex("ArchiveId"); + + b.ToTable("achievements"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.AchievementArchive", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("IsSelected") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("achievement_archives"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.AvatarInfo", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Info") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("avatar_infos"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.CultivateEntry", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Id") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("InnerId"); + + b.HasIndex("ProjectId"); + + b.ToTable("cultivate_entries"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.CultivateItem", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Count") + .HasColumnType("INTEGER"); + + b.Property("EntryId") + .HasColumnType("TEXT"); + + b.Property("IsFinished") + .HasColumnType("INTEGER"); + + b.Property("ItemId") + .HasColumnType("INTEGER"); + + b.HasKey("InnerId"); + + b.HasIndex("EntryId"); + + b.ToTable("cultivate_items"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.CultivateProject", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AttachedUid") + .HasColumnType("TEXT"); + + b.Property("IsSelected") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("cultivate_projects"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.DailyNoteEntry", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DailyNote") + .HasColumnType("TEXT"); + + b.Property("DailyTaskNotify") + .HasColumnType("INTEGER"); + + b.Property("DailyTaskNotifySuppressed") + .HasColumnType("INTEGER"); + + b.Property("ExpeditionNotify") + .HasColumnType("INTEGER"); + + b.Property("ExpeditionNotifySuppressed") + .HasColumnType("INTEGER"); + + b.Property("HomeCoinNotifySuppressed") + .HasColumnType("INTEGER"); + + b.Property("HomeCoinNotifyThreshold") + .HasColumnType("INTEGER"); + + b.Property("ResinNotifySuppressed") + .HasColumnType("INTEGER"); + + b.Property("ResinNotifyThreshold") + .HasColumnType("INTEGER"); + + b.Property("ShowInHomeWidget") + .HasColumnType("INTEGER"); + + b.Property("TransformerNotify") + .HasColumnType("INTEGER"); + + b.Property("TransformerNotifySuppressed") + .HasColumnType("INTEGER"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.HasIndex("UserId"); + + b.ToTable("daily_notes"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.GachaArchive", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("IsSelected") + .HasColumnType("INTEGER"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("gacha_archives"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.GachaItem", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ArchiveId") + .HasColumnType("TEXT"); + + b.Property("GachaType") + .HasColumnType("INTEGER"); + + b.Property("Id") + .HasColumnType("INTEGER"); + + b.Property("ItemId") + .HasColumnType("INTEGER"); + + b.Property("QueryType") + .HasColumnType("INTEGER"); + + b.Property("Time") + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.HasIndex("ArchiveId"); + + b.ToTable("gacha_items"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.GameAccount", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AttachUid") + .HasColumnType("TEXT"); + + b.Property("MihoyoSDK") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("InnerId"); + + b.ToTable("game_accounts"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.InventoryItem", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Count") + .HasColumnType("INTEGER"); + + b.Property("ItemId") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.HasIndex("ProjectId"); + + b.ToTable("inventory_items"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.InventoryReliquary", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppendPropIdList") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ItemId") + .HasColumnType("INTEGER"); + + b.Property("Level") + .HasColumnType("INTEGER"); + + b.Property("MainPropId") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.HasIndex("ProjectId"); + + b.ToTable("inventory_reliquaries"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.InventoryWeapon", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ItemId") + .HasColumnType("INTEGER"); + + b.Property("Level") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("TEXT"); + + b.Property("PromoteLevel") + .HasColumnType("INTEGER"); + + b.HasKey("InnerId"); + + b.HasIndex("ProjectId"); + + b.ToTable("inventory_weapons"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.ObjectCacheEntry", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("ExpireTime") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.ToTable("object_cache"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.SettingEntry", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.ToTable("settings"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.SpiralAbyssEntry", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ScheduleId") + .HasColumnType("INTEGER"); + + b.Property("SpiralAbyss") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("spiral_abysses"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.User", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Aid") + .HasColumnType("TEXT"); + + b.Property("CookieToken") + .HasColumnType("TEXT"); + + b.Property("IsSelected") + .HasColumnType("INTEGER"); + + b.Property("Ltoken") + .HasColumnType("TEXT"); + + b.Property("Mid") + .HasColumnType("TEXT"); + + b.Property("Stoken") + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("users"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.Achievement", b => + { + b.HasOne("Snap.Hutao.Model.Entity.AchievementArchive", "Archive") + .WithMany() + .HasForeignKey("ArchiveId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Archive"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.CultivateEntry", b => + { + b.HasOne("Snap.Hutao.Model.Entity.CultivateProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.CultivateItem", b => + { + b.HasOne("Snap.Hutao.Model.Entity.CultivateEntry", "Entry") + .WithMany() + .HasForeignKey("EntryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Entry"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.DailyNoteEntry", b => + { + b.HasOne("Snap.Hutao.Model.Entity.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.GachaItem", b => + { + b.HasOne("Snap.Hutao.Model.Entity.GachaArchive", "Archive") + .WithMany("Items") + .HasForeignKey("ArchiveId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Archive"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.InventoryItem", b => + { + b.HasOne("Snap.Hutao.Model.Entity.CultivateProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.InventoryReliquary", b => + { + b.HasOne("Snap.Hutao.Model.Entity.CultivateProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.InventoryWeapon", b => + { + b.HasOne("Snap.Hutao.Model.Entity.CultivateProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Snap.Hutao.Model.Entity.GachaArchive", b => + { + b.Navigation("Items"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.cs new file mode 100644 index 00000000..559916ce --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20221231104727_SpiralAbyssEntry.cs @@ -0,0 +1,36 @@ +// +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Snap.Hutao.Migrations +{ + /// + public partial class SpiralAbyssEntry : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "spiral_abysses", + columns: table => new + { + InnerId = table.Column(type: "TEXT", nullable: false), + ScheduleId = table.Column(type: "INTEGER", nullable: false), + Uid = table.Column(type: "TEXT", nullable: false), + SpiralAbyss = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_spiral_abysses", x => x.InnerId); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "spiral_abysses"); + } + } +} diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs index e46b0626..e39fed4b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs @@ -3,7 +3,7 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable @@ -385,6 +385,28 @@ namespace Snap.Hutao.Migrations b.ToTable("settings"); }); + modelBuilder.Entity("Snap.Hutao.Model.Entity.SpiralAbyssEntry", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ScheduleId") + .HasColumnType("INTEGER"); + + b.Property("SpiralAbyss") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("spiral_abysses"); + }); + modelBuilder.Entity("Snap.Hutao.Model.Entity.User", b => { b.Property("InnerId") diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220720121521_Logs.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220720121521_Logs.Designer.cs index 2294f599..94414f13 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220720121521_Logs.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220720121521_Logs.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220903071033_LogTime.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220903071033_LogTime.Designer.cs index 0eba23dc..4ff3e508 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220903071033_LogTime.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/20220903071033_LogTime.Designer.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/LogDbContextModelSnapshot.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/LogDbContextModelSnapshot.cs index f79e5a53..a2955f48 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/LogDbContextModelSnapshot.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/LogDb/LogDbContextModelSnapshot.cs @@ -3,7 +3,7 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Snap.Hutao.Context.Database; +using Snap.Hutao.Model.Entity.Database; #nullable disable diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/Avatar.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/Avatar.cs new file mode 100644 index 00000000..693341cb --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/Avatar.cs @@ -0,0 +1,48 @@ +// 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.Binding.SpiralAbyss; + +/// +/// 角色 +/// +public class Avatar +{ + /// + /// 构造一个新的角色 + /// + /// 角色Id + /// Id角色映射 + public Avatar(AvatarId avatarId, Dictionary idAvatarMap) + { + System.Diagnostics.Debug.WriteLineIf(!idAvatarMap.ContainsKey(avatarId), avatarId.Value); + Metadata.Avatar.Avatar metaAvatar = idAvatarMap[avatarId]; + Name = metaAvatar.Name; + Icon = Metadata.Converter.AvatarIconConverter.IconNameToUri(metaAvatar.Icon); + SideIcon = Metadata.Converter.AvatarIconConverter.IconNameToUri(metaAvatar.SideIcon); + Quality = metaAvatar.Quality; + } + + /// + /// 名称 + /// + public string Name { get; set; } = default!; + + /// + /// 图标 + /// + public Uri Icon { get; set; } = default!; + + /// + /// 侧面图标 + /// + public Uri SideIcon { get; set; } = default!; + + /// + /// 星级 + /// + public ItemQuality Quality { get; set; } +} diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/BattleView.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/BattleView.cs new file mode 100644 index 00000000..ab25aca2 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/BattleView.cs @@ -0,0 +1,34 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.SpiralAbyss; + +namespace Snap.Hutao.Model.Binding.SpiralAbyss; + +/// +/// 上下半视图 +/// +public class BattleView +{ + /// + /// 构造一个新的上下半视图 + /// + /// 战斗 + /// Id角色映射 + public BattleView(Battle battle, Dictionary idAvatarMap) + { + Time = DateTimeOffset.FromUnixTimeSeconds(battle.Timestamp).ToLocalTime().ToString("yyyy.MM.dd HH:mm:ss"); + Avatars = battle.Avatars.Select(a => new Avatar(a.Id, idAvatarMap)).ToList(); + } + + /// + /// 时间 + /// + public string Time { get; set; } + + /// + /// 角色 + /// + public List Avatars { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/FloorView.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/FloorView.cs new file mode 100644 index 00000000..d757dc8e --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/FloorView.cs @@ -0,0 +1,45 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Model.Binding.SpiralAbyss; + +/// +/// 层视图 +/// +public class FloorView +{ + /// + /// 构造一个新的层视图 + /// + /// 层 + /// Id角色映射 + public FloorView(Web.Hoyolab.Takumi.GameRecord.SpiralAbyss.Floor floor, Dictionary idAvatarMap) + { + Index = $"第 {floor.Index} 层"; + SettleTime = DateTimeOffset.FromUnixTimeSeconds(floor.SettleTime).ToLocalTime().ToString("yyyy.MM.dd HH:mm:ss"); + Star = floor.Star; + Levels = floor.Levels.Select(l => new LevelView(l, idAvatarMap)).ToList(); + } + + /// + /// 层号 + /// + public string Index { get; set; } + + /// + /// 时间 + /// + public string SettleTime { get; set; } + + /// + /// 星数 + /// + public int Star { get; set; } + + /// + /// 间信息 + /// + public List Levels { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/LevelView.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/LevelView.cs new file mode 100644 index 00000000..ed18b424 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/LevelView.cs @@ -0,0 +1,40 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.SpiralAbyss; + +namespace Snap.Hutao.Model.Binding.SpiralAbyss; + +/// +/// 间视图 +/// +public class LevelView +{ + /// + /// 构造一个新的间视图 + /// + /// 间 + /// Id角色映射 + public LevelView(Level level, Dictionary idAvatarMap) + { + Index = $"第 {level.Index} 间"; + Star = level.Star; + Battles = level.Battles.Select(b => new BattleView(b, idAvatarMap)).ToList(); + } + + /// + /// 间号 + /// + public string Index { get; set; } + + /// + /// 星数 + /// + public int Star { get; set; } + + /// + /// 上下半 + /// + public List Battles { get; set; } +} diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/RankAvatar.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/RankAvatar.cs new file mode 100644 index 00000000..18e3d5b4 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/RankAvatar.cs @@ -0,0 +1,26 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Model.Binding.SpiralAbyss; + +/// +/// 排行角色 +/// +public class RankAvatar : Avatar +{ + /// + /// 构造一个新的角色 + /// + /// 值 + /// 角色Id + /// Id角色映射 + public RankAvatar(int value, AvatarId avatarId, Dictionary idAvatarMap) + : base(avatarId, idAvatarMap) + { + Value = value; + } + + public int Value { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/SpiralAbyssView.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/SpiralAbyssView.cs new file mode 100644 index 00000000..cfcdacb0 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/SpiralAbyss/SpiralAbyssView.cs @@ -0,0 +1,87 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Model.Binding.SpiralAbyss; + +/// +/// 深渊视图 +/// +public class SpiralAbyssView +{ + /// + /// 构造一个新的深渊视图 + /// + /// 深渊信息 + /// Id角色映射 + public SpiralAbyssView(Web.Hoyolab.Takumi.GameRecord.SpiralAbyss.SpiralAbyss spiralAbyss, Dictionary idAvatarMap) + { + Schedule = $"第 {spiralAbyss.ScheduleId} 期"; + TotalBattleTimes = spiralAbyss.TotalBattleTimes; + TotalStar = spiralAbyss.TotalStar; + MaxFloor = spiralAbyss.MaxFloor; + Reveals = spiralAbyss.RevealRank.Select(r => new RankAvatar(r.Value, r.AvatarId, idAvatarMap)).ToList(); + Defeat = spiralAbyss.DefeatRank.Select(r => new RankAvatar(r.Value, r.AvatarId, idAvatarMap)).SingleOrDefault(); + Damage = spiralAbyss.DamageRank.Select(r => new RankAvatar(r.Value, r.AvatarId, idAvatarMap)).SingleOrDefault(); + TakeDamage = spiralAbyss.TakeDamageRank.Select(r => new RankAvatar(r.Value, r.AvatarId, idAvatarMap)).SingleOrDefault(); + NormalSkill = spiralAbyss.NormalSkillRank.Select(r => new RankAvatar(r.Value, r.AvatarId, idAvatarMap)).SingleOrDefault(); + EnergySkill = spiralAbyss.EnergySkillRank.Select(r => new RankAvatar(r.Value, r.AvatarId, idAvatarMap)).SingleOrDefault(); + Floors = spiralAbyss.Floors.Select(f => new FloorView(f, idAvatarMap)).ToList(); + } + + /// + /// 期 + /// + public string Schedule { get; set; } + + /// + /// 战斗次数 + /// + public int TotalBattleTimes { get; set; } + + /// + /// 共获得渊星 + /// + public int TotalStar { get; set; } + + /// + /// 最深抵达 + /// + public string MaxFloor { get; set; } + + /// + /// 出战次数 + /// + public List Reveals { get; set; } + + /// + /// 击破次数 + /// + public RankAvatar? Defeat { get; set; } + + /// + /// 最强一击 + /// + public RankAvatar? Damage { get; set; } + + /// + /// 承受伤害 + /// + public RankAvatar? TakeDamage { get; set; } + + /// + /// 元素战技 + /// + public RankAvatar? NormalSkill { get; set; } + + /// + /// 元素爆发 + /// + public RankAvatar? EnergySkill { get; set; } + + /// + /// 层信息 + /// + public List Floors { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs index 4b77ce39..11f4b556 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs @@ -31,4 +31,14 @@ public class UserAndRole /// 角色 /// public UserGameRole Role { get; private set; } + + /// + /// 从用户与选中的角色转换 + /// + /// 角色 + /// 用户与角色 + public static UserAndRole FromUser(User user) + { + return new UserAndRole(user.Entity, user.SelectedUserGameRole!); + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/DailyNoteEntryConfiguration.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/DailyNoteEntryConfiguration.cs index c8054ed4..b8d6f7b1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/DailyNoteEntryConfiguration.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/DailyNoteEntryConfiguration.cs @@ -18,4 +18,4 @@ internal class DailyNoteEntryConfiguration : IEntityTypeConfiguration>(); } -} \ No newline at end of file +} diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/SpiralAbyssEntryConfiguration.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/SpiralAbyssEntryConfiguration.cs new file mode 100644 index 00000000..4daa16c0 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Configuration/SpiralAbyssEntryConfiguration.cs @@ -0,0 +1,21 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Snap.Hutao.Model.Entity.Configuration; + +/// +/// 深渊入口配置 +/// +internal class SpiralAbyssEntryConfiguration : IEntityTypeConfiguration +{ + /// + public void Configure(EntityTypeBuilder builder) + { + builder.Property(e => e.SpiralAbyss) + .HasColumnType("TEXT") + .HasConversion>(); + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs index e79caf7f..bd720786 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/DailyNoteEntry.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using CommunityToolkit.Mvvm.ComponentModel; using Snap.Hutao.Model.Binding.User; using Snap.Hutao.Web.Hoyolab.Takumi.Binding; using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote; @@ -13,11 +14,8 @@ namespace Snap.Hutao.Model.Entity; /// 实时便笺入口 /// [Table("daily_notes")] -public class DailyNoteEntry : INotifyPropertyChanged +public class DailyNoteEntry : ObservableObject { - /// - public event PropertyChangedEventHandler? PropertyChanged; - /// /// 内部Id /// @@ -130,6 +128,6 @@ public class DailyNoteEntry : INotifyPropertyChanged public void UpdateDailyNote(DailyNote? dailyNote) { DailyNote = dailyNote; - PropertyChanged?.Invoke(this, new(nameof(DailyNote))); + OnPropertyChanged(nameof(DailyNote)); } -} +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Context/Database/AppDbContext.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContext.cs similarity index 92% rename from src/Snap.Hutao/Snap.Hutao/Context/Database/AppDbContext.cs rename to src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContext.cs index c93c649e..db1c3f92 100644 --- a/src/Snap.Hutao/Snap.Hutao/Context/Database/AppDbContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContext.cs @@ -5,7 +5,7 @@ using Microsoft.EntityFrameworkCore; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Configuration; -namespace Snap.Hutao.Context.Database; +namespace Snap.Hutao.Model.Entity.Database; /// /// 应用程序数据库上下文 @@ -117,6 +117,11 @@ public sealed class AppDbContext : DbContext /// public DbSet InventoryReliquaries { get; set; } = default!; + /// + /// 深渊记录 + /// + public DbSet SpiralAbysses { get; set; } = default!; + /// /// 构造一个临时的应用程序数据库上下文 /// @@ -139,8 +144,9 @@ public sealed class AppDbContext : DbContext { modelBuilder .ApplyConfiguration(new AvatarInfoConfiguration()) - .ApplyConfiguration(new UserConfiguration()) .ApplyConfiguration(new DailyNoteEntryConfiguration()) - .ApplyConfiguration(new InventoryReliquaryConfiguration()); + .ApplyConfiguration(new InventoryReliquaryConfiguration()) + .ApplyConfiguration(new SpiralAbyssEntryConfiguration()) + .ApplyConfiguration(new UserConfiguration()); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Context/Database/AppDbContextDesignTimeFactory.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContextDesignTimeFactory.cs similarity index 94% rename from src/Snap.Hutao/Snap.Hutao/Context/Database/AppDbContextDesignTimeFactory.cs rename to src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContextDesignTimeFactory.cs index 43dce6fa..00d505a3 100644 --- a/src/Snap.Hutao/Snap.Hutao/Context/Database/AppDbContextDesignTimeFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContextDesignTimeFactory.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore.Design; using Snap.Hutao.Context.FileSystem; +using Snap.Hutao.Model.Entity.Database; namespace Snap.Hutao.Context.Database; diff --git a/src/Snap.Hutao/Snap.Hutao/Context/Database/LogDbContext.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/LogDbContext.cs similarity index 96% rename from src/Snap.Hutao/Snap.Hutao/Context/Database/LogDbContext.cs rename to src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/LogDbContext.cs index c1d9fbcd..79197c6b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Context/Database/LogDbContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/LogDbContext.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; using Snap.Hutao.Core.Logging; -namespace Snap.Hutao.Context.Database; +namespace Snap.Hutao.Model.Entity.Database; /// /// 日志数据库上下文 diff --git a/src/Snap.Hutao/Snap.Hutao/Context/Database/LogDbContextDesignTimeFactory.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/LogDbContextDesignTimeFactory.cs similarity index 94% rename from src/Snap.Hutao/Snap.Hutao/Context/Database/LogDbContextDesignTimeFactory.cs rename to src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/LogDbContextDesignTimeFactory.cs index 9bd65f86..63e19d69 100644 --- a/src/Snap.Hutao/Snap.Hutao/Context/Database/LogDbContextDesignTimeFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/LogDbContextDesignTimeFactory.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore.Design; using Snap.Hutao.Context.FileSystem; +using Snap.Hutao.Model.Entity.Database; namespace Snap.Hutao.Context.Database; diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SpiralAbyssEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SpiralAbyssEntry.cs new file mode 100644 index 00000000..7d02971d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SpiralAbyssEntry.cs @@ -0,0 +1,69 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using CommunityToolkit.Mvvm.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Snap.Hutao.Model.Entity; + +/// +/// 深渊记录入口点 +/// +[Table("spiral_abysses")] +public class SpiralAbyssEntry : ObservableObject +{ + /// + /// 内部Id + /// + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid InnerId { get; set; } + + /// + /// 计划Id + /// + public int ScheduleId { get; set; } + + /// + /// 计划名称 + /// + [NotMapped] + public string Schedule { get => $"第 {ScheduleId} 期"; } + + /// + /// Uid + /// + public string Uid { get; set; } = default!; + + /// + /// Json!!! 深渊记录 + /// + public Web.Hoyolab.Takumi.GameRecord.SpiralAbyss.SpiralAbyss SpiralAbyss { get; set; } = default!; + + /// + /// 创建一个新的深渊信息 + /// + /// uid + /// 深渊信息 + /// 新的深渊信息 + public static SpiralAbyssEntry Create(string uid, Web.Hoyolab.Takumi.GameRecord.SpiralAbyss.SpiralAbyss spiralAbyss) + { + return new() + { + Uid = uid, + ScheduleId = spiralAbyss.ScheduleId, + SpiralAbyss = spiralAbyss, + }; + } + + /// + /// 更新深渊信息 + /// + /// 深渊信息 + public void UpdateSpiralAbyss(Web.Hoyolab.Takumi.GameRecord.SpiralAbyss.SpiralAbyss spiralAbyss) + { + SpiralAbyss = spiralAbyss; + OnPropertyChanged(nameof(SpiralAbyss)); + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/AvatarIds.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/AvatarIds.cs index 70d2f339..61bf3544 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/AvatarIds.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/AvatarIds.cs @@ -92,4 +92,13 @@ public static class AvatarIds { return avatarId == PlayerBoy || avatarId == PlayerGirl; } + + public static Dictionary ExtendAvatars(Dictionary idAvatarMap) + { + return new(idAvatarMap) + { + [PlayerBoy] = new() { Name = "旅行者", Icon = "UI_AvatarIcon_PlayerBoy", Quality = Intrinsic.ItemQuality.QUALITY_ORANGE }, + [PlayerGirl] = new() { Name = "旅行者", Icon = "UI_AvatarIcon_PlayerGirl", Quality = Intrinsic.ItemQuality.QUALITY_ORANGE }, + }; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest index a0adddf2..5df76c5e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest +++ b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest @@ -12,7 +12,7 @@ + Version="1.3.0.0" /> 胡桃 diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_Icon_Tower_Star.png b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_Icon_Tower_Star.png new file mode 100644 index 0000000000000000000000000000000000000000..696c1980265374f7187da32642c750a5b93932d3 GIT binary patch literal 3226 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 M07*qoM6N<$f~CwT_5c6? literal 0 HcmV?d00001 diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_MarkTower_Tower.png b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_MarkTower_Tower.png new file mode 100644 index 0000000000000000000000000000000000000000..73f88076cc015e25570ed93c70738abaed4d43f3 GIT binary patch literal 5201 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 LNkvXXu0mjfs72~i literal 0 HcmV?d00001 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementDbOperation.cs b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementDbOperation.cs index ff674365..fa1af1d4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementDbOperation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementDbOperation.cs @@ -1,8 +1,8 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Model.InterChange.Achievement; using EntityAchievement = Snap.Hutao.Model.Entity.Achievement; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs index f26cf7c0..e5c52f2e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs @@ -3,10 +3,10 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.EntityFrameworkCore; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.Diagnostics; using Snap.Hutao.Core.Logging; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Model.InterChange.Achievement; using System.Collections.ObjectModel; using BindingAchievement = Snap.Hutao.Model.Binding.Achievement.Achievement; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/AvatarInfoService.cs b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/AvatarInfoService.cs index 74a5057d..58ba5bdd 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/AvatarInfoService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/AvatarInfoService.cs @@ -1,12 +1,12 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.Diagnostics; using Snap.Hutao.Core.Logging; using Snap.Hutao.Model.Binding.AvatarProperty; using Snap.Hutao.Model.Binding.User; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Model.Metadata; using Snap.Hutao.Service.AvatarInfo.Composer; using Snap.Hutao.Service.AvatarInfo.Factory; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs index 25b48ad3..6a004b93 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs @@ -4,9 +4,9 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Model.Primitive; using System.Collections.ObjectModel; using BindingCultivateEntry = Snap.Hutao.Model.Binding.Cultivation.CultivateEntry; @@ -335,6 +335,7 @@ internal class CultivationService : ICultivationService "角色培养素材" => true, "天赋培养素材" => true, "武器强化素材" => true, + "武器突破素材" => true, _ => false, }; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotifier.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotifier.cs index e4b99420..60ed390f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotifier.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotifier.cs @@ -3,12 +3,14 @@ using CommunityToolkit.WinUI.Notifications; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; +using Snap.Hutao.Model.Metadata.Converter; using Snap.Hutao.Web.Hoyolab.Takumi.Auth; using Snap.Hutao.Web.Hoyolab.Takumi.Binding; using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote; +using Windows.Foundation.Metadata; namespace Snap.Hutao.Service.DailyNote; @@ -42,7 +44,7 @@ internal class DailyNoteNotifier return; } - List hints = new(); + List notifyInfos = new(); // NotifySuppressed judge { @@ -50,7 +52,11 @@ internal class DailyNoteNotifier { if (!entry.ResinNotifySuppressed) { - hints.Add($"当前原粹树脂:{entry.DailyNote.CurrentResin}"); + notifyInfos.Add(new( + "原粹树脂", + "ms-appx:///Resource/Icon/UI_ItemIcon_210_256.png", + $"{entry.DailyNote.CurrentResin}", + $"当前原粹树脂:{entry.DailyNote.CurrentResin}")); entry.ResinNotifySuppressed = true; } } @@ -63,7 +69,11 @@ internal class DailyNoteNotifier { if (!entry.HomeCoinNotifySuppressed) { - hints.Add($"当前洞天宝钱:{entry.DailyNote.CurrentHomeCoin}"); + notifyInfos.Add(new( + "洞天宝钱", + "ms-appx:///Resource/Icon/UI_ItemIcon_204.png", + $"{entry.DailyNote.CurrentHomeCoin}", + $"当前洞天宝钱:{entry.DailyNote.CurrentHomeCoin}")); entry.HomeCoinNotifySuppressed = true; } } @@ -76,7 +86,11 @@ internal class DailyNoteNotifier { if (!entry.DailyTaskNotifySuppressed) { - hints.Add(entry.DailyNote.ExtraTaskRewardDescription); + notifyInfos.Add(new( + "每日委托", + "ms-appx:///Resource/Icon/UI_MarkQuest_Events_Proce.png", + $"奖励待领取", + entry.DailyNote.ExtraTaskRewardDescription)); entry.DailyTaskNotifySuppressed = true; } } @@ -89,7 +103,11 @@ internal class DailyNoteNotifier { if (!entry.TransformerNotifySuppressed) { - hints.Add("参量质变仪已准备完成"); + notifyInfos.Add(new( + "参量质变仪", + "ms-appx:///Resource/Icon/UI_ItemIcon_220021.png", + $"准备完成", + "参量质变仪已准备完成")); entry.TransformerNotifySuppressed = true; } } @@ -102,7 +120,11 @@ internal class DailyNoteNotifier { if (!entry.ExpeditionNotifySuppressed) { - hints.Add("探索派遣已完成"); + notifyInfos.Add(new( + "探索派遣", + AvatarIconConverter.IconNameToUri("UI_AvatarIcon_Side_None.png").ToString(), + $"已完成", + "探索派遣已完成")); entry.ExpeditionNotifySuppressed = true; } } @@ -112,7 +134,7 @@ internal class DailyNoteNotifier } } - if (hints.Count <= 0) + if (notifyInfos.Count <= 0) { return; } @@ -145,15 +167,41 @@ internal class DailyNoteNotifier builder.SetToastScenario(ToastScenario.Reminder); } - if (hints.Count > 2) + // Desktop and Mobile started supporting adaptive toasts in API contract 3 (Anniversary Update) + if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 3)) { - builder.AddText("多个提醒项达到设定值"); + AdaptiveGroup group = new(); + foreach (NotifyInfo info in notifyInfos) + { + AdaptiveSubgroup subgroup = new() + { + HintWeight = 1, + Children = + { + new AdaptiveImage() { Source = info.AdaptiveIcon, HintRemoveMargin = true, }, + new AdaptiveText() { Text = info.AdaptiveHint, HintAlign = AdaptiveTextAlign.Center, }, + new AdaptiveText() { Text = info.Title, HintAlign = AdaptiveTextAlign.Center, HintStyle = AdaptiveTextStyle.CaptionSubtle, }, + }, + }; + + group.Children.Add(subgroup); + } + + builder.AddVisualChild(group); + builder.AddText("一个或多个提醒项达到设定值"); } else { - foreach (string hint in hints) + if (notifyInfos.Count > 2) { - builder.AddText(hint); + builder.AddText("多个提醒项达到设定值"); + } + else + { + foreach (NotifyInfo info in notifyInfos) + { + builder.AddText(info.Hint); + } } } @@ -161,4 +209,20 @@ internal class DailyNoteNotifier builder.Show(); } } + + private struct NotifyInfo + { + public string Title; + public string AdaptiveIcon; + public string AdaptiveHint; + public string Hint; + + public NotifyInfo(string title, string adaptiveIcon, string adaptiveHint, string hint) + { + Title = title; + AdaptiveIcon = adaptiveIcon; + AdaptiveHint = adaptiveHint; + Hint = hint; + } + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs index 3d096608..af5f580e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs @@ -4,12 +4,12 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Extension; using Snap.Hutao.Message; using Snap.Hutao.Model.Binding.User; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Service.User; using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord; using System.Collections.ObjectModel; 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 6223426d..6f68928c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs @@ -1,11 +1,11 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Extension; using Snap.Hutao.Model.Binding.Gacha; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Model.Metadata; using Snap.Hutao.Model.Metadata.Avatar; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs index 8413c464..e9fe376b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs @@ -3,7 +3,6 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.EntityFrameworkCore; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Abstraction; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.Diagnostics; @@ -12,6 +11,7 @@ using Snap.Hutao.Extension; using Snap.Hutao.Model.Binding.Gacha; using Snap.Hutao.Model.Binding.Gacha.Abstraction; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Model.InterChange.GachaLog; using Snap.Hutao.Model.Metadata.Abstraction; using Snap.Hutao.Model.Primitive; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs index 34e9e1dd..74d19549 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs @@ -4,12 +4,12 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.IO.Ini; using Snap.Hutao.Model.Binding.LaunchGame; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Service.Game.Locator; using Snap.Hutao.Service.Game.Unlocker; using Snap.Hutao.View.Dialog; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs index 7636d7df..6db76d97 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs @@ -160,11 +160,7 @@ internal class HutaoCache : IHutaoCache if (idAvatarExtendedMap == null) { Dictionary idAvatarMap = await metadataService.GetIdToAvatarMapAsync().ConfigureAwait(false); - idAvatarExtendedMap = new(idAvatarMap) - { - [AvatarIds.PlayerBoy] = new() { Name = "旅行者", Icon = "UI_AvatarIcon_PlayerBoy", Quality = Model.Intrinsic.ItemQuality.QUALITY_ORANGE }, - [AvatarIds.PlayerGirl] = new() { Name = "旅行者", Icon = "UI_AvatarIcon_PlayerGirl", Quality = Model.Intrinsic.ItemQuality.QUALITY_ORANGE }, - }; + idAvatarExtendedMap = AvatarIds.ExtendAvatars(idAvatarMap); } return idAvatarExtendedMap; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs index c67549f5..fbdc97bf 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs @@ -2,9 +2,9 @@ // Licensed under the MIT license. using Microsoft.Extensions.Caching.Memory; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Web.Hutao; using Snap.Hutao.Web.Hutao.Model; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/ISpiralAbyssRecordService.cs b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/ISpiralAbyssRecordService.cs new file mode 100644 index 00000000..681a1ab9 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/ISpiralAbyssRecordService.cs @@ -0,0 +1,27 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Binding.User; +using Snap.Hutao.Model.Entity; +using System.Collections.ObjectModel; + +namespace Snap.Hutao.Service.SpiralAbyss; + +/// +/// 深渊记录服务 +/// +internal interface ISpiralAbyssRecordService +{ + /// + /// 异步获取深渊记录集合 + /// + /// 深渊记录集合 + Task> GetSpiralAbyssCollectionAsync(); + + /// + /// 异步刷新深渊记录 + /// + /// 当前角色 + /// 任务 + Task RefreshSpiralAbyssAsync(UserAndRole userAndRole); +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs new file mode 100644 index 00000000..07bd20c2 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/SpiralAbyss/SpiralAbyssRecordService.cs @@ -0,0 +1,109 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.EntityFrameworkCore; +using Snap.Hutao.Core.Database; +using Snap.Hutao.Model.Binding.User; +using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; +using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord; +using System.Collections.ObjectModel; + +namespace Snap.Hutao.Service.SpiralAbyss; + +/// +/// 深渊记录服务 +/// +[Injection(InjectAs.Scoped, typeof(ISpiralAbyssRecordService))] +internal class SpiralAbyssRecordService : ISpiralAbyssRecordService +{ + private readonly AppDbContext appDbContext; + private readonly GameRecordClient gameRecordClient; + + private ObservableCollection? spiralAbysses; + + /// + /// 构造一个新的深渊记录服务 + /// + /// 数据库上下文 + /// 游戏记录客户端 + public SpiralAbyssRecordService(AppDbContext appDbContext, GameRecordClient gameRecordClient) + { + this.appDbContext = appDbContext; + this.gameRecordClient = gameRecordClient; + } + + /// + public async Task> GetSpiralAbyssCollectionAsync() + { + if (spiralAbysses == null) + { + List entries = await appDbContext.SpiralAbysses + .AsNoTracking() + .OrderByDescending(s => s.ScheduleId) + .ToListAsync() + .ConfigureAwait(false); + + await ThreadHelper.SwitchToMainThreadAsync(); + spiralAbysses = new(entries); + } + + return spiralAbysses; + } + + /// + public async Task RefreshSpiralAbyssAsync(UserAndRole userAndRole) + { + Web.Hoyolab.Takumi.GameRecord.SpiralAbyss.SpiralAbyss? last = await gameRecordClient + .GetSpiralAbyssAsync(userAndRole, SpiralAbyssSchedule.Last) + .ConfigureAwait(false); + + if (last != null) + { + SpiralAbyssEntry? lastEntry = spiralAbysses!.SingleOrDefault(s => s.ScheduleId == last.ScheduleId); + if (lastEntry != null) + { + await ThreadHelper.SwitchToMainThreadAsync(); + lastEntry.UpdateSpiralAbyss(last); + + await ThreadHelper.SwitchToBackgroundAsync(); + await appDbContext.SpiralAbysses.UpdateAndSaveAsync(lastEntry).ConfigureAwait(false); + } + else + { + SpiralAbyssEntry entry = SpiralAbyssEntry.Create(userAndRole.Role.GameUid, last); + + await appDbContext.SpiralAbysses.AddAndSaveAsync(entry).ConfigureAwait(false); + + await ThreadHelper.SwitchToMainThreadAsync(); + spiralAbysses!.Insert(0, entry); + } + } + + Web.Hoyolab.Takumi.GameRecord.SpiralAbyss.SpiralAbyss? current = await gameRecordClient + .GetSpiralAbyssAsync(userAndRole, SpiralAbyssSchedule.Current) + .ConfigureAwait(false); + + if (current != null) + { + SpiralAbyssEntry? currentEntry = spiralAbysses!.SingleOrDefault(s => s.ScheduleId == current.ScheduleId); + if (currentEntry != null) + { + await ThreadHelper.SwitchToMainThreadAsync(); + currentEntry.UpdateSpiralAbyss(current); + + await ThreadHelper.SwitchToBackgroundAsync(); + await appDbContext.SpiralAbysses.UpdateAndSaveAsync(currentEntry).ConfigureAwait(false); + } + else + { + SpiralAbyssEntry entry = SpiralAbyssEntry.Create(userAndRole.Role.GameUid, current); + + await appDbContext.SpiralAbysses.AddAndSaveAsync(entry).ConfigureAwait(false); + + await ThreadHelper.SwitchToMainThreadAsync(); + spiralAbysses!.Insert(0, entry); + } + } + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs index 81555daf..b6a30cd5 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs @@ -3,10 +3,10 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Extension; using Snap.Hutao.Message; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Web.Hoyolab; using Snap.Hutao.Web.Hoyolab.Takumi.Binding; using System.Collections.ObjectModel; diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index eb65dd03..7fd178a9 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -22,7 +22,7 @@ True F8C2255969BEA4A681CED102771BF807856AEC02 SHA256 - True + False True True Never @@ -53,6 +53,7 @@ + @@ -60,6 +61,7 @@ + @@ -95,6 +97,7 @@ + @@ -129,6 +132,7 @@ + @@ -136,6 +140,7 @@ + @@ -184,6 +189,11 @@ + + + MSBuild:Compile + + MSBuild:Compile diff --git a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml index 3e0ef434..e31f93ed 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml @@ -38,33 +38,40 @@ Content="祈愿记录" Icon="{shcm:BitmapIcon Source=ms-appx:///Resource/Icon/UI_BtnIcon_Gacha.png}"/> - - + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml index 42681b42..0bb2a1e3 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml @@ -178,15 +178,6 @@ public ICommand OpenDataFolderCommand { get; } - /// - /// 上传深渊记录命令 - /// - public ICommand UploadSpiralAbyssRecordCommand { get; } + /// /// 清空用户命令 @@ -78,28 +74,7 @@ internal class ExperimentalFeaturesViewModel : ObservableObject return Launcher.LaunchFolderPathAsync(hutaoLocation.GetPath()).AsTask(); } - private async Task UploadSpiralAbyssRecordAsync() - { - HomaClient homaClient = Ioc.Default.GetRequiredService(); - IUserService userService = Ioc.Default.GetRequiredService(); - IInfoBarService infoBarService = Ioc.Default.GetRequiredService(); - if (userService.Current is Model.Binding.User.User user) - { - if (user.SelectedUserGameRole == null) - { - infoBarService.Warning("尚未选择角色"); - } - - SimpleRecord record = await homaClient.GetPlayerRecordAsync(user).ConfigureAwait(false); - Web.Response.Response? response = await homaClient.UploadRecordAsync(record).ConfigureAwait(false); - - if (response != null && response.IsOk()) - { - infoBarService.Success(response.Message); - } - } - } private async Task DangerousDeleteUsersAsync() { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/LaunchGameViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/LaunchGameViewModel.cs index 52e1bf56..772214c6 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/LaunchGameViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/LaunchGameViewModel.cs @@ -5,13 +5,13 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; -using Snap.Hutao.Context.Database; using Snap.Hutao.Control; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Factory.Abstraction; using Snap.Hutao.Model.Binding.LaunchGame; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Service.Abstraction; using Snap.Hutao.Service.Game; using Snap.Hutao.Service.Navigation; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs index b8068b5c..d013e73c 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs @@ -5,12 +5,12 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.Windowing; using Snap.Hutao.Factory.Abstraction; using Snap.Hutao.Model; using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Service.GachaLog; using Snap.Hutao.Service.Game; using Snap.Hutao.Service.Game.Locator; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyssRecordViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyssRecordViewModel.cs new file mode 100644 index 00000000..a6129a49 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyssRecordViewModel.cs @@ -0,0 +1,174 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.WinUI.UI; +using Microsoft.Extensions.Primitives; +using Snap.Hutao.Control; +using Snap.Hutao.Extension; +using Snap.Hutao.Factory.Abstraction; +using Snap.Hutao.Model.Binding.Cultivation; +using Snap.Hutao.Model.Binding.Hutao; +using Snap.Hutao.Model.Binding.SpiralAbyss; +using Snap.Hutao.Model.Binding.User; +using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Intrinsic; +using Snap.Hutao.Model.Metadata; +using Snap.Hutao.Model.Metadata.Weapon; +using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Service.Abstraction; +using Snap.Hutao.Service.Cultivation; +using Snap.Hutao.Service.Hutao; +using Snap.Hutao.Service.Metadata; +using Snap.Hutao.Service.SpiralAbyss; +using Snap.Hutao.Service.User; +using Snap.Hutao.View.Dialog; +using Snap.Hutao.Web.Hutao; +using Snap.Hutao.Web.Hutao.Model.Post; +using System.Collections.Immutable; +using System.Collections.ObjectModel; +using CalcAvatarPromotionDelta = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.AvatarPromotionDelta; +using CalcClient = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.CalculateClient; +using CalcConsumption = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.Consumption; + +namespace Snap.Hutao.ViewModel; + +/// +/// 深渊记录视图模型 +/// +[Injection(InjectAs.Scoped)] +internal class SpiralAbyssRecordViewModel : ObservableObject, ISupportCancellation +{ + private readonly ISpiralAbyssRecordService spiralAbyssRecordService; + private readonly IMetadataService metadataService; + private readonly IUserService userService; + private Dictionary? idAvatarMap; + + private ObservableCollection? spiralAbyssEntries; + private SpiralAbyssEntry? selectedEntry; + private SpiralAbyssView? spiralAbyssView; + + /// + /// 构造一个新的深渊记录视图模型 + /// + /// 深渊记录服务 + /// 元数据服务 + /// 用户服务 + /// 异步命令工厂 + public SpiralAbyssRecordViewModel( + ISpiralAbyssRecordService spiralAbyssRecordService, + IMetadataService metadataService, + IUserService userService, + IAsyncRelayCommandFactory asyncRelayCommandFactory) + { + this.spiralAbyssRecordService = spiralAbyssRecordService; + this.metadataService = metadataService; + this.userService = userService; + + OpenUICommand = asyncRelayCommandFactory.Create(OpenUIAsync); + RefreshCommand = asyncRelayCommandFactory.Create(RefreshAsync); + UploadSpiralAbyssRecordCommand = asyncRelayCommandFactory.Create(UploadSpiralAbyssRecordAsync); + } + + /// + public CancellationToken CancellationToken { get; set; } + + /// + /// 深渊记录 + /// + public ObservableCollection? SpiralAbyssEntries { get => spiralAbyssEntries; set => SetProperty(ref spiralAbyssEntries, value); } + + /// + /// 选中的深渊信息 + /// + public SpiralAbyssEntry? SelectedEntry + { + get => selectedEntry; set + { + if (SetProperty(ref selectedEntry, value)) + { + if (value != null && idAvatarMap != null) + { + SpiralAbyssView = new(value.SpiralAbyss, idAvatarMap); + } + } + } + } + + /// + /// 深渊的只读视图 + /// + public SpiralAbyssView? SpiralAbyssView { get => spiralAbyssView; set => SetProperty(ref spiralAbyssView, value); } + + /// + /// 打开界面命令 + /// + public ICommand OpenUICommand { get; } + + /// + /// 刷新界面命令 + /// + public ICommand RefreshCommand { get; } + + /// + /// 上传深渊记录命令 + /// + public ICommand UploadSpiralAbyssRecordCommand { get; } + + private async Task OpenUIAsync() + { + if (await metadataService.InitializeAsync().ConfigureAwait(false)) + { + idAvatarMap = await metadataService.GetIdToAvatarMapAsync().ConfigureAwait(false); + idAvatarMap = AvatarIds.ExtendAvatars(idAvatarMap); + ObservableCollection temp = await spiralAbyssRecordService.GetSpiralAbyssCollectionAsync().ConfigureAwait(false); + + await ThreadHelper.SwitchToMainThreadAsync(); + SpiralAbyssEntries = temp; + SelectedEntry = SpiralAbyssEntries.FirstOrDefault(); + } + } + + private async Task RefreshAsync() + { + if (await metadataService.InitializeAsync().ConfigureAwait(false)) + { + if (userService.Current?.SelectedUserGameRole != null) + { + await spiralAbyssRecordService + .RefreshSpiralAbyssAsync(UserAndRole.FromUser(userService.Current)) + .ConfigureAwait(false); + } + } + } + + private async Task UploadSpiralAbyssRecordAsync() + { + HomaClient homaClient = Ioc.Default.GetRequiredService(); + IInfoBarService infoBarService = Ioc.Default.GetRequiredService(); + + if (userService.Current is Model.Binding.User.User user) + { + if (user.SelectedUserGameRole == null) + { + infoBarService.Warning("尚未选择角色"); + } + + SimpleRecord record = await homaClient.GetPlayerRecordAsync(user).ConfigureAwait(false); + Web.Response.Response? response = await homaClient.UploadRecordAsync(record).ConfigureAwait(false); + + if (response != null) + { + if (response.IsOk()) + { + infoBarService.Success(response.Message); + } + else + { + infoBarService.Information(response.Message); + } + } + } + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs index e4a9edb1..c375b829 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs @@ -231,4 +231,4 @@ internal class WikiWeaponViewModel : ObservableObject, ISupportCancellation return keep; } } -} \ No newline at end of file +} diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs index c44cabc0..968b0253 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/MiHoYoJSInterface.cs @@ -3,11 +3,11 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Web.WebView2.Core; -using Snap.Hutao.Context.Database; using Snap.Hutao.Core.Convert; using Snap.Hutao.Core.Database; using Snap.Hutao.Extension; using Snap.Hutao.Model.Binding.User; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Service.User; using Snap.Hutao.Web.Bridge.Model; using Snap.Hutao.Web.Hoyolab; diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs index d9da0b0b..75ad60b4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs @@ -109,6 +109,18 @@ internal class GameRecordClient return resp?.Data; } + /// + /// 获取玩家深渊信息 + /// + /// 用户 + /// 1:当期,2:上期 + /// 取消令牌 + /// 深渊信息 + public Task GetSpiralAbyssAsync(UserAndRole userAndRole, SpiralAbyssSchedule schedule, CancellationToken token = default) + { + return GetSpiralAbyssAsync(userAndRole.User, userAndRole.Role, schedule, token); + } + /// /// 获取玩家深渊信息 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Battle.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Battle.cs index d583948d..62ca4087 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Battle.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Battle.cs @@ -18,19 +18,12 @@ public class Battle /// 时间戳 /// [JsonPropertyName("timestamp")] - public string Timestamp { get; set; } = default!; + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long Timestamp { get; set; } = default!; /// /// 参战角色 /// [JsonPropertyName("avatars")] public List Avatars { get; set; } = default!; - - /// - /// 时间 - /// - public DateTime Time - { - get => DateTimeOffset.FromUnixTimeSeconds(int.Parse(Timestamp)).LocalDateTime; - } } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Floor.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Floor.cs index c982db07..5ba88f43 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Floor.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/Floor.cs @@ -30,7 +30,8 @@ public class Floor /// 结束时间 /// [JsonPropertyName("settle_time")] - public string SettleTime { get; set; } = default!; + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long SettleTime { get; set; } = default!; /// /// 星数 diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/SpiralAbyss.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/SpiralAbyss.cs index f6c4b050..34fbcd17 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/SpiralAbyss.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/SpiralAbyss/SpiralAbyss.cs @@ -18,14 +18,14 @@ public class SpiralAbyss /// 开始时间 /// [JsonPropertyName("start_time")] - [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)] + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] public long StartTime { get; set; } /// /// 结束时间 /// [JsonPropertyName("end_time")] - [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)] + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] public long EndTime { get; set; } /// diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Overview.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Overview.cs index 37756206..ab313bec 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Overview.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Overview.cs @@ -28,21 +28,45 @@ public class Overview /// public int SpiralAbyssPassed { get; set; } + /// + /// 通关玩家比例 + /// + [JsonIgnore] + public string SpiralAbyssPassedPercent { get => $"{(double)SpiralAbyssPassed / SpiralAbyssTotal:P2}"; } + /// /// 总星数 /// public int SpiralAbyssStarTotal { get; set; } + /// + /// 平均星数 + /// + [JsonIgnore] + public string SpiralAbyssStarAverage { get => $"{(double)SpiralAbyssStarTotal / SpiralAbyssTotal:F2}"; } + /// /// 满星数 /// public int SpiralAbyssFullStar { get; set; } + /// + /// 满星比例 + /// + [JsonIgnore] + public string SpiralAbyssFullStarPercent { get => $"{(double)SpiralAbyssFullStar / SpiralAbyssTotal:P2}"; } + /// /// 总战斗次数 /// public long SpiralAbyssBattleTotal { get; set; } + /// + /// 平均战斗次数 + /// + [JsonIgnore] + public string SpiralAbyssBattleAverage { get => $"{(double)SpiralAbyssBattleTotal / SpiralAbyssTotal:F2}"; } + /// /// 统计时间 ///