From 4de01d2f6223346c7113b7bd02de7cc2c313ea19 Mon Sep 17 00:00:00 2001 From: x3zF Love U Date: Wed, 15 Mar 2023 19:04:55 +0800 Subject: [PATCH 1/2] add 'Enabled Advanced' option to setting page --- .../Snap.Hutao/Model/Entity/SettingEntry.cs | 5 +++ .../Resource/Localization/SH.Designer.cs | 36 +++++++++++++++++++ .../Snap.Hutao/Resource/Localization/SH.resx | 12 +++++++ .../Snap.Hutao/Service/AppOptions.cs | 36 +++++++++++++++++++ .../Cultivation/ICultivationService.cs | 1 - .../Snap.Hutao/Service/Game/GameService.cs | 6 ++-- .../Snap.Hutao/View/Page/LaunchGamePage.xaml | 10 ++++-- .../Snap.Hutao/View/Page/SettingPage.xaml | 26 ++++++++++++++ .../ViewModel/Game/LaunchGameViewModel.cs | 6 ++++ .../Snap.Hutao/ViewModel/SettingViewModel.cs | 6 ++++ 10 files changed, 138 insertions(+), 6 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs index 6bda9d53..ae6b3da4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs @@ -31,6 +31,11 @@ internal sealed class SettingEntry /// public const string SystemBackdropType = "SystemBackdropType"; + /// + /// 启用高级功能 + /// + public const string EnabledAdvanced = "EnabledAdvanced"; + /// /// 实时便笺刷新时间 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index 737cbf0c..a86854c6 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -3561,6 +3561,15 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 启用「启动游戏-高级功能」的任意功能 您需要在设置里解锁它 的本地化字符串。 + /// + internal static string ViewPageLaunchGameAdvancedFeatureElevationHint { + get { + return ResourceManager.GetString("ViewPageLaunchGameAdvancedFeatureElevationHint", resourceCulture); + } + } + /// /// 查找类似 高级功能 的本地化字符串。 /// @@ -4191,6 +4200,33 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 的本地化字符串。 + /// + internal static string ViewPageSettingEnabledAdvancedDescription { + get { + return ResourceManager.GetString("ViewPageSettingEnabledAdvancedDescription", resourceCulture); + } + } + + /// + /// 查找类似 启动高级功能 的本地化字符串。 + /// + internal static string ViewPageSettingEnabledAdvancedHeader { + get { + return ResourceManager.GetString("ViewPageSettingEnabledAdvancedHeader", resourceCulture); + } + } + + /// + /// 查找类似 您解锁了「启动游戏-高级功能」!其含有潜在违反原神服务条款的风险,一旦启用,您将咨询承担可能的后果。慎重选择! 的本地化字符串。 + /// + internal static string ViewPageSettingFeaturesDangerousHint { + get { + return ResourceManager.GetString("ViewPageSettingFeaturesDangerousHint", resourceCulture); + } + } + /// /// 查找类似 Github 上反馈的问题会优先处理 的本地化字符串。 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 29cf45c9..e4d44c19 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -1284,6 +1284,9 @@ 启动游戏 + + 启用「启动游戏-高级功能」的任意功能 您需要在设置里解锁它 + 高级功能 @@ -1494,6 +1497,15 @@ 显示 + + 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 + + + 启动高级功能 + + + 您解锁了「启动游戏-高级功能」!其含有潜在违反原神服务条款的风险,一旦启用,您将咨询承担可能的后果。慎重选择! + Github 上反馈的问题会优先处理 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index fa0dd172..4e69b0ac 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -6,6 +6,7 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Snap.Hutao.Core.Database; +using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Database; using System.Globalization; @@ -24,6 +25,7 @@ internal sealed class AppOptions : ObservableObject, IOptions private bool? isEmptyHistoryWishVisible; private Core.Windowing.BackdropType? backdropType; private CultureInfo? currentCulture; + private bool? enabledAdvanced; /// /// 构造一个新的应用程序选项 @@ -171,6 +173,40 @@ internal sealed class AppOptions : ObservableObject, IOptions } } + /// + /// 是否启用高级功能 + /// + public bool EnabledAdvanced + { + get + { + if (enabledAdvanced == null) + { + using (IServiceScope scope = serviceScopeFactory.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + string? value = appDbContext.Settings.SingleOrDefault(e => e.Key == SettingEntry.EnabledAdvanced)?.Value; + _ = Activation.GetElevated() == true ? enabledAdvanced = value != null && bool.Parse(value) : enabledAdvanced = false; + } + } + + return enabledAdvanced.Value; + } + + set + { + if (SetProperty(ref enabledAdvanced, value)) + { + using (IServiceScope scope = serviceScopeFactory.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + appDbContext.Settings.ExecuteDeleteWhere(e => e.Key == SettingEntry.EnabledAdvanced); + appDbContext.Settings.AddAndSave(new(SettingEntry.EnabledAdvanced, value.ToString())); + } + } + } + } + /// public AppOptions Value { get => this; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs index a6ee8b77..b7fbc887 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs @@ -1,7 +1,6 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Model.Binding.Cultivation; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Primitive; using Snap.Hutao.Model.Metadata.Item; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs index ad1e3071..a8b1affe 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs @@ -301,16 +301,16 @@ internal sealed class GameService : IGameService try { Interlocked.Increment(ref runningGamesCounter); - bool isElevated = Activation.GetElevated(); + bool isPassCheck = Activation.GetElevated() == appOptions.EnabledAdvanced ? true : false; game.Start(); - if (isElevated && launchOptions.MultipleInstances) + if (isPassCheck && launchOptions.MultipleInstances) { ProcessInterop.DisableProtection(game, gamePath); } - if (isElevated && launchOptions.UnlockFps) + if (isPassCheck && launchOptions.UnlockFps) { await ProcessInterop.UnlockFpsAsync(game, launchOptions).ConfigureAwait(false); } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml index 05972186..af0e8b08 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml @@ -251,12 +251,18 @@ - + + + + + + + + + + + (); memoryCache = serviceProvider.GetRequiredService(); Options = serviceProvider.GetRequiredService(); + AppOptions = serviceProvider.GetRequiredService(); this.serviceProvider = serviceProvider; LaunchCommand = new AsyncRelayCommand(LaunchAsync, AsyncRelayCommandOptions.AllowConcurrentExecutions); @@ -100,6 +101,11 @@ internal sealed class LaunchGameViewModel : Abstraction.ViewModel /// public LaunchOptions Options { get; } + /// + /// 应用选项 + /// + public AppOptions AppOptions { get; } + /// /// 游戏资源 /// diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs index 1484b34e..2af84939 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs @@ -8,6 +8,7 @@ using Microsoft.Windows.AppLifecycle; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.IO; using Snap.Hutao.Core.IO.DataTransfer; +using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Core.Setting; using Snap.Hutao.Core.Windowing; using Snap.Hutao.Factory.Abstraction; @@ -162,6 +163,11 @@ internal sealed class SettingViewModel : Abstraction.ViewModel /// public ExperimentalFeaturesViewModel Experimental { get; } + /// + /// 是否提权 + /// + public bool IsElevated { get => Activation.GetElevated(); } + /// /// 设置游戏路径命令 /// From 0cd6bf95a99a52e433ed0366d1b5c85ce8d4cd20 Mon Sep 17 00:00:00 2001 From: x3zF Love U Date: Wed, 15 Mar 2023 19:12:41 +0800 Subject: [PATCH 2/2] change the field name of 'EnabledAdvanced' --- .../Snap.Hutao/Model/Entity/SettingEntry.cs | 2 +- .../Resource/Localization/SH.Designer.cs | 8 ++++---- .../Snap.Hutao/Resource/Localization/SH.resx | 4 ++-- .../Snap.Hutao/Service/AppOptions.cs | 18 +++++++++--------- .../Snap.Hutao/Service/Game/GameService.cs | 2 +- .../Snap.Hutao/View/Page/LaunchGamePage.xaml | 6 +++--- .../Snap.Hutao/View/Page/SettingPage.xaml | 8 ++++---- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs index ae6b3da4..b57a6458 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs @@ -34,7 +34,7 @@ internal sealed class SettingEntry /// /// 启用高级功能 /// - public const string EnabledAdvanced = "EnabledAdvanced"; + public const string IsAdvancedLaunchOptionsEnabled = "IsAdvancedLaunchOptionsEnabled"; /// /// 实时便笺刷新时间 diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index a86854c6..baecfbb4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -4203,18 +4203,18 @@ namespace Snap.Hutao.Resource.Localization { /// /// 查找类似 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 的本地化字符串。 /// - internal static string ViewPageSettingEnabledAdvancedDescription { + internal static string ViewPageSettingIsAdvancedLaunchOptionsEnabledDescription { get { - return ResourceManager.GetString("ViewPageSettingEnabledAdvancedDescription", resourceCulture); + return ResourceManager.GetString("ViewPageSettingIsAdvancedLaunchOptionsEnabledDescription", resourceCulture); } } /// /// 查找类似 启动高级功能 的本地化字符串。 /// - internal static string ViewPageSettingEnabledAdvancedHeader { + internal static string ViewPageSettingIsAdvancedLaunchOptionsEnabledHeader { get { - return ResourceManager.GetString("ViewPageSettingEnabledAdvancedHeader", resourceCulture); + return ResourceManager.GetString("ViewPageSettingIsAdvancedLaunchOptionsEnabledHeader", resourceCulture); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index e4d44c19..16e664c4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -1497,10 +1497,10 @@ 显示 - + 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 - + 启动高级功能 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index 4e69b0ac..5632a210 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -25,7 +25,7 @@ internal sealed class AppOptions : ObservableObject, IOptions private bool? isEmptyHistoryWishVisible; private Core.Windowing.BackdropType? backdropType; private CultureInfo? currentCulture; - private bool? enabledAdvanced; + private bool? isAdvancedLaunchOptionsEnabled; /// /// 构造一个新的应用程序选项 @@ -176,32 +176,32 @@ internal sealed class AppOptions : ObservableObject, IOptions /// /// 是否启用高级功能 /// - public bool EnabledAdvanced + public bool IsAdvancedLaunchOptionsEnabled { get { - if (enabledAdvanced == null) + if (isAdvancedLaunchOptionsEnabled == null) { using (IServiceScope scope = serviceScopeFactory.CreateScope()) { AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); - string? value = appDbContext.Settings.SingleOrDefault(e => e.Key == SettingEntry.EnabledAdvanced)?.Value; - _ = Activation.GetElevated() == true ? enabledAdvanced = value != null && bool.Parse(value) : enabledAdvanced = false; + string? value = appDbContext.Settings.SingleOrDefault(e => e.Key == SettingEntry.IsAdvancedLaunchOptionsEnabled)?.Value; + _ = Activation.GetElevated() == true ? isAdvancedLaunchOptionsEnabled = value != null && bool.Parse(value) : IsAdvancedLaunchOptionsEnabled = false; } } - return enabledAdvanced.Value; + return isAdvancedLaunchOptionsEnabled.Value; } set { - if (SetProperty(ref enabledAdvanced, value)) + if (SetProperty(ref isAdvancedLaunchOptionsEnabled, value)) { using (IServiceScope scope = serviceScopeFactory.CreateScope()) { AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); - appDbContext.Settings.ExecuteDeleteWhere(e => e.Key == SettingEntry.EnabledAdvanced); - appDbContext.Settings.AddAndSave(new(SettingEntry.EnabledAdvanced, value.ToString())); + appDbContext.Settings.ExecuteDeleteWhere(e => e.Key == SettingEntry.IsAdvancedLaunchOptionsEnabled); + appDbContext.Settings.AddAndSave(new(SettingEntry.IsAdvancedLaunchOptionsEnabled, value.ToString())); } } } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs index a8b1affe..8dfa7c1b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs @@ -301,7 +301,7 @@ internal sealed class GameService : IGameService try { Interlocked.Increment(ref runningGamesCounter); - bool isPassCheck = Activation.GetElevated() == appOptions.EnabledAdvanced ? true : false; + bool isPassCheck = Activation.GetElevated() == appOptions.IsAdvancedLaunchOptionsEnabled ? true : false; game.Start(); diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml index af0e8b08..2c285939 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml @@ -251,16 +251,16 @@ - +