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}}">
+