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 00000000..696c1980
Binary files /dev/null and b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_Icon_Tower_Star.png differ
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 00000000..73f88076
Binary files /dev/null and b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_MarkTower_Tower.png differ
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 @@
-
-
-
-
-
-
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml
new file mode 100644
index 00000000..de7ec847
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml.cs
new file mode 100644
index 00000000..a71602e3
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SpiralAbyssRecordPage.xaml.cs
@@ -0,0 +1,22 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Control;
+using Snap.Hutao.ViewModel;
+
+namespace Snap.Hutao.View.Page;
+
+///
+/// 深渊记录页面
+///
+public sealed partial class SpiralAbyssRecordPage : ScopedPage
+{
+ ///
+ /// 构造一个新的深渊记录页面
+ ///
+ public SpiralAbyssRecordPage()
+ {
+ InitializeWith();
+ InitializeComponent();
+ }
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs
index d5c965af..d26eb928 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs
@@ -3,7 +3,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Snap.Hutao.Context.Database;
using Snap.Hutao.Control;
using Snap.Hutao.Core;
using Snap.Hutao.Core.Database;
@@ -11,6 +10,7 @@ using Snap.Hutao.Factory.Abstraction;
using Snap.Hutao.Model;
using Snap.Hutao.Model.Binding.User;
using Snap.Hutao.Model.Entity;
+using Snap.Hutao.Model.Entity.Database;
using Snap.Hutao.Service.Abstraction;
using Snap.Hutao.Service.DailyNote;
using Snap.Hutao.Service.User;
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs
index f70928dc..69677e07 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs
@@ -5,9 +5,9 @@ using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
-using Snap.Hutao.Context.Database;
using Snap.Hutao.Context.FileSystem.Location;
using Snap.Hutao.Factory.Abstraction;
+using Snap.Hutao.Model.Entity.Database;
using Snap.Hutao.Service.Abstraction;
using Snap.Hutao.Service.User;
using Snap.Hutao.Web.Hutao;
@@ -38,7 +38,6 @@ internal class ExperimentalFeaturesViewModel : ObservableObject
OpenCacheFolderCommand = asyncRelayCommandFactory.Create(OpenCacheFolderAsync);
OpenDataFolderCommand = asyncRelayCommandFactory.Create(OpenDataFolderAsync);
- UploadSpiralAbyssRecordCommand = asyncRelayCommandFactory.Create(UploadSpiralAbyssRecordAsync);
DeleteUsersCommand = asyncRelayCommandFactory.Create(DangerousDeleteUsersAsync);
DeleteAllScheduleTasksCommand = new RelayCommand(DangerousDeleteAllScheduleTasks);
}
@@ -53,10 +52,7 @@ internal class ExperimentalFeaturesViewModel : ObservableObject
///
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}"; }
+
///
/// 统计时间
///