diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml index 4237308b..5ee6d30c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Control/Theme/Uri.xaml @@ -31,4 +31,5 @@ https://api.snapgenshin.com/static/raw/EmotionIcon/UI_EmotionIcon250.png https://api.snapgenshin.com/static/raw/EmotionIcon/UI_EmotionIcon272.png https://api.snapgenshin.com/static/raw/EmotionIcon/UI_EmotionIcon293.png + https://api.snapgenshin.com/static/raw/EmotionIcon/UI_EmotionIcon445.png diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/Throttler.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/Throttler.cs deleted file mode 100644 index 1b12e79e..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/Throttler.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using System.Collections.Concurrent; -using System.Runtime.CompilerServices; - -namespace Snap.Hutao.Core.Threading; - -internal sealed class Throttler -{ - private readonly ConcurrentDictionary methodSemaphoreMap = new(); - - public ValueTask ThrottleAsync(CancellationToken token = default, [CallerMemberName] string callerName = default!, [CallerLineNumber] int callerLine = 0) - { - string key = $"{callerName}L{callerLine}"; - SemaphoreSlim semaphore = methodSemaphoreMap.GetOrAdd(key, name => new SemaphoreSlim(1)); - return semaphore.EnterAsync(token); - } -} \ 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 83d23e38..7d244dee 100644 --- a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest +++ b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest @@ -12,7 +12,7 @@ + Version="1.9.1.0" /> Snap Hutao diff --git a/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest b/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest index a1893fe0..375da126 100644 --- a/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest +++ b/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest @@ -12,7 +12,7 @@ + Version="1.9.1.0" /> Snap Hutao Dev diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 5b3a21e5..b81f3242 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -2144,6 +2144,9 @@ 预下载 + + 选择游戏路径 + 该账号尚未绑定实时便笺通知 UID diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs index 1112ef38..2abc4b4c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs @@ -77,7 +77,7 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient entryList = await dailyNoteDbService.GetDailyNoteEntryIncludeUserListAsync().ConfigureAwait(false); entryList.ForEach(entry => { entry.UserGameRole = userService.GetUserGameRoleByUid(entry.Uid); }); - entries = new(entryList); + entries = entryList.ToObservableCollection(); } return entries; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Update/UpdateService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Update/UpdateService.cs index ad1b931d..502b5128 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Update/UpdateService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Update/UpdateService.cs @@ -49,7 +49,7 @@ internal sealed partial class UpdateService : IUpdateService progress.Report(new(versionInformation.Version.ToString(), 0, 0)); - if (versionInformation.Sha256 is not { } sha256) + if (versionInformation.Sha256 is not { Length: > 0 } sha256) { return false; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UserCollectionService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UserCollectionService.cs index 6ea7d8ff..76c6f72c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/UserCollectionService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/UserCollectionService.cs @@ -14,7 +14,7 @@ namespace Snap.Hutao.Service.User; [ConstructorGenerated] [Injection(InjectAs.Singleton, typeof(IUserCollectionService))] -internal sealed partial class UserCollectionService : IUserCollectionService +internal sealed partial class UserCollectionService : IUserCollectionService, IDisposable { private readonly ScopedDbCurrent dbCurrent; private readonly IUserInitializationService userInitializationService; @@ -22,7 +22,7 @@ internal sealed partial class UserCollectionService : IUserCollectionService private readonly ITaskContext taskContext; private readonly IMessenger messenger; - private readonly Throttler throttler = new(); + private readonly SemaphoreSlim throttler = new(1); private ObservableCollection? userCollection; private Dictionary? midUserMap; @@ -38,7 +38,9 @@ internal sealed partial class UserCollectionService : IUserCollectionService public async ValueTask> GetUserCollectionAsync() { - using (await throttler.ThrottleAsync().ConfigureAwait(false)) + // Force run in background thread, otherwise will cause reentrance + await Task.CompletedTask.ConfigureAwait(ConfigureAwaitOptions.ForceYielding); + using (await throttler.EnterAsync().ConfigureAwait(false)) { if (userCollection is null) { @@ -131,17 +133,7 @@ internal sealed partial class UserCollectionService : IUserCollectionService return default; } - try - { - return uidUserGameRoleMap[uid]; - } - catch (InvalidOperationException) - { - // Sequence contains more than one matching element - // TODO: return a specialize UserGameRole to indicate error - } - - return default; + return uidUserGameRoleMap.GetValueOrDefault(uid); } public bool TryGetUserByMid(string mid, [NotNullWhen(true)] out BindingUser? user) @@ -186,4 +178,9 @@ internal sealed partial class UserCollectionService : IUserCollectionService ArgumentNullException.ThrowIfNull(newUser.UserInfo); return new(UserOptionResult.Added, newUser.UserInfo.Uid); } + + public void Dispose() + { + throttler.Dispose(); + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml index bb0170b4..f552da5f 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml @@ -13,6 +13,7 @@ xmlns:shcb="using:Snap.Hutao.Control.Behavior" xmlns:shccs="using:Snap.Hutao.Control.Collection.Selector" xmlns:shch="using:Snap.Hutao.Control.Helper" + xmlns:shci="using:Snap.Hutao.Control.Image" xmlns:shcm="using:Snap.Hutao.Control.Markup" xmlns:shvc="using:Snap.Hutao.View.Control" xmlns:shvg="using:Snap.Hutao.ViewModel.Game" @@ -346,10 +347,20 @@ + + - + Visibility="{Binding UserOptions.IsLicensedDeveloper, Converter={StaticResource BoolToVisibilityConverter}}">