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 @@ 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}"; } + /// /// 统计时间 ///