From 0b71053bf99e07b575d949dc9f97fe91c0546f13 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Tue, 2 Apr 2024 16:55:53 +0800 Subject: [PATCH] backup&restore game config.ini --- .../Core/RuntimeOptionsExtension.cs | 8 +++-- .../BackgroundImage/BackgroundImageService.cs | 1 - .../GameChannelOptionsService.cs | 8 +++++ .../GameConfigurationFileService.cs | 34 +++++++++++++++++++ .../IGameConfigurationFileService.cs | 11 ++++++ ...aunchExecutionEnsureGameResourceHandler.cs | 4 +++ .../Service/Game/Package/PackageConverter.cs | 2 +- .../PackageConverterFileSystemContext.cs | 4 +-- 8 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameConfigurationFileService.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/IGameConfigurationFileService.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Core/RuntimeOptionsExtension.cs b/src/Snap.Hutao/Snap.Hutao/Core/RuntimeOptionsExtension.cs index 71fb4726..acc10562 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/RuntimeOptionsExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/RuntimeOptionsExtension.cs @@ -16,11 +16,15 @@ internal static class RuntimeOptionsExtension public static string GetDataFolderServerCacheFolder(this RuntimeOptions options) { - return Path.Combine(options.DataFolder, "ServerCache"); + string directory = Path.Combine(options.DataFolder, "ServerCache"); + Directory.CreateDirectory(directory); + return directory; } public static string GetDataFolderBackgroundFolder(this RuntimeOptions options) { - return Path.Combine(options.DataFolder, "Background"); + string directory = Path.Combine(options.DataFolder, "Background"); + Directory.CreateDirectory(directory); + return directory; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/BackgroundImage/BackgroundImageService.cs b/src/Snap.Hutao/Snap.Hutao/Service/BackgroundImage/BackgroundImageService.cs index 515531b6..cf68e715 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/BackgroundImage/BackgroundImageService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/BackgroundImage/BackgroundImageService.cs @@ -88,7 +88,6 @@ internal sealed partial class BackgroundImageService : IBackgroundImageService if (currentBackgroundPathSet is not { Count: > 0 }) { string backgroundFolder = runtimeOptions.GetDataFolderBackgroundFolder(); - Directory.CreateDirectory(backgroundFolder); currentBackgroundPathSet = Directory .GetFiles(backgroundFolder, "*.*", SearchOption.AllDirectories) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameChannelOptionsService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameChannelOptionsService.cs index c4d9739a..1cae7773 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameChannelOptionsService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameChannelOptionsService.cs @@ -11,6 +11,7 @@ namespace Snap.Hutao.Service.Game.Configuration; [Injection(InjectAs.Singleton, typeof(IGameChannelOptionsService))] internal sealed partial class GameChannelOptionsService : IGameChannelOptionsService { + private readonly IGameConfigurationFileService gameConfigurationFileService; private readonly LaunchOptions launchOptions; public ChannelOptions GetChannelOptions() @@ -22,6 +23,13 @@ internal sealed partial class GameChannelOptionsService : IGameChannelOptionsSer bool isOversea = LaunchScheme.ExecutableIsOversea(gameFileSystem.GameFileName); + if (!File.Exists(gameFileSystem.GameConfigFilePath)) + { + // Try restore the configuration file if it does not exist + // The configuration file may be deleted by a incompatible launcher + gameConfigurationFileService.Restore(gameFileSystem.GameConfigFilePath); + } + if (!File.Exists(gameFileSystem.GameConfigFilePath)) { return ChannelOptions.ConfigurationFileNotFound(gameFileSystem.GameConfigFilePath); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameConfigurationFileService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameConfigurationFileService.cs new file mode 100644 index 00000000..73a91444 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/GameConfigurationFileService.cs @@ -0,0 +1,34 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Core; +using System.IO; + +namespace Snap.Hutao.Service.Game.Configuration; + +[ConstructorGenerated] +[Injection(InjectAs.Singleton, typeof(IGameConfigurationFileService))] +internal sealed partial class GameConfigurationFileService : IGameConfigurationFileService +{ + private const string ConfigurationFileName = "config.ini"; + private readonly RuntimeOptions runtimeOptions; + + public void Backup(string source) + { + if (File.Exists(source)) + { + string serverCacheFolder = runtimeOptions.GetDataFolderServerCacheFolder(); + File.Copy(source, Path.Combine(serverCacheFolder, ConfigurationFileName), true); + } + } + + public void Restore(string destination) + { + string serverCacheFolder = runtimeOptions.GetDataFolderServerCacheFolder(); + string source = Path.Combine(serverCacheFolder, ConfigurationFileName); + if (File.Exists(source)) + { + File.Copy(source, destination, true); + } + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/IGameConfigurationFileService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/IGameConfigurationFileService.cs new file mode 100644 index 00000000..2efff373 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Configuration/IGameConfigurationFileService.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Service.Game.Configuration; + +internal interface IGameConfigurationFileService +{ + void Backup(string source); + + void Restore(string destination); +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameResourceHandler.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameResourceHandler.cs index 9ed8ad27..dd717a98 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameResourceHandler.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameResourceHandler.cs @@ -7,6 +7,7 @@ using Snap.Hutao.Core.Setting; using Snap.Hutao.Factory.ContentDialog; using Snap.Hutao.Factory.Progress; using Snap.Hutao.Model.Intrinsic; +using Snap.Hutao.Service.Game.Configuration; using Snap.Hutao.Service.Game.Package; using Snap.Hutao.View.Dialog; using Snap.Hutao.Web.Hoyolab.SdkStatic.Hk4e.Launcher; @@ -42,6 +43,9 @@ internal sealed class LaunchExecutionEnsureGameResourceHandler : ILaunchExecutio return; } + // Backup config file, in order to prevent a incompatible launcher to delete it. + context.ServiceProvider.GetRequiredService().Backup(gameFileSystem.GameConfigFilePath); + await context.TaskContext.SwitchToMainThreadAsync(); context.UpdateGamePathEntry(); } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs index 871dfaeb..d7401fc4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs @@ -59,7 +59,7 @@ internal sealed partial class PackageConverter string scatteredFilesUrl = gameResource.Game.Latest.DecompressedPath; string pkgVersionUrl = $"{scatteredFilesUrl}/{PackageVersion}"; - PackageConverterFileSystemContext context = new(targetScheme.IsOversea, runtimeOptions.DataFolder, gameFolder, scatteredFilesUrl); + PackageConverterFileSystemContext context = new(targetScheme.IsOversea, runtimeOptions.GetDataFolderServerCacheFolder(), gameFolder, scatteredFilesUrl); // Step 1 progress.Report(new(SH.ServiceGamePackageRequestPackageVerion)); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverterFileSystemContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverterFileSystemContext.cs index eb92df62..da787964 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverterFileSystemContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverterFileSystemContext.cs @@ -22,10 +22,10 @@ internal readonly struct PackageConverterFileSystemContext public readonly string ScatteredFilesUrl; public readonly string PkgVersionUrl; - public PackageConverterFileSystemContext(bool isTargetOversea, string dataFolder, string gameFolder, string scatteredFilesUrl) + public PackageConverterFileSystemContext(bool isTargetOversea, string serverCacheFolder, string gameFolder, string scatteredFilesUrl) { GameFolder = gameFolder; - ServerCacheFolder = Path.Combine(dataFolder, "ServerCache"); + ServerCacheFolder = serverCacheFolder; string serverCacheOversea = Path.Combine(ServerCacheFolder, "Oversea"); string serverCacheChinese = Path.Combine(ServerCacheFolder, "Chinese");