diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png
index cb6b3afd..70434c08 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png
index e08dacb2..63bb65d8 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png
index 7965f313..81c7eb77 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png
index 5dd40c80..8392febe 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
index f44a5c8d..03fdba5a 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png b/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png
index f0a29d4f..86d1cdd1 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png and b/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png
index 7b1d7f2f..083b8ad3 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Abstraction/IDeconstructable.cs b/src/Snap.Hutao/Snap.Hutao/Core/Abstraction/IDeconstructable.cs
new file mode 100644
index 00000000..ccc61c1b
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Abstraction/IDeconstructable.cs
@@ -0,0 +1,19 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Core.Abstraction;
+
+///
+/// 指示该类可以解构为元组
+///
+/// 元组的第一个类型
+/// 元组的第二个类型
+internal interface IDeconstructable
+{
+ ///
+ /// 解构
+ ///
+ /// 第一个元素
+ /// 第二个元素
+ void Deconstruct(out T1 t1, out T2 t2);
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Abstraction/ISupportValidation.cs b/src/Snap.Hutao/Snap.Hutao/Core/Abstraction/ISupportValidation.cs
index 3ec1b408..d2dada6c 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Abstraction/ISupportValidation.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Abstraction/ISupportValidation.cs
@@ -13,4 +13,4 @@ internal interface ISupportValidation
///
/// 当前数据是否有效
public bool Validate();
-}
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Logging/DatebaseLogger.cs b/src/Snap.Hutao/Snap.Hutao/Core/Logging/DatebaseLogger.cs
index c961e1ac..55f15da6 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Logging/DatebaseLogger.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Logging/DatebaseLogger.cs
@@ -66,7 +66,7 @@ internal sealed partial class DatebaseLogger : ILogger
///
/// An empty scope without any logic
///
- private class NullScope : IDisposable
+ private struct NullScope : IDisposable
{
public NullScope()
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/Result.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/ValueResult.cs
similarity index 68%
rename from src/Snap.Hutao/Snap.Hutao/Core/Threading/Result.cs
rename to src/Snap.Hutao/Snap.Hutao/Core/Threading/ValueResult.cs
index dd6c321f..6555fe9b 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/Result.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/ValueResult.cs
@@ -1,38 +1,41 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
+using Snap.Hutao.Core.Abstraction;
+
namespace Snap.Hutao.Core.Threading;
///
/// 用于包装异步操作的结果
+/// 结构类型,在栈上分配
///
-///
-///
-public record Result
+/// 结果类型
+/// 值类型
+public readonly struct ValueResult : IDeconstructable
where TResult : notnull
where TValue : notnull
{
+ ///
+ /// 是否成功
+ ///
+ public readonly TResult IsOk;
+
+ ///
+ /// 值
+ ///
+ public readonly TValue Value;
+
///
/// 构造一个新的结果
///
/// 是否成功
/// 值
- public Result(TResult isOk, TValue value)
+ public ValueResult(TResult isOk, TValue value)
{
IsOk = isOk;
Value = value;
}
- ///
- /// 是否成功
- ///
- public TResult IsOk { get; }
-
- ///
- /// 值
- ///
- public TValue Value { get; }
-
///
/// 用于元组析构
///
@@ -43,4 +46,4 @@ public record Result
isOk = IsOk;
value = Value;
}
-}
+}
\ 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 e3e368f4..c7655f73 100644
--- a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest
+++ b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest
@@ -9,7 +9,7 @@
+ Version="1.0.32.0" />
胡桃
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs
index a1928fa7..df56d973 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogService.cs
@@ -9,4 +9,4 @@ namespace Snap.Hutao.Service.GachaLog;
internal class GachaLogService
{
-}
\ No newline at end of file
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/GachaLogUrlWebCacheProvider.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/GachaLogUrlWebCacheProvider.cs
new file mode 100644
index 00000000..c67d6ab2
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/GachaLogUrlWebCacheProvider.cs
@@ -0,0 +1,19 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Core.Threading;
+
+namespace Snap.Hutao.Service.GachaLog;
+
+///
+/// 浏览器缓存方法
+///
+[Injection(InjectAs.Transient, typeof(IGachaLogUrlProvider))]
+internal class GachaLogUrlWebCacheProvider : IGachaLogUrlProvider
+{
+ ///
+ public async Task> GetQueryAsync()
+ {
+ throw Must.NeverHappen();
+ }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/IGachaLogUrlProvider.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/IGachaLogUrlProvider.cs
new file mode 100644
index 00000000..20a8756d
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/IGachaLogUrlProvider.cs
@@ -0,0 +1,18 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Core.Threading;
+
+namespace Snap.Hutao.Service.GachaLog;
+
+///
+/// 祈愿记录Url提供器
+///
+public interface IGachaLogUrlProvider
+{
+ ///
+ /// 异步获取包含验证密钥的查询语句
+ ///
+ /// 包含验证密钥的查询语句
+ Task> GetQueryAsync();
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/IGameLocator.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/IGameLocator.cs
new file mode 100644
index 00000000..dc1e39eb
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/IGameLocator.cs
@@ -0,0 +1,26 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Core.Threading;
+
+namespace Snap.Hutao.Service.Game.Locator;
+
+///
+/// 游戏位置定位器
+///
+internal interface IGameLocator
+{
+ ///
+ /// 异步获取游戏位置
+ /// 路径应当包含游戏文件名称
+ ///
+ /// 游戏位置
+ Task> LocateGamePathAsync();
+
+ ///
+ /// 异步获取游戏启动器位置
+ /// 路径应当包含启动器文件名称
+ ///
+ /// 游戏启动器位置
+ Task> LocateLauncherPathAsync();
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/ManualGameLocator.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/ManualGameLocator.cs
new file mode 100644
index 00000000..c7c0b370
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/ManualGameLocator.cs
@@ -0,0 +1,56 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Core.Threading;
+using Snap.Hutao.Factory.Abstraction;
+using Windows.Storage;
+using Windows.Storage.Pickers;
+
+namespace Snap.Hutao.Service.Game.Locator;
+
+///
+/// 手动模式
+///
+internal class ManualGameLocator : IGameLocator
+{
+ private readonly IPickerFactory pickerFactory;
+
+ ///
+ /// 构造一个新的手动模式提供器
+ ///
+ /// 选择器工厂
+ public ManualGameLocator(IPickerFactory pickerFactory)
+ {
+ this.pickerFactory = pickerFactory;
+ }
+
+ ///
+ public Task> LocateGamePathAsync()
+ {
+ return LocateInternalAsync("YuanShen.exe");
+ }
+
+ ///
+ public Task> LocateLauncherPathAsync()
+ {
+ return LocateInternalAsync("launcher.exe");
+ }
+
+ private async Task> LocateInternalAsync(string fileName)
+ {
+ FileOpenPicker picker = pickerFactory.GetFileOpenPicker();
+ picker.FileTypeFilter.Add(".exe");
+ picker.SuggestedStartLocation = PickerLocationId.ComputerFolder;
+
+ if (await picker.PickSingleFileAsync() is StorageFile file)
+ {
+ string path = file.Path;
+ if (path.Contains(fileName))
+ {
+ return new(true, path);
+ }
+ }
+
+ return new(false, null!);
+ }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/RegistryLauncherLocator.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/RegistryLauncherLocator.cs
new file mode 100644
index 00000000..c25916d7
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Locator/RegistryLauncherLocator.cs
@@ -0,0 +1,51 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.Win32;
+using Snap.Hutao.Core.Threading;
+using System.IO;
+
+namespace Snap.Hutao.Service.Game.Locator;
+
+///
+/// 注册表启动器位置定位器
+///
+internal class RegistryLauncherLocator : IGameLocator
+{
+ ///
+ public Task> LocateGamePathAsync()
+ {
+ return Task.FromResult(LocateInternal("InstallPath", "YuanShen.exe"));
+ }
+
+ ///
+ public Task> LocateLauncherPathAsync()
+ {
+ return Task.FromResult(LocateInternal("DisplayIcon"));
+ }
+
+ private static ValueResult LocateInternal(string key, string? combine = null)
+ {
+ RegistryKey? uninstallKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\原神");
+ if (uninstallKey != null)
+ {
+ if (uninstallKey.GetValue(key) is string path)
+ {
+ if (!string.IsNullOrEmpty(combine))
+ {
+ path = Path.Combine(combine);
+ }
+
+ return new(true, path);
+ }
+ else
+ {
+ return new(false, null!);
+ }
+ }
+ else
+ {
+ return new(false, null!);
+ }
+ }
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs
index 04998ea7..afc349ac 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs
+++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs
@@ -26,7 +26,7 @@ public sealed partial class AchievementArchiveCreateDialog : ContentDialog
/// 获取输入的字符串
///
/// 输入的结果
- public async Task> GetInputAsync()
+ public async Task> GetInputAsync()
{
ContentDialogResult result = await ShowAsync();
string text = InputText.Text ?? string.Empty;
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs
index c9694d7f..3c136174 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs
+++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs
@@ -42,11 +42,11 @@ public sealed partial class AchievementImportDialog : ContentDialog
/// 异步获取导入选项
///
/// 导入选项
- public async Task> GetImportOptionAsync()
+ public async Task> GetImportOptionAsync()
{
ContentDialogResult result = await ShowAsync();
ImportOption option = (ImportOption)ImportModeSelector.SelectedIndex;
- return new Result(result == ContentDialogResult.Primary, option);
+ return new(result == ContentDialogResult.Primary, option);
}
}
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs
index 49209b54..0aed88c4 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs
+++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs
@@ -26,7 +26,7 @@ public sealed partial class UserDialog : ContentDialog
/// 获取输入的Cookie
///
/// 输入的结果
- public async Task> GetInputCookieAsync()
+ public async Task> GetInputCookieAsync()
{
ContentDialogResult result = await ShowAsync();
string cookie = InputText.Text;
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
index d2e29d0c..5a0c8d72 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
@@ -19,8 +19,32 @@
-
+
+
+
+
+
+
+
+
+ 胡桃 图标由
+ LOFTER@夙夜
+ 纸绘,并由
+ DGP Studio
+ 后期处理后,授权使用。
+
+
+
+
+