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 + 后期处理后,授权使用。 + + + + +