From a69ae12e4f5286bc88fcf8386c8e00644da6fbcb Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Tue, 1 Aug 2023 22:20:50 +0800 Subject: [PATCH] fix #825 --- src/Snap.Hutao/Snap.Hutao/App.xaml | 6 + .../Extension/EnumerableExtension.List.cs | 18 +-- .../Resource/Icon/UI_ItemIcon_220021.png | Bin 60757 -> 0 bytes .../Icon/UI_MarkQuest_Events_Proce.png | Bin 3953 -> 0 bytes .../DailyNoteNotificationOperation.cs | 10 +- .../Snap.Hutao/Service/Game/ChannelOptions.cs | 3 + .../Snap.Hutao/Service/Game/GameDbService.cs | 62 +++++++++ .../Snap.Hutao/Service/Game/GameService.cs | 130 ++++++------------ .../Snap.Hutao/Service/Game/IGameDbService.cs | 20 +++ .../Snap.Hutao/Service/Game/LaunchOptions.cs | 24 ++-- .../Snap.Hutao/Service/Game/ProcessInterop.cs | 2 +- .../Snap.Hutao/Service/Hutao/HutaoCache.cs | 87 +++++++----- .../Snap.Hutao/Service/Hutao/HutaoService.cs | 2 - .../Service/Hutao/HutaoUserOptions.cs | 2 +- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 6 - .../Snap.Hutao/View/Card/DailyNoteCard.xaml | 3 +- .../Snap.Hutao/View/Page/DailyNotePage.xaml | 2 +- .../Snap.Hutao/Web/Hoyolab/Images.cs | 13 ++ .../Snap.Hutao/Web/Hoyolab/OssImages.cs | 13 -- 19 files changed, 229 insertions(+), 174 deletions(-) delete mode 100644 src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_ItemIcon_220021.png delete mode 100644 src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_MarkQuest_Events_Proce.png create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Game/GameDbService.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Game/IGameDbService.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Images.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/OssImages.cs diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml b/src/Snap.Hutao/Snap.Hutao/App.xaml index 245ac7ad..100f6c55 100644 --- a/src/Snap.Hutao/Snap.Hutao/App.xaml +++ b/src/Snap.Hutao/Snap.Hutao/App.xaml @@ -81,6 +81,12 @@ https://static.snapgenshin.com/EmotionIcon/UI_EmotionIcon250.png https://static.snapgenshin.com/EmotionIcon/UI_EmotionIcon272.png https://static.snapgenshin.com/EmotionIcon/UI_EmotionIcon293.png + + https://smms.app/image/x9psnPrcbYoCl6U + https://smms.app/image/n4gwxlFGPTX2j8p + https://smms.app/image/kbh1a2YVXpxWuez + https://smms.app/image/zJ4UYqKiD6uQlLc + https://smms.app/image/DQyTF3rv4aA8MZV diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs index 26b97745..0b09464f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.List.cs @@ -105,17 +105,19 @@ internal static partial class EnumerableExtension return results; } - /// - /// 按元素的键排序 - /// - /// 元素类型 - /// 键类型 - /// 列表 - /// 键选择器 [MethodImpl(MethodImplOptions.AggressiveOptimization)] - public static void SortBy(this List list, Func keySelector) + public static List SortBy(this List list, Func keySelector) where TKey : IComparable { list.Sort((left, right) => keySelector(left).CompareTo(keySelector(right))); + return list; + } + + [MethodImpl(MethodImplOptions.AggressiveOptimization)] + public static List SortByDescending(this List list, Func keySelector) + where TKey : IComparable + { + list.Sort((left, right) => keySelector(right).CompareTo(keySelector(left))); + return list; } } diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_ItemIcon_220021.png b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_ItemIcon_220021.png deleted file mode 100644 index 3d006d7bfc4964df289eaf3a3b0c063a6f2d5a4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60757 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 OuO%m?ELkIN67oO0I_!f0 diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_MarkQuest_Events_Proce.png b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_MarkQuest_Events_Proce.png deleted file mode 100644 index 0899c458fdffc2bf99d8e3bcf065cac4ea2f3f74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3953 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 /// 通道 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameDbService.cs new file mode 100644 index 00000000..7c4f10ed --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameDbService.cs @@ -0,0 +1,62 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.EntityFrameworkCore; +using Snap.Hutao.Core.Database; +using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; +using System.Collections.ObjectModel; + +namespace Snap.Hutao.Service.Game; + +[ConstructorGenerated] +[Injection(InjectAs.Singleton, typeof(IGameDbService))] +internal sealed partial class GameDbService : IGameDbService +{ + private readonly IServiceProvider serviceProvider; + + public ObservableCollection GetGameAccountCollection() + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + return appDbContext.GameAccounts.AsNoTracking().ToObservableCollection(); + } + } + + public async ValueTask AddGameAccountAsync(GameAccount gameAccount) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + await appDbContext.GameAccounts.AddAndSaveAsync(gameAccount).ConfigureAwait(false); + } + } + + public async ValueTask UpdateGameAccountAsync(GameAccount gameAccount) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + await appDbContext.GameAccounts.UpdateAndSaveAsync(gameAccount).ConfigureAwait(false); + } + } + + public void UpdateGameAccount(GameAccount gameAccount) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + appDbContext.GameAccounts.UpdateAndSave(gameAccount); + } + } + + public async ValueTask DeleteGameAccountByIdAsync(Guid id) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + await appDbContext.GameAccounts.ExecuteDeleteWhereAsync(a => a.InnerId == id).ConfigureAwait(false); + } + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs index 78e45255..fcbd5f8f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs @@ -1,13 +1,10 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Microsoft.EntityFrameworkCore; using Snap.Hutao.Core; -using Snap.Hutao.Core.Database; using Snap.Hutao.Core.ExceptionService; using Snap.Hutao.Core.IO.Ini; using Snap.Hutao.Model.Entity; -using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.Service.Game.Locator; using Snap.Hutao.Service.Game.Package; using Snap.Hutao.View.Dialog; @@ -32,7 +29,7 @@ internal sealed partial class GameService : IGameService private readonly IServiceProvider serviceProvider; private readonly IGameDbService gameDbService; private readonly LaunchOptions launchOptions; - private readonly RuntimeOptions hutaoOptions; + private readonly RuntimeOptions runtimeOptions; private readonly ITaskContext taskContext; private readonly AppOptions appOptions; @@ -48,48 +45,45 @@ internal sealed partial class GameService : IGameService /// public async ValueTask> GetGamePathAsync() { - using (IServiceScope scope = serviceProvider.CreateScope()) + // Cannot find in setting + if (string.IsNullOrEmpty(appOptions.GamePath)) { - // Cannot find in setting - if (string.IsNullOrEmpty(appOptions.GamePath)) - { - IGameLocatorFactory locatorFactory = scope.ServiceProvider.GetRequiredService(); + IGameLocatorFactory locatorFactory = serviceProvider.GetRequiredService(); - // Try locate by unity log - ValueResult result = await locatorFactory - .Create(GameLocationSource.UnityLog) + // Try locate by unity log + ValueResult result = await locatorFactory + .Create(GameLocationSource.UnityLog) + .LocateGamePathAsync() + .ConfigureAwait(false); + + if (!result.IsOk) + { + // Try locate by registry + result = await locatorFactory + .Create(GameLocationSource.Registry) .LocateGamePathAsync() .ConfigureAwait(false); - - if (!result.IsOk) - { - // Try locate by registry - result = await locatorFactory - .Create(GameLocationSource.Registry) - .LocateGamePathAsync() - .ConfigureAwait(false); - } - - if (result.IsOk) - { - // Save result. - appOptions.GamePath = result.Value; - } - else - { - return new(false, SH.ServiceGamePathLocateFailed); - } } - if (!string.IsNullOrEmpty(appOptions.GamePath)) + if (result.IsOk) { - return new(true, appOptions.GamePath); + // Save result. + appOptions.GamePath = result.Value; } else { - return new(false, null!); + return new(false, SH.ServiceGamePathLocateFailed); } } + + if (!string.IsNullOrEmpty(appOptions.GamePath)) + { + return new(true, appOptions.GamePath); + } + else + { + return new(false, null!); + } } /// @@ -107,8 +101,8 @@ internal sealed partial class GameService : IGameService using (FileStream stream = File.OpenRead(configPath)) { List parameters = IniSerializer.Deserialize(stream).OfType().ToList(); - string? channel = parameters.FirstOrDefault(p => p.Key == "channel")?.Value; - string? subChannel = parameters.FirstOrDefault(p => p.Key == "sub_channel")?.Value; + string? channel = parameters.FirstOrDefault(p => p.Key == ChannelOptions.ChannelName)?.Value; + string? subChannel = parameters.FirstOrDefault(p => p.Key == ChannelOptions.SubChannelName)?.Value; return new(channel, subChannel, isOversea); } @@ -178,14 +172,10 @@ internal sealed partial class GameService : IGameService string gameFileName = Path.GetFileName(gamePath); progress.Report(new(SH.ServiceGameEnsureGameResourceQueryResourceInformation)); - Response response; - using (IServiceScope scope = serviceProvider.CreateScope()) - { - response = await scope.ServiceProvider - .GetRequiredService() - .GetResourceAsync(launchScheme) - .ConfigureAwait(false); - } + Response response = await serviceProvider + .GetRequiredService() + .GetResourceAsync(launchScheme) + .ConfigureAwait(false); if (response.IsOk()) { @@ -257,7 +247,7 @@ internal sealed partial class GameService : IGameService return; } - Process game = ProcessInterop.PrepareGameProcess(launchOptions, gamePath); + Process game = ProcessInterop.InitializeGameProcess(launchOptions, gamePath); try { @@ -265,7 +255,7 @@ internal sealed partial class GameService : IGameService game.Start(); - bool isAdvancedOptionsAllowed = hutaoOptions.IsElevated && appOptions.IsAdvancedLaunchOptionsEnabled; + bool isAdvancedOptionsAllowed = runtimeOptions.IsElevated && appOptions.IsAdvancedLaunchOptionsEnabled; if (isAdvancedOptionsAllowed && launchOptions.MultipleInstances && !isFirstInstance) { ProcessInterop.DisableProtection(game, gamePath); @@ -317,14 +307,7 @@ internal sealed partial class GameService : IGameService // sync database await taskContext.SwitchToBackgroundAsync(); - using (IServiceScope scope = serviceProvider.CreateScope()) - { - await scope.ServiceProvider - .GetRequiredService() - .GameAccounts - .AddAndSaveAsync(account) - .ConfigureAwait(false); - } + await gameDbService.AddGameAccountAsync(account).ConfigureAwait(false); // sync cache await taskContext.SwitchToMainThreadAsync(); @@ -365,11 +348,8 @@ internal sealed partial class GameService : IGameService /// public void AttachGameAccountToUid(GameAccount gameAccount, string uid) { - using (IServiceScope scope = serviceProvider.CreateScope()) - { - gameAccount.UpdateAttachUid(uid); - scope.ServiceProvider.GetRequiredService().GameAccounts.UpdateAndSave(gameAccount); - } + gameAccount.UpdateAttachUid(uid); + gameDbService.UpdateGameAccount(gameAccount); } /// @@ -385,11 +365,7 @@ internal sealed partial class GameService : IGameService // sync database await taskContext.SwitchToBackgroundAsync(); - using (IServiceScope scope = serviceProvider.CreateScope()) - { - AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); - await appDbContext.GameAccounts.UpdateAndSaveAsync(gameAccount).ConfigureAwait(false); - } + await gameDbService.UpdateGameAccountAsync(gameAccount).ConfigureAwait(false); } } @@ -400,10 +376,7 @@ internal sealed partial class GameService : IGameService gameAccounts!.Remove(gameAccount); await taskContext.SwitchToBackgroundAsync(); - using (IServiceScope scope = serviceProvider.CreateScope()) - { - await scope.ServiceProvider.GetRequiredService().GameAccounts.RemoveAndSaveAsync(gameAccount).ConfigureAwait(false); - } + await gameDbService.DeleteGameAccountByIdAsync(gameAccount.InnerId).ConfigureAwait(false); } private static bool LaunchSchemeMatchesExecutable(LaunchScheme launchScheme, string gameFileName) @@ -415,25 +388,4 @@ internal sealed partial class GameService : IGameService _ => false, }; } -} - -[ConstructorGenerated] -[Injection(InjectAs.Singleton, typeof(IGameDbService))] -internal sealed partial class GameDbService : IGameDbService -{ - private readonly IServiceProvider serviceProvider; - - public ObservableCollection GetGameAccountCollection() - { - using (IServiceScope scope = serviceProvider.CreateScope()) - { - AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); - return appDbContext.GameAccounts.AsNoTracking().ToObservableCollection(); - } - } -} - -internal interface IGameDbService -{ - ObservableCollection GetGameAccountCollection(); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/IGameDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/IGameDbService.cs new file mode 100644 index 00000000..42f50de8 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/IGameDbService.cs @@ -0,0 +1,20 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Entity; +using System.Collections.ObjectModel; + +namespace Snap.Hutao.Service.Game; + +internal interface IGameDbService +{ + ValueTask AddGameAccountAsync(GameAccount gameAccount); + + ValueTask DeleteGameAccountByIdAsync(Guid id); + + ObservableCollection GetGameAccountCollection(); + + void UpdateGameAccount(GameAccount gameAccount); + + ValueTask UpdateGameAccountAsync(GameAccount gameAccount); +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs index b96c1a48..baf237b3 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs @@ -43,16 +43,7 @@ internal sealed class LaunchOptions : DbStoreOptions primaryScreenWidth = primaryRect.Width; primaryScreenHeight = primaryRect.Height; - // This list can't use foreach - // https://github.com/microsoft/microsoft-ui-xaml/issues/6454 - IReadOnlyList displayAreas = DisplayArea.FindAll(); - for (int i = 0; i < displayAreas.Count; i++) - { - DisplayArea displayArea = displayAreas[i]; - int index = i + 1; - Monitors.Add(new($"{displayArea.DisplayId.Value:X8}:{index}", index)); - } - + InitializeMonitors(Monitors); InitializeScreenFps(out primaryScreenFps); } @@ -168,6 +159,19 @@ internal sealed class LaunchOptions : DbStoreOptions set => SetOption(ref multipleInstances, SettingEntry.MultipleInstances, value); } + private static void InitializeMonitors(List> monitors) + { + // This list can't use foreach + // https://github.com/microsoft/microsoft-ui-xaml/issues/6454 + IReadOnlyList displayAreas = DisplayArea.FindAll(); + for (int i = 0; i < displayAreas.Count; i++) + { + DisplayArea displayArea = displayAreas[i]; + int index = i + 1; + monitors.Add(new($"{displayArea.DisplayId.Value:X8}:{index}", index)); + } + } + private static void InitializeScreenFps(out int fps) { HDC hDC = GetDC(HWND.Null); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs index 07ef89e8..123fb6d6 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs @@ -24,7 +24,7 @@ internal static class ProcessInterop /// 启动选项 /// 游戏路径 /// 初始化后的游戏进程 - public static Process PrepareGameProcess(LaunchOptions options, string gamePath) + public static Process InitializeGameProcess(LaunchOptions options, string gamePath) { // https://docs.unity.cn/cn/current/Manual/PlayerCommandLineArguments.html string commandLine = new CommandLineBuilder() diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs index 1b49d828..13152b8b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoCache.cs @@ -95,21 +95,7 @@ internal sealed partial class HutaoCache : IHutaoCache Dictionary idAvatarMap = await GetIdAvatarMapExtendedAsync().ConfigureAwait(false); Dictionary idWeaponMap = await metadataService.GetIdToWeaponMapAsync().ConfigureAwait(false); Dictionary idReliquarySetMap = await metadataService.GetEquipAffixIdToReliquarySetMapAsync().ConfigureAwait(false); - - List avatarCollocationsRaw; - using (IServiceScope scope = serviceProvider.CreateScope()) - { - IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService(); - avatarCollocationsRaw = await hutaoService.GetAvatarCollocationsAsync().ConfigureAwait(false); - } - - AvatarCollocations = avatarCollocationsRaw.Select(co => new AvatarCollocationView() - { - AvatarId = co.AvatarId, - Avatars = co.Avatars.Select(a => new AvatarView(idAvatarMap[a.Item], a.Rate)).ToList(), - Weapons = co.Weapons.Select(w => new WeaponView(idWeaponMap[w.Item], w.Rate)).ToList(), - ReliquarySets = co.Reliquaries.Select(r => new ReliquarySetView(r, idReliquarySetMap)).ToList(), - }).ToList(); + await AvatarCollocationsAsync(idAvatarMap, idWeaponMap, idReliquarySetMap).ConfigureAwait(false); wikiAvatarViewModelTaskSource.TrySetResult(true); return true; @@ -131,19 +117,7 @@ internal sealed partial class HutaoCache : IHutaoCache if (await metadataService.InitializeAsync().ConfigureAwait(false)) { Dictionary idAvatarMap = await GetIdAvatarMapExtendedAsync().ConfigureAwait(false); - - List weaponCollocationsRaw; - using (IServiceScope scope = serviceProvider.CreateScope()) - { - IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService(); - weaponCollocationsRaw = await hutaoService.GetWeaponCollocationsAsync().ConfigureAwait(false); - } - - WeaponCollocations = weaponCollocationsRaw.Select(co => new WeaponCollocationView() - { - WeaponId = co.WeaponId, - Avatars = co.Avatars.Select(a => new AvatarView(idAvatarMap[a.Item], a.Rate)).ToList(), - }).ToList(); + await WeaponCollocationsAsync(idAvatarMap).ConfigureAwait(false); wikiWeaponViewModelTaskSource.TrySetResult(true); return true; @@ -164,6 +138,41 @@ internal sealed partial class HutaoCache : IHutaoCache return idAvatarExtendedMap; } + private async ValueTask AvatarCollocationsAsync(Dictionary idAvatarMap, Dictionary idWeaponMap, Dictionary idReliquarySetMap) + { + List avatarCollocationsRaw; + using (IServiceScope scope = serviceProvider.CreateScope()) + { + IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService(); + avatarCollocationsRaw = await hutaoService.GetAvatarCollocationsAsync().ConfigureAwait(false); + } + + AvatarCollocations = avatarCollocationsRaw.SelectList(co => new AvatarCollocationView() + { + AvatarId = co.AvatarId, + Avatars = co.Avatars.SelectList(a => new AvatarView(idAvatarMap[a.Item], a.Rate)), + Weapons = co.Weapons.SelectList(w => new WeaponView(idWeaponMap[w.Item], w.Rate)), + ReliquarySets = co.Reliquaries.SelectList(r => new ReliquarySetView(r, idReliquarySetMap)), + }); + } + + private async ValueTask WeaponCollocationsAsync(Dictionary idAvatarMap) + { + List weaponCollocationsRaw; + using (IServiceScope scope = serviceProvider.CreateScope()) + { + IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService(); + weaponCollocationsRaw = await hutaoService.GetWeaponCollocationsAsync().ConfigureAwait(false); + } + + WeaponCollocations = weaponCollocationsRaw.SelectList(co => new WeaponCollocationView() + { + WeaponId = co.WeaponId, + Avatars = co.Avatars.SelectList(a => new AvatarView(idAvatarMap[a.Item], a.Rate)), + }); + } + + [SuppressMessage("", "SH003")] private async Task AvatarAppearanceRankAsync(Dictionary idAvatarMap) { List avatarAppearanceRanksRaw; @@ -173,13 +182,14 @@ internal sealed partial class HutaoCache : IHutaoCache avatarAppearanceRanksRaw = await hutaoService.GetAvatarAppearanceRanksAsync().ConfigureAwait(false); } - AvatarAppearanceRanks = avatarAppearanceRanksRaw.OrderByDescending(r => r.Floor).Select(rank => new AvatarRankView + AvatarAppearanceRanks = avatarAppearanceRanksRaw.SortByDescending(r => r.Floor).SelectList(rank => new AvatarRankView { Floor = string.Format(SH.ModelBindingHutaoComplexRankFloor, rank.Floor), - Avatars = rank.Ranks.OrderByDescending(r => r.Rate).Select(rank => new AvatarView(idAvatarMap[rank.Item], rank.Rate)).ToList(), - }).ToList(); + Avatars = rank.Ranks.SortByDescending(r => r.Rate).SelectList(rank => new AvatarView(idAvatarMap[rank.Item], rank.Rate)), + }); } + [SuppressMessage("", "SH003")] private async Task AvatarUsageRanksAsync(Dictionary idAvatarMap) { List avatarUsageRanksRaw; @@ -189,13 +199,14 @@ internal sealed partial class HutaoCache : IHutaoCache avatarUsageRanksRaw = await hutaoService.GetAvatarUsageRanksAsync().ConfigureAwait(false); } - AvatarUsageRanks = avatarUsageRanksRaw.OrderByDescending(r => r.Floor).Select(rank => new AvatarRankView + AvatarUsageRanks = avatarUsageRanksRaw.SortByDescending(r => r.Floor).SelectList(rank => new AvatarRankView { Floor = string.Format(SH.ModelBindingHutaoComplexRankFloor, rank.Floor), - Avatars = rank.Ranks.OrderByDescending(r => r.Rate).Select(rank => new AvatarView(idAvatarMap[rank.Item], rank.Rate)).ToList(), - }).ToList(); + Avatars = rank.Ranks.SortByDescending(r => r.Rate).SelectList(rank => new AvatarView(idAvatarMap[rank.Item], rank.Rate)), + }); } + [SuppressMessage("", "SH003")] private async Task AvatarConstellationInfosAsync(Dictionary idAvatarMap) { List avatarConstellationInfosRaw; @@ -205,12 +216,13 @@ internal sealed partial class HutaoCache : IHutaoCache avatarConstellationInfosRaw = await hutaoService.GetAvatarConstellationInfosAsync().ConfigureAwait(false); } - AvatarConstellationInfos = avatarConstellationInfosRaw.OrderBy(i => i.HoldingRate).Select(info => + AvatarConstellationInfos = avatarConstellationInfosRaw.SortBy(i => i.HoldingRate).SelectList(info => { return new AvatarConstellationInfoView(idAvatarMap[info.AvatarId], info.HoldingRate, info.Constellations.SelectList(x => x.Rate)); - }).ToList(); + }); } + [SuppressMessage("", "SH003")] private async Task TeamAppearancesAsync(Dictionary idAvatarMap) { List teamAppearancesRaw; @@ -220,9 +232,10 @@ internal sealed partial class HutaoCache : IHutaoCache teamAppearancesRaw = await hutaoService.GetTeamAppearancesAsync().ConfigureAwait(false); } - TeamAppearances = teamAppearancesRaw.OrderByDescending(t => t.Floor).Select(team => new TeamAppearanceView(team, idAvatarMap)).ToList(); + TeamAppearances = teamAppearancesRaw.SortByDescending(t => t.Floor).SelectList(team => new TeamAppearanceView(team, idAvatarMap)); } + [SuppressMessage("", "SH003")] private async Task OverviewAsync() { using (IServiceScope scope = serviceProvider.CreateScope()) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs index fa60cea2..42ca5bcf 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoService.cs @@ -108,8 +108,6 @@ internal sealed partial class HutaoService : IHutaoService await appDbContext.ObjectCache.AddAndSaveAsync(new() { Key = key, - - // We hold the cache for 4 hours ExpireTime = DateTimeOffset.Now.Add(CacheExpireTime), Value = JsonSerializer.Serialize(data, options), }).ConfigureAwait(false); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs index 53f13b5f..2dc82229 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs @@ -86,7 +86,7 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions DateTimeOffset.Now; GachaLogExpireAt = string.Format(Regex.Unescape(SH.ServiceHutaoUserGachaLogExpiredAt), userInfo.GachaLogExpireAt); + IsCloudServiceAllowed = IsLicensedDeveloper || userInfo.GachaLogExpireAt > DateTimeOffset.Now; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index c24a6729..c2d0b685 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -97,11 +97,8 @@ - - - @@ -227,11 +224,8 @@ - - - diff --git a/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml b/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml index 87d3ade6..b1603e43 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml @@ -6,6 +6,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mxi="using:Microsoft.Xaml.Interactivity" xmlns:shcb="using:Snap.Hutao.Control.Behavior" + xmlns:shci="using:Snap.Hutao.Control.Image" xmlns:shvc="using:Snap.Hutao.View.Control" xmlns:shvd="using:Snap.Hutao.ViewModel.DailyNote" Padding="0" @@ -75,7 +76,7 @@ - + - +