Create configuration project and performance settings

This commit is contained in:
UrbanCMC 2023-08-17 19:14:58 +02:00
parent 77f6b8c9cb
commit 7350b632f7
7 changed files with 91 additions and 26 deletions

View File

@ -0,0 +1,29 @@
using System.Text.Json.Serialization;
namespace Wabbajack.Configuration;
public class MainSettings
{
private const int SettingsVersion = 1;
[JsonInclude]
private int CurrentSettingsVersion { get; set; }
public PerformanceSettings PerformanceSettings { get; set; } = new();
public bool Upgrade()
{
if (CurrentSettingsVersion == SettingsVersion)
{
return false;
}
if (CurrentSettingsVersion < 1)
{
PerformanceSettings.MaximumMemoryPerDownloadThreadMb = -1;
}
CurrentSettingsVersion = SettingsVersion;
return true;
}
}

View File

@ -0,0 +1,6 @@
namespace Wabbajack.Configuration;
public class PerformanceSettings
{
public int MaximumMemoryPerDownloadThreadMb { get; set; }
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -13,6 +13,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Wabbajack.Configuration\Wabbajack.Configuration.csproj" />
<ProjectReference Include="..\Wabbajack.Downloaders.Interfaces\Wabbajack.Downloaders.Interfaces.csproj" /> <ProjectReference Include="..\Wabbajack.Downloaders.Interfaces\Wabbajack.Downloaders.Interfaces.csproj" />
<ProjectReference Include="..\Wabbajack.Hashing.xxHash64\Wabbajack.Hashing.xxHash64.csproj" /> <ProjectReference Include="..\Wabbajack.Hashing.xxHash64\Wabbajack.Hashing.xxHash64.csproj" />
<ProjectReference Include="..\Wabbajack.Networking.Http.Interfaces\Wabbajack.Networking.Http.Interfaces.csproj" /> <ProjectReference Include="..\Wabbajack.Networking.Http.Interfaces\Wabbajack.Networking.Http.Interfaces.csproj" />

View File

@ -8,15 +8,15 @@ using Wabbajack.DTOs;
using Wabbajack.DTOs.Logins; using Wabbajack.DTOs.Logins;
using Wabbajack.Networking.Http.Interfaces; using Wabbajack.Networking.Http.Interfaces;
using Wabbajack.Networking.NexusApi.DTOs; using Wabbajack.Networking.NexusApi.DTOs;
using Wabbajack.Networking.WabbajackClientApi;
using Wabbajack.RateLimiter; using Wabbajack.RateLimiter;
using ClientConfiguration = Wabbajack.Networking.WabbajackClientApi.Configuration;
namespace Wabbajack.Networking.NexusApi; namespace Wabbajack.Networking.NexusApi;
public class ProxiedNexusApi : NexusApi public class ProxiedNexusApi : NexusApi
{ {
private readonly ITokenProvider<WabbajackApiState> _apiState; private readonly ITokenProvider<WabbajackApiState> _apiState;
private readonly Configuration _wabbajackClientConfiguration; private readonly ClientConfiguration _wabbajackClientConfiguration;
public HashSet<string> ProxiedEndpoints = new() public HashSet<string> ProxiedEndpoints = new()
{ {
@ -28,7 +28,7 @@ public class ProxiedNexusApi : NexusApi
public ProxiedNexusApi(ITokenProvider<NexusApiState> apiKey, ILogger<ProxiedNexusApi> logger, HttpClient client, public ProxiedNexusApi(ITokenProvider<NexusApiState> apiKey, ILogger<ProxiedNexusApi> logger, HttpClient client,
IResource<HttpClient> limiter, IResource<HttpClient> limiter,
ApplicationInfo appInfo, JsonSerializerOptions jsonOptions, ITokenProvider<WabbajackApiState> apiState, ApplicationInfo appInfo, JsonSerializerOptions jsonOptions, ITokenProvider<WabbajackApiState> apiState,
Configuration wabbajackClientConfiguration) ClientConfiguration wabbajackClientConfiguration)
: base(apiKey, logger, client, limiter, appInfo, jsonOptions) : base(apiKey, logger, client, limiter, appInfo, jsonOptions)
{ {
_apiState = apiState; _apiState = apiState;

View File

@ -9,6 +9,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Wabbajack.Compiler; using Wabbajack.Compiler;
using Wabbajack.Configuration;
using Wabbajack.Downloaders; using Wabbajack.Downloaders;
using Wabbajack.Downloaders.GameFile; using Wabbajack.Downloaders.GameFile;
using Wabbajack.Downloaders.VerificationCache; using Wabbajack.Downloaders.VerificationCache;
@ -79,24 +80,36 @@ public static class ServiceExtensions
? new BinaryPatchCache(s.GetRequiredService<ILogger<BinaryPatchCache>>(), s.GetService<TemporaryFileManager>()!.CreateFolder().Path) ? new BinaryPatchCache(s.GetRequiredService<ILogger<BinaryPatchCache>>(), s.GetService<TemporaryFileManager>()!.CreateFolder().Path)
: new BinaryPatchCache(s.GetRequiredService<ILogger<BinaryPatchCache>>(),KnownFolders.WabbajackAppLocal.Combine("PatchCache"))); : new BinaryPatchCache(s.GetRequiredService<ILogger<BinaryPatchCache>>(),KnownFolders.WabbajackAppLocal.Combine("PatchCache")));
service.AddSingleton<IVerificationCache>(s => service.AddSingleton<IVerificationCache>(s =>
{ {
var dtos = s.GetRequiredService<DTOSerializer>(); var dtos = s.GetRequiredService<DTOSerializer>();
return options.UseLocalCache return options.UseLocalCache
? new VerificationCache(s.GetRequiredService<ILogger<VerificationCache>>(), ? new VerificationCache(s.GetRequiredService<ILogger<VerificationCache>>(),
s.GetService<TemporaryFileManager>()!.CreateFile().Path, s.GetService<TemporaryFileManager>()!.CreateFile().Path,
TimeSpan.FromDays(1), TimeSpan.FromDays(1),
dtos) dtos)
: new VerificationCache(s.GetRequiredService<ILogger<VerificationCache>>(), : new VerificationCache(s.GetRequiredService<ILogger<VerificationCache>>(),
KnownFolders.WabbajackAppLocal.Combine("VerificationCacheV2.sqlite"), KnownFolders.WabbajackAppLocal.Combine("VerificationCacheV2.sqlite"),
TimeSpan.FromDays(1), TimeSpan.FromDays(1),
dtos); dtos);
}); });
service.AddSingleton(new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount}); service.AddSingleton(new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount});
Func<Task<(int MaxTasks, long MaxThroughput)>> GetSettings(IServiceProvider provider, string name) MainSettings GetAppSettings(IServiceProvider provider, string name)
{
var settingsManager = provider.GetService<SettingsManager>();
var settings = settingsManager!.Load<MainSettings>(name).Result;
if (settings.Upgrade())
{
settingsManager.Save("app_settings", settings).Wait();
}
return settings;
}
Func<Task<(int MaxTasks, long MaxThroughput)>> GetResourceSettings(IServiceProvider provider, string name)
{ {
return async () => return async () =>
{ {
@ -104,9 +117,9 @@ public static class ServiceExtensions
return ((int) s.MaxTasks, s.MaxThroughput); return ((int) s.MaxTasks, s.MaxThroughput);
}; };
} }
// Settings // Settings
service.AddSingleton(s => new Configuration service.AddSingleton(s => new Configuration
{ {
EncryptedDataLocation = KnownFolders.WabbajackAppLocal.Combine("encrypted"), EncryptedDataLocation = KnownFolders.WabbajackAppLocal.Combine("encrypted"),
@ -118,26 +131,27 @@ public static class ServiceExtensions
service.AddSingleton<SettingsManager>(); service.AddSingleton<SettingsManager>();
service.AddSingleton<ResourceSettingsManager>(); service.AddSingleton<ResourceSettingsManager>();
service.AddSingleton<MainSettings>(s => GetAppSettings(s, "app_settings"));
// Resources // Resources
service.AddAllSingleton<IResource, IResource<DownloadDispatcher>>(s => service.AddAllSingleton<IResource, IResource<DownloadDispatcher>>(s =>
new Resource<DownloadDispatcher>("Downloads", GetSettings(s, "Downloads"), s.GetRequiredService<CancellationToken>())); new Resource<DownloadDispatcher>("Downloads", GetResourceSettings(s, "Downloads"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<HttpClient>>(s => new Resource<HttpClient>("Web Requests", GetSettings(s, "Web Requests"), s.GetRequiredService<CancellationToken>())); service.AddAllSingleton<IResource, IResource<HttpClient>>(s => new Resource<HttpClient>("Web Requests", GetResourceSettings(s, "Web Requests"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<Context>>(s => new Resource<Context>("VFS", GetSettings(s, "VFS"), s.GetRequiredService<CancellationToken>())); service.AddAllSingleton<IResource, IResource<Context>>(s => new Resource<Context>("VFS", GetResourceSettings(s, "VFS"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<FileHashCache>>(s => service.AddAllSingleton<IResource, IResource<FileHashCache>>(s =>
new Resource<FileHashCache>("File Hashing", GetSettings(s, "File Hashing"), s.GetRequiredService<CancellationToken>())); new Resource<FileHashCache>("File Hashing", GetResourceSettings(s, "File Hashing"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<Client>>(s => service.AddAllSingleton<IResource, IResource<Client>>(s =>
new Resource<Client>("Wabbajack Client", GetSettings(s, "Wabbajack Client"), s.GetRequiredService<CancellationToken>())); new Resource<Client>("Wabbajack Client", GetResourceSettings(s, "Wabbajack Client"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<FileExtractor.FileExtractor>>(s => service.AddAllSingleton<IResource, IResource<FileExtractor.FileExtractor>>(s =>
new Resource<FileExtractor.FileExtractor>("File Extractor", GetSettings(s, "File Extractor"), s.GetRequiredService<CancellationToken>())); new Resource<FileExtractor.FileExtractor>("File Extractor", GetResourceSettings(s, "File Extractor"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<ACompiler>>(s => service.AddAllSingleton<IResource, IResource<ACompiler>>(s =>
new Resource<ACompiler>("Compiler", GetSettings(s, "Compiler"), s.GetRequiredService<CancellationToken>())); new Resource<ACompiler>("Compiler", GetResourceSettings(s, "Compiler"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<IInstaller>>(s => service.AddAllSingleton<IResource, IResource<IInstaller>>(s =>
new Resource<IInstaller>("Installer", GetSettings(s, "Installer"), s.GetRequiredService<CancellationToken>())); new Resource<IInstaller>("Installer", GetResourceSettings(s, "Installer"), s.GetRequiredService<CancellationToken>()));
service.AddAllSingleton<IResource, IResource<IUserInterventionHandler>>(s => service.AddAllSingleton<IResource, IResource<IUserInterventionHandler>>(s =>
new Resource<IUserInterventionHandler>("User Intervention", 1, token: s.GetRequiredService<CancellationToken>())); new Resource<IUserInterventionHandler>("User Intervention", 1, token: s.GetRequiredService<CancellationToken>()));
@ -154,7 +168,7 @@ public static class ServiceExtensions
service.AddAllSingleton<IHttpDownloader, SingleThreadedDownloader>(); service.AddAllSingleton<IHttpDownloader, SingleThreadedDownloader>();
service.AddSteam(); service.AddSteam();
service.AddSingleton<Client>(); service.AddSingleton<Client>();
service.AddSingleton<WriteOnlyClient>(); service.AddSingleton<WriteOnlyClient>();
service.AddBethesdaNet(); service.AddBethesdaNet();
@ -186,11 +200,11 @@ public static class ServiceExtensions
service.AddAllSingleton<IGameLocator, StubbedGameLocator>(); service.AddAllSingleton<IGameLocator, StubbedGameLocator>();
else else
service.AddAllSingleton<IGameLocator, GameLocator>(); service.AddAllSingleton<IGameLocator, GameLocator>();
// ImageLoader // ImageLoader
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
service.AddSingleton<IImageLoader, TexConvImageLoader>(); service.AddSingleton<IImageLoader, TexConvImageLoader>();
else else
service.AddSingleton<IImageLoader, CrossPlatformImageLoader>(); service.AddSingleton<IImageLoader, CrossPlatformImageLoader>();
// Installer/Compiler Configuration // Installer/Compiler Configuration
@ -214,9 +228,9 @@ public static class ServiceExtensions
OSVersion = Environment.OSVersion.VersionString, OSVersion = Environment.OSVersion.VersionString,
Version = version Version = version
}); });
return service; return service;
} }
@ -224,7 +238,7 @@ public static class ServiceExtensions
{ {
// Get directories first and cache them, this freezes the directories were looking at // Get directories first and cache them, this freezes the directories were looking at
// so any new ones don't show up in the middle of our deletes. // so any new ones don't show up in the middle of our deletes.
var dirs = path.EnumerateDirectories().ToList(); var dirs = path.EnumerateDirectories().ToList();
var processIds = Process.GetProcesses().Select(p => p.Id).ToHashSet(); var processIds = Process.GetProcesses().Select(p => p.Id).ToHashSet();
foreach (var dir in dirs) foreach (var dir in dirs)
@ -232,7 +246,7 @@ public static class ServiceExtensions
var name = dir.FileName.ToString().Split("_"); var name = dir.FileName.ToString().Split("_");
if (!int.TryParse(name[0], out var processId)) continue; if (!int.TryParse(name[0], out var processId)) continue;
if (processIds.Contains(processId)) continue; if (processIds.Contains(processId)) continue;
try try
{ {
dir.DeleteDirectory(); dir.DeleteDirectory();
@ -242,7 +256,7 @@ public static class ServiceExtensions
// ignored // ignored
} }
} }
} }
public class OSIntegratedOptions public class OSIntegratedOptions

View File

@ -147,6 +147,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wabbajack.CLI.Builder", "Wa
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wabbajack.Downloaders.VerificationCache", "Wabbajack.Downloaders.VerificationCache\Wabbajack.Downloaders.VerificationCache.csproj", "{D9560C73-4E58-4463-9DB9-D06491E0E1C8}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wabbajack.Downloaders.VerificationCache", "Wabbajack.Downloaders.VerificationCache\Wabbajack.Downloaders.VerificationCache.csproj", "{D9560C73-4E58-4463-9DB9-D06491E0E1C8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wabbajack.Configuration", "Wabbajack.Configuration\Wabbajack.Configuration.csproj", "{E7CDACA6-D3FF-4CF6-8EF8-05FCD27F6FBE}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -401,6 +403,10 @@ Global
{D9560C73-4E58-4463-9DB9-D06491E0E1C8}.Debug|Any CPU.Build.0 = Debug|Any CPU {D9560C73-4E58-4463-9DB9-D06491E0E1C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D9560C73-4E58-4463-9DB9-D06491E0E1C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9560C73-4E58-4463-9DB9-D06491E0E1C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D9560C73-4E58-4463-9DB9-D06491E0E1C8}.Release|Any CPU.Build.0 = Release|Any CPU {D9560C73-4E58-4463-9DB9-D06491E0E1C8}.Release|Any CPU.Build.0 = Release|Any CPU
{E7CDACA6-D3FF-4CF6-8EF8-05FCD27F6FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7CDACA6-D3FF-4CF6-8EF8-05FCD27F6FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7CDACA6-D3FF-4CF6-8EF8-05FCD27F6FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7CDACA6-D3FF-4CF6-8EF8-05FCD27F6FBE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE