From 7b66d8ceac3e8d88c682ff843d6a4efc48f1551c Mon Sep 17 00:00:00 2001 From: Ryan Macham Date: Mon, 6 Apr 2026 11:41:07 +0100 Subject: [PATCH] Updated Filestore. Finished Auth and Install Services. Introduced GameOptions and BaseConfig. Adjusted Settings Service to reflect. --- .../Abstractions/Configuration/BaseConfig.cs | 4 +- .../Abstractions/Interfaces/IFileStore.cs | 7 +- .../Interfaces/ILaunchDirector.cs | 9 +- .../Interfaces/Services/IAuthService.cs | 9 +- .../Services/IGameInstallService.cs | 24 +- .../Interfaces/Services/ISettingsService.cs | 9 +- AlayaCore/AlayaCore.csproj | 4 + AlayaCore/LaunchDirector.cs | 78 +- AlayaCore/Models/AlayaPath.cs | 24 +- AlayaCore/Models/Configuration/GameOptions.cs | 25 +- .../Models/Configuration/LauncherOptions.cs | 11 +- AlayaCore/Models/Manifests/DTO/ManifestDto.cs | 13 +- AlayaCore/Models/Manifests/ManifestModel.cs | 15 +- AlayaCore/Services/AuthService.cs | 110 +- AlayaCore/Services/GameInstallService.cs | 269 +++- AlayaCore/Services/GameLaunchService.cs | 121 +- AlayaCore/Services/HttpDownloadService.cs | 4 +- AlayaCore/Services/InstallStateService.cs | 170 +- AlayaCore/Services/JavaService.cs | 248 ++- AlayaCore/Services/ManifestService.cs | 11 +- AlayaCore/Services/ModService.cs | 26 +- AlayaCore/Services/SettingsService.cs | 70 +- AlayaCore/States/LaunchPlan.cs | 25 +- .../Utilities/Converters/UriConverter.cs | 10 +- AlayaCore/Utilities/Enums/FolderLocation.cs | 14 +- .../Utilities/Extensions/MappingExtensions.cs | 8 +- AlayaCore/Utilities/Stores/LocalFileStore.cs | 88 +- .../obj/AlayaCore.csproj.nuget.dgspec.json | 16 + .../obj/AlayaCore.csproj.nuget.g.targets | 7 +- .../netstandard2.1/AlayaCore.AssemblyInfo.cs | 2 +- .../AlayaCore.AssemblyInfoInputs.cache | 2 +- .../netstandard2.1/AlayaCore.assets.cache | Bin 928 -> 20619 bytes .../AlayaCore.csproj.AssemblyReference.cache | Bin 445 -> 11617 bytes AlayaCore/obj/project.assets.json | 1410 ++++++++++++++++- AlayaCore/obj/project.nuget.cache | 32 +- AlayaCore/obj/project.packagespec.json | 2 +- AlayaCore/obj/rider.project.model.nuget.info | 2 +- AlayaCore/obj/rider.project.restore.info | 2 +- 38 files changed, 2684 insertions(+), 197 deletions(-) diff --git a/AlayaCore/Abstractions/Configuration/BaseConfig.cs b/AlayaCore/Abstractions/Configuration/BaseConfig.cs index 514b8a3..192c7e8 100644 --- a/AlayaCore/Abstractions/Configuration/BaseConfig.cs +++ b/AlayaCore/Abstractions/Configuration/BaseConfig.cs @@ -1,7 +1,7 @@ namespace AlayaCore.Abstractions.Configuration { - public class BaseConfig + public abstract class BaseConfig { - + public abstract string FileName { get; } } } \ No newline at end of file diff --git a/AlayaCore/Abstractions/Interfaces/IFileStore.cs b/AlayaCore/Abstractions/Interfaces/IFileStore.cs index 7c327ba..e49c1a9 100644 --- a/AlayaCore/Abstractions/Interfaces/IFileStore.cs +++ b/AlayaCore/Abstractions/Interfaces/IFileStore.cs @@ -1,7 +1,12 @@ +using AlayaCore.Utilities.Enums; + namespace AlayaCore.Abstractions.Interfaces { public interface IFileStore { - + string Get(FolderLocation location); + string GetOrCreate(FolderLocation location); + string Combine(FolderLocation location, params string[] paths); + bool Exists(FolderLocation location); } } \ No newline at end of file diff --git a/AlayaCore/Abstractions/Interfaces/ILaunchDirector.cs b/AlayaCore/Abstractions/Interfaces/ILaunchDirector.cs index d7da1ae..63ec66d 100644 --- a/AlayaCore/Abstractions/Interfaces/ILaunchDirector.cs +++ b/AlayaCore/Abstractions/Interfaces/ILaunchDirector.cs @@ -1,7 +1,10 @@ +using System; using System.Threading; using System.Threading.Tasks; using AlayaCore.Models; using AlayaCore.States; +using CmlLib.Core; +using CmlLib.Core.Installers; namespace AlayaCore.Abstractions.Interfaces { @@ -9,7 +12,11 @@ namespace AlayaCore.Abstractions.Interfaces { Task EvaluateAsync(CancellationToken cancellationToken = default); - Task InstallOrUpdateAsync(CancellationToken cancellationToken = default); + Task InstallOrUpdateAsync(CancellationToken cancellationToken = default, + EventHandler? minecraftProgess = null, + EventHandler? byteProgress = null, + IProgress? neoForgeProgress = null, + IProgress? neoForgeByteProgress = null); Task LaunchAsync(CancellationToken cancellationToken = default); diff --git a/AlayaCore/Abstractions/Interfaces/Services/IAuthService.cs b/AlayaCore/Abstractions/Interfaces/Services/IAuthService.cs index 22e3ab2..5968379 100644 --- a/AlayaCore/Abstractions/Interfaces/Services/IAuthService.cs +++ b/AlayaCore/Abstractions/Interfaces/Services/IAuthService.cs @@ -1,7 +1,14 @@ +using System.Threading; +using System.Threading.Tasks; +using CmlLib.Core.Auth; + namespace AlayaCore.Abstractions.Interfaces.Services { public interface IAuthService { - + Task IsAuthenticatedAsync(CancellationToken cancellationToken = default); + Task AuthenticateAsync(CancellationToken cancellationToken = default); + Task SignOutAsync(CancellationToken cancellationToken = default); + Task GetSessionAsync(CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/AlayaCore/Abstractions/Interfaces/Services/IGameInstallService.cs b/AlayaCore/Abstractions/Interfaces/Services/IGameInstallService.cs index 21aac07..8c78eea 100644 --- a/AlayaCore/Abstractions/Interfaces/Services/IGameInstallService.cs +++ b/AlayaCore/Abstractions/Interfaces/Services/IGameInstallService.cs @@ -1,13 +1,31 @@ +using System; using System.Threading; using System.Threading.Tasks; using AlayaCore.Installation; using AlayaCore.Models.Manifests; +using CmlLib.Core; +using CmlLib.Core.Installers; namespace AlayaCore.Abstractions.Interfaces.Services { - public interface IMinecraftService + public interface IGameInstallService { - Task EnsureMinecraftInstalledAsync(ManifestModel manifest, InstallEnvironment environment, CancellationToken cancellationToken); - Task EnsureNeoForgeInstalledAsync(ManifestModel manifest, InstallEnvironment environment, CancellationToken cancellationToken); + Task EnsureMinecraftInstalledAsync( + ManifestModel manifest, + InstallEnvironment environment, + CancellationToken cancellationToken = default, + EventHandler? minecraftProgess = null, + EventHandler? byteProgress = null); + + Task EnsureNeoForgeInstalledAsync( + ManifestModel manifest, + InstallEnvironment environment, + CancellationToken cancellationToken = default, + IProgress? progress = null, + IProgress? byteProgress = null); + + Task VerifyFilesAsync( + ManifestModel manifest, + CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/AlayaCore/Abstractions/Interfaces/Services/ISettingsService.cs b/AlayaCore/Abstractions/Interfaces/Services/ISettingsService.cs index c2e7860..a639588 100644 --- a/AlayaCore/Abstractions/Interfaces/Services/ISettingsService.cs +++ b/AlayaCore/Abstractions/Interfaces/Services/ISettingsService.cs @@ -7,11 +7,18 @@ namespace AlayaCore.Abstractions.Interfaces.Services public interface ISettingsService { LauncherOptions LauncherOptions { get; } + GameOptions GameOptions { get; } Task SetForceReinstallAsync(bool value, CancellationToken cancellationToken = default); + Task UpdateLaunchVersionAsync(string newVersion, CancellationToken cancellationToken = default); Task SaveLauncherOptionsAsync(CancellationToken cancellationToken = default); - Task LoadLauncherOptionsAsync(CancellationToken cancellationToken = default); + + Task SaveGameOptionsAsync(CancellationToken cancellationToken = default); + Task LoadGameOptionsAsync(CancellationToken cancellationToken = default); + + Task LoadAllAsync(CancellationToken cancellationToken = default); + Task SaveAllAsync(CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/AlayaCore/AlayaCore.csproj b/AlayaCore/AlayaCore.csproj index 6619637..6c62eef 100644 --- a/AlayaCore/AlayaCore.csproj +++ b/AlayaCore/AlayaCore.csproj @@ -7,7 +7,11 @@ + + + + diff --git a/AlayaCore/LaunchDirector.cs b/AlayaCore/LaunchDirector.cs index 2e3f693..d8ff114 100644 --- a/AlayaCore/LaunchDirector.cs +++ b/AlayaCore/LaunchDirector.cs @@ -9,6 +9,9 @@ using AlayaCore.Installation; using AlayaCore.Models.Configuration; using AlayaCore.Models.Manifests; using AlayaCore.States; +using AlayaCore.Utilities.Enums; +using CmlLib.Core; +using CmlLib.Core.Installers; namespace AlayaCore { @@ -20,12 +23,13 @@ namespace AlayaCore private readonly IJavaService _javaService; private readonly IModService _modService; private readonly IGameLaunchService _gameLaunchService; + private readonly IGameInstallService _gameInstallService; + private readonly ISettingsService _settingsService; + private readonly IAuthService _authService; private readonly LauncherOptions _options; public bool CanRun { get; private set; } - public bool NeedsUpdating { get; private set; } - public LaunchPlan? CurrentPlan { get; private set; } public LaunchDirector( @@ -35,6 +39,9 @@ namespace AlayaCore IJavaService javaService, IModService modService, IGameLaunchService gameLaunchService, + IGameInstallService gameInstallService, + ISettingsService settingsService, + IAuthService authService, LauncherOptions options) { _manifestService = manifestService ?? throw new ArgumentNullException(nameof(manifestService)); @@ -43,6 +50,9 @@ namespace AlayaCore _javaService = javaService ?? throw new ArgumentNullException(nameof(javaService)); _modService = modService ?? throw new ArgumentNullException(nameof(modService)); _gameLaunchService = gameLaunchService ?? throw new ArgumentNullException(nameof(gameLaunchService)); + _gameInstallService = gameInstallService ?? throw new ArgumentNullException(nameof(gameInstallService)); + _settingsService = settingsService ?? throw new ArgumentNullException(nameof(settingsService)); + _authService = authService ?? throw new ArgumentNullException(nameof(authService)); _options = options ?? throw new ArgumentNullException(nameof(options)); } @@ -61,7 +71,8 @@ namespace AlayaCore javaNeedsInstallOrUpdate: false, minecraftNeedsInstallOrUpdate: false, neoforgeNeedsInstallOrUpdate: false, - modsNeedSync: false); + modsNeedSync: false, + needAuthenticating: false); ApplyPlan(launcherUpdatePlan); return launcherUpdatePlan; @@ -78,6 +89,10 @@ namespace AlayaCore !environment.JavaInstalled || !string.Equals(environment.JavaVersion, manifest.RequiredJavaVersion, StringComparison.OrdinalIgnoreCase); + bool needAuthenticating = !await _authService + .IsAuthenticatedAsync(cancellationToken) + .ConfigureAwait(false); + bool minecraftNeedsInstallOrUpdate = _options.ForceReinstall || !environment.MinecraftInstalled || @@ -97,13 +112,18 @@ namespace AlayaCore javaNeedsInstallOrUpdate: javaNeedsInstallOrUpdate, minecraftNeedsInstallOrUpdate: minecraftNeedsInstallOrUpdate, neoforgeNeedsInstallOrUpdate: neoforgeNeedsInstallOrUpdate, - modsNeedSync: modsNeedSync); + modsNeedSync: modsNeedSync, + needAuthenticating: needAuthenticating); ApplyPlan(plan); return plan; } - public async Task InstallOrUpdateAsync(CancellationToken cancellationToken = default) + public async Task InstallOrUpdateAsync(CancellationToken cancellationToken = default, + EventHandler? minecraftProgess = null, + EventHandler? byteProgress = null, + IProgress? neoForgeProgress = null, + IProgress? neoForgeByteProgress = null) { cancellationToken.ThrowIfCancellationRequested(); @@ -113,8 +133,8 @@ namespace AlayaCore { cancellationToken.ThrowIfCancellationRequested(); - ManifestModel? manifest = null; - InstallEnvironment? environment = null; + ManifestModel? manifest; + InstallEnvironment? environment; switch (plan.State) { @@ -135,7 +155,6 @@ namespace AlayaCore case LaunchState.InstallJava: { manifest = await EnsureCurrentManifestAsync(cancellationToken).ConfigureAwait(false); - environment = await _installStateService .GetCurrentEnvironmentAsync(cancellationToken) .ConfigureAwait(false); @@ -147,20 +166,43 @@ namespace AlayaCore break; } + case LaunchState.NeedAuthenticating: + { + await _authService.AuthenticateAsync(cancellationToken); + break; + } + case LaunchState.InstallMinecraft: { - throw new NotImplementedException("Minecraft install/update flow has not been implemented yet."); + manifest = await EnsureCurrentManifestAsync(cancellationToken).ConfigureAwait(false); + environment = await _installStateService + .GetCurrentEnvironmentAsync(cancellationToken) + .ConfigureAwait(false); + + await _gameInstallService + .EnsureMinecraftInstalledAsync(manifest, environment, cancellationToken, minecraftProgess, byteProgress) + .ConfigureAwait(false); + + break; } case LaunchState.InstallNeoforge: { - throw new NotImplementedException("NeoForge install/update flow has not been implemented yet."); + manifest = await EnsureCurrentManifestAsync(cancellationToken).ConfigureAwait(false); + environment = await _installStateService + .GetCurrentEnvironmentAsync(cancellationToken) + .ConfigureAwait(false); + + await _gameInstallService + .EnsureNeoForgeInstalledAsync(manifest, environment, cancellationToken, neoForgeProgress, neoForgeByteProgress) + .ConfigureAwait(false); + + break; } case LaunchState.SyncMods: { manifest = await EnsureCurrentManifestAsync(cancellationToken).ConfigureAwait(false); - environment = await _installStateService .GetCurrentEnvironmentAsync(cancellationToken) .ConfigureAwait(false); @@ -185,6 +227,18 @@ namespace AlayaCore plan = await EvaluateAsync(cancellationToken).ConfigureAwait(false); } + + if (_options.ForceReinstall) + { + await _settingsService.SetForceReinstallAsync(false, cancellationToken).ConfigureAwait(false); + } + + plan = await EvaluateAsync(cancellationToken).ConfigureAwait(false); + + if (!plan.CanRun) + { + throw new InvalidOperationException("Install/update completed, but the launcher is still not in a runnable state."); + } } public async Task LaunchAsync(CancellationToken cancellationToken = default) @@ -250,7 +304,7 @@ namespace AlayaCore } var requiredMods = manifest.Files - .Where(file => file.Type == AlayaCore.Utilities.Enums.FileType.Mod) + .Where(file => file.Type == FileType.Mod) .ToList(); var installedMods = environment.InstalledModsManifest.Mods; diff --git a/AlayaCore/Models/AlayaPath.cs b/AlayaCore/Models/AlayaPath.cs index adb10bb..e37252e 100644 --- a/AlayaCore/Models/AlayaPath.cs +++ b/AlayaCore/Models/AlayaPath.cs @@ -1,7 +1,27 @@ +using System; +using System.IO; +using AlayaCore.Abstractions.Interfaces; +using AlayaCore.Utilities.Enums; +using CmlLib.Core; + namespace AlayaCore.Models { - public class AlayaPath + public class AlayaPath : MinecraftPath { - + public AlayaPath(IFileStore fileStore) + { + BasePath = NormalizePath(fileStore.Get(FolderLocation.Game)); + + Library = NormalizePath(BasePath + "/libraries"); + Versions = NormalizePath(BasePath + "/versions"); + Resource = NormalizePath(BasePath + "/resources"); + + Runtime = NormalizePath(fileStore.GetOrCreate(FolderLocation.JavaRuntime)); + Assets = NormalizePath(BasePath + "/assets"); + + CreateDirs(); + + + } } } \ No newline at end of file diff --git a/AlayaCore/Models/Configuration/GameOptions.cs b/AlayaCore/Models/Configuration/GameOptions.cs index 5d9f142..3e2fe93 100644 --- a/AlayaCore/Models/Configuration/GameOptions.cs +++ b/AlayaCore/Models/Configuration/GameOptions.cs @@ -1,7 +1,30 @@ +using AlayaCore.Abstractions.Configuration; + namespace AlayaCore.Models.Configuration { - public class GameOptions + public class GameOptions : BaseConfig { + public override string FileName => "Game.json"; + public string? LaunchVersion { get; set; } + + public int MinimumRamMB { get; set; } + public int MaximumRamMB { get; set; } + + public int ScreenWidth { get; set; } + public int ScreenHeight { get; set; } + + public bool Fullscreen { get; set; } + + public static GameOptions Default { get; } = new GameOptions + { + LaunchVersion = null, + MinimumRamMB = 1024, + MaximumRamMB = 2048, + ScreenWidth = 1920, + ScreenHeight = 1080, + Fullscreen = false, + }; + } } \ No newline at end of file diff --git a/AlayaCore/Models/Configuration/LauncherOptions.cs b/AlayaCore/Models/Configuration/LauncherOptions.cs index 84cd186..092b855 100644 --- a/AlayaCore/Models/Configuration/LauncherOptions.cs +++ b/AlayaCore/Models/Configuration/LauncherOptions.cs @@ -1,7 +1,16 @@ +using AlayaCore.Abstractions.Configuration; + namespace AlayaCore.Models.Configuration { - public sealed class LauncherOptions + public sealed class LauncherOptions : BaseConfig { public bool ForceReinstall { get; set; } + + public override string FileName => "Launcher.json"; + + public static LauncherOptions Default { get; } = new LauncherOptions + { + ForceReinstall = false, + }; } } \ No newline at end of file diff --git a/AlayaCore/Models/Manifests/DTO/ManifestDto.cs b/AlayaCore/Models/Manifests/DTO/ManifestDto.cs index 46058a0..14f99f2 100644 --- a/AlayaCore/Models/Manifests/DTO/ManifestDto.cs +++ b/AlayaCore/Models/Manifests/DTO/ManifestDto.cs @@ -23,16 +23,15 @@ namespace AlayaCore.Models.Manifests.DTO [JsonProperty("minecraftVersion", Required = Required.Always)] public string MinecraftVersion { get; set; } = string.Empty; - [JsonProperty("minecraftUrl", Required = Required.Always)] - [JsonConverter(typeof(UriConverter))] - public Uri MinecraftUrl { get; set; } = null!; - [JsonProperty("neoforgedVersion", Required = Required.Always)] public string NeoforgedVersion { get; set; } = string.Empty; - - [JsonProperty("neoforgedUrl", Required = Required.Always)] + + [JsonProperty("serverUrl", Required = Required.Always)] [JsonConverter(typeof(UriConverter))] - public Uri NeoforgedUrl { get; set; } = null!; + public Uri ServerUrl { get; set; } = null!; + + [JsonProperty("serverPort", Required = Required.Always)] + public int ServerPort { get; } [JsonProperty("files", Required = Required.Always)] public List Files { get; set; } = new List(); diff --git a/AlayaCore/Models/Manifests/ManifestModel.cs b/AlayaCore/Models/Manifests/ManifestModel.cs index 960001e..5e02235 100644 --- a/AlayaCore/Models/Manifests/ManifestModel.cs +++ b/AlayaCore/Models/Manifests/ManifestModel.cs @@ -10,11 +10,12 @@ namespace AlayaCore.Models.Manifests { public Version AlayaVersion { get; } public string RequiredJavaVersion { get; } - public Uri RequiredJavaUrl { get; } + public Uri RequiredJavaBaseUrl { get; } public string MinecraftVersion { get; } - public Uri MinecraftUrl { get; } public string NeoforgedVersion { get; } - public Uri NeoforgedUrl { get; } + + public Uri ServerUrl { get; } + public int ServerPort { get; } public IReadOnlyList Files { get; } public ManifestModel( @@ -22,20 +23,18 @@ namespace AlayaCore.Models.Manifests string requiredJavaVersion, Uri requiredJavaUrl, string minecraftVersion, - Uri minecraftUrl, string neoforgedVersion, - Uri neoforgedUrl, + Uri serverUrl, + int serverPort, IEnumerable files) { AlayaVersion = alayaVersion ?? throw new ArgumentNullException(nameof(alayaVersion)); RequiredJavaVersion = RequireNonEmpty(requiredJavaVersion, nameof(requiredJavaVersion)); - RequiredJavaUrl = requiredJavaUrl ?? throw new ArgumentNullException(nameof(requiredJavaUrl)); + RequiredJavaBaseUrl = requiredJavaUrl ?? throw new ArgumentNullException(nameof(requiredJavaUrl)); MinecraftVersion = RequireNonEmpty(minecraftVersion, nameof(minecraftVersion)); - MinecraftUrl = minecraftUrl ?? throw new ArgumentNullException(nameof(minecraftUrl)); NeoforgedVersion = RequireNonEmpty(neoforgedVersion, nameof(neoforgedVersion)); - NeoforgedUrl = neoforgedUrl ?? throw new ArgumentNullException(nameof(neoforgedUrl)); if (files == null) { diff --git a/AlayaCore/Services/AuthService.cs b/AlayaCore/Services/AuthService.cs index 00ded87..81cf3fb 100644 --- a/AlayaCore/Services/AuthService.cs +++ b/AlayaCore/Services/AuthService.cs @@ -1,7 +1,113 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using AlayaCore.Abstractions.Interfaces; +using AlayaCore.Abstractions.Interfaces.Services; +using AlayaCore.Utilities.Enums; +using CmlLib.Core.Auth; +using CmlLib.Core.Auth.Microsoft; +using Microsoft.Identity.Client; +using XboxAuthNet.Game.Msal; +using XboxAuthNet.Game.Msal.OAuth; + namespace AlayaCore.Services { - public class AuthService + public sealed class AuthService : IAuthService { - + private readonly IFileStore _fileStore; + + private MSession? _session; + private IPublicClientApplication? _clientApp; + private JELoginHandler? _loginHandler; + + public AuthService(IFileStore fileStore) + { + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); + } + + public Task IsAuthenticatedAsync(CancellationToken cancellationToken = default) + { + cancellationToken.ThrowIfCancellationRequested(); + + bool authenticated = _session != null && _session.CheckIsValid(); + return Task.FromResult(authenticated); + } + + public async Task AuthenticateAsync(CancellationToken cancellationToken = default) + { + cancellationToken.ThrowIfCancellationRequested(); + + JELoginHandler loginHandler = await BuildHandlerAsync().ConfigureAwait(false); + + try + { + _session = await loginHandler + .AuthenticateSilently(cancellationToken: cancellationToken) + .ConfigureAwait(false); + } + catch + { + _session = await loginHandler + .AuthenticateInteractively(cancellationToken: cancellationToken) + .ConfigureAwait(false); + } + + if (_session == null || !_session.CheckIsValid()) + { + throw new InvalidOperationException("Authentication did not produce a valid Minecraft session."); + } + } + + public async Task SignOutAsync(CancellationToken cancellationToken = default) + { + cancellationToken.ThrowIfCancellationRequested(); + + JELoginHandler loginHandler = await BuildHandlerAsync().ConfigureAwait(false); + + await loginHandler.Signout(cancellationToken).ConfigureAwait(false); + _session = null; + } + + public async Task GetSessionAsync(CancellationToken cancellationToken = default) + { + cancellationToken.ThrowIfCancellationRequested(); + + if (_session != null && _session.CheckIsValid()) + { + return _session; + } + + await AuthenticateAsync(cancellationToken).ConfigureAwait(false); + + if (_session == null || !_session.CheckIsValid()) + { + throw new InvalidOperationException("No valid Minecraft session is available."); + } + + return _session; + } + + private async Task BuildHandlerAsync() + { + if (_loginHandler != null) + { + return _loginHandler; + } + + string accountDirectory = _fileStore.GetOrCreate(FolderLocation.Data); + string accountFilePath = Path.Combine(accountDirectory, "accounts.json"); + + _clientApp = await MsalClientHelper + .BuildApplicationWithCache("d91042d4-3eb5-43e4-b3ed-600e1d0760ff") + .ConfigureAwait(false); + + _loginHandler = new JELoginHandlerBuilder() + .WithOAuthProvider(new MsalCodeFlowProvider(_clientApp)) + .WithAccountManager(accountFilePath) + .Build(); + + return _loginHandler; + } } } \ No newline at end of file diff --git a/AlayaCore/Services/GameInstallService.cs b/AlayaCore/Services/GameInstallService.cs index 476edf0..fa4b9ff 100644 --- a/AlayaCore/Services/GameInstallService.cs +++ b/AlayaCore/Services/GameInstallService.cs @@ -1,7 +1,272 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using AlayaCore.Abstractions.Interfaces; +using AlayaCore.Abstractions.Interfaces.Services; +using AlayaCore.Installation; +using AlayaCore.Models; +using AlayaCore.Models.Manifests; +using AlayaCore.Utilities.Enums; +using CmlLib.Core; +using CmlLib.Core.Installer.NeoForge; +using CmlLib.Core.Installer.NeoForge.Installers; +using CmlLib.Core.Installers; +using CmlLib.Core.Java; +using CmlLib.Core.VersionMetadata; + namespace AlayaCore.Services { - public class GameInstallService + public sealed class GameInstallService : IGameInstallService { - + private const string InstalledModsManifestFileName = "InstalledModsManifest.json"; + + private readonly IFileStore _fileStore; + private readonly ISettingsService _settingsService; + + private AlayaPath? _gamePath; + private MinecraftLauncher? _minecraftLauncher; + + public GameInstallService( + IFileStore fileStore, + ISettingsService settingsService) + { + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); + _settingsService = settingsService ?? throw new ArgumentNullException(nameof(settingsService)); + } + + public async Task EnsureMinecraftInstalledAsync( + ManifestModel manifest, + InstallEnvironment environment, + CancellationToken cancellationToken = default, + EventHandler? minecraftProgess = null, + EventHandler? byteProgress = null) + { + if (manifest == null) + { + throw new ArgumentNullException(nameof(manifest)); + } + + if (environment == null) + { + throw new ArgumentNullException(nameof(environment)); + } + + cancellationToken.ThrowIfCancellationRequested(); + + if (string.IsNullOrWhiteSpace(manifest.MinecraftVersion)) + { + throw new InvalidDataException("Minecraft version is missing."); + } + + bool alreadyInstalled = + environment.MinecraftInstalled && + string.Equals(environment.MinecraftVersion, manifest.MinecraftVersion, StringComparison.OrdinalIgnoreCase); + + if (alreadyInstalled) + { + return; + } + + bool versionMismatch = + environment.MinecraftInstalled && + !string.Equals(environment.MinecraftVersion, manifest.MinecraftVersion, StringComparison.OrdinalIgnoreCase); + + if (versionMismatch) + { + await CleanOldInstallAsync(cancellationToken).ConfigureAwait(false); + } + + MinecraftLauncher launcher = GetOrCreateLauncher(minecraftProgess, byteProgress); + + await launcher + .InstallAsync(manifest.MinecraftVersion, cancellationToken) + .ConfigureAwait(false); + } + + public async Task EnsureNeoForgeInstalledAsync( + ManifestModel manifest, + InstallEnvironment environment, + CancellationToken cancellationToken = default, + IProgress? progress = null, + IProgress? byteProgress = null) + { + if (manifest == null) + { + throw new ArgumentNullException(nameof(manifest)); + } + + if (environment == null) + { + throw new ArgumentNullException(nameof(environment)); + } + + cancellationToken.ThrowIfCancellationRequested(); + + if (string.IsNullOrWhiteSpace(manifest.MinecraftVersion)) + { + throw new InvalidDataException("Minecraft version is missing."); + } + + if (string.IsNullOrWhiteSpace(manifest.NeoforgedVersion)) + { + throw new InvalidDataException("NeoForge version is missing."); + } + + bool alreadyInstalled = + environment.NeoforgedInstalled && + string.Equals(environment.NeoforgedVersion, manifest.NeoforgedVersion, StringComparison.OrdinalIgnoreCase); + + if (alreadyInstalled) + { + return; + } + + if (!environment.MinecraftInstalled || + !string.Equals(environment.MinecraftVersion, manifest.MinecraftVersion, StringComparison.OrdinalIgnoreCase)) + { + await EnsureMinecraftInstalledAsync(manifest, environment, cancellationToken).ConfigureAwait(false); + } + + if (string.IsNullOrWhiteSpace(environment.JavaPath)) + { + throw new InvalidOperationException("A valid Java installation is required before installing NeoForge."); + } + + MinecraftLauncher launcher = GetOrCreateLauncher(); + + await DownloadAndInstallNeoForgeAsync( + launcher, + manifest, + environment, + cancellationToken, + progress, byteProgress).ConfigureAwait(false); + + await launcher + .InstallAsync(manifest.MinecraftVersion, cancellationToken) + .ConfigureAwait(false); + } + + public async Task VerifyFilesAsync( + ManifestModel manifest, + CancellationToken cancellationToken = default) + { + if (manifest == null) + { + throw new ArgumentNullException(nameof(manifest)); + } + + cancellationToken.ThrowIfCancellationRequested(); + + if (string.IsNullOrWhiteSpace(manifest.MinecraftVersion)) + { + throw new InvalidDataException("Minecraft version is missing."); + } + + MinecraftLauncher launcher = GetOrCreateLauncher(); + + await launcher + .InstallAsync(manifest.MinecraftVersion, cancellationToken) + .ConfigureAwait(false); + } + + private async Task CleanOldInstallAsync(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + string gamePath = GetMinecraftPath(); + + if (Directory.Exists(gamePath)) + { + Directory.Delete(gamePath, recursive: true); + } + + string installedModsManifestPath = Path.Combine( + _fileStore.Get(FolderLocation.Manifests), + InstalledModsManifestFileName); + + if (File.Exists(installedModsManifestPath)) + { + File.Delete(installedModsManifestPath); + } + + _gamePath = null; + _minecraftLauncher = null; + + await _settingsService.UpdateLaunchVersionAsync(string.Empty, cancellationToken).ConfigureAwait(false); + } + + private MinecraftLauncher GetOrCreateLauncher(EventHandler? minecraftProgess = null, + EventHandler? byteProgress = null) + { + if (_minecraftLauncher != null) + { + return _minecraftLauncher; + } + + _gamePath = new AlayaPath(_fileStore); + _minecraftLauncher = new MinecraftLauncher(_gamePath); + + if(byteProgress != null) + _minecraftLauncher.ByteProgressChanged += byteProgress; + + if(minecraftProgess != null) + _minecraftLauncher.FileProgressChanged += minecraftProgess; + + + return _minecraftLauncher; + } + + private async Task DownloadAndInstallNeoForgeAsync( + MinecraftLauncher launcher, + ManifestModel manifest, + InstallEnvironment environment, + CancellationToken cancellationToken, + IProgress? progress = null, + IProgress? byteProgress = null) + { + if (launcher == null) + { + throw new ArgumentNullException(nameof(launcher)); + } + + bool neoForgeMismatch = + environment.NeoforgedInstalled && + !string.Equals(environment.NeoforgedVersion, manifest.NeoforgedVersion, StringComparison.OrdinalIgnoreCase); + + if (neoForgeMismatch) + { + await CleanOldInstallAsync(cancellationToken).ConfigureAwait(false); + return; + } + + NeoForgeInstaller installer = new NeoForgeInstaller(launcher); + + NeoForgeInstallOptions options = new NeoForgeInstallOptions + { + CancellationToken = cancellationToken, + JavaPath = environment.JavaPath, + SkipIfAlreadyInstalled = true + }; + + if(progress != null) + options.FileProgress = progress; + + if(byteProgress != null) + options.ByteProgress = byteProgress; + + string version = await installer + .Install(manifest.MinecraftVersion, manifest.NeoforgedVersion, options) + .ConfigureAwait(false); + + await _settingsService + .UpdateLaunchVersionAsync(version, cancellationToken) + .ConfigureAwait(false); + } + + private string GetMinecraftPath() + { + return _fileStore.GetOrCreate(FolderLocation.Game); + } } } \ No newline at end of file diff --git a/AlayaCore/Services/GameLaunchService.cs b/AlayaCore/Services/GameLaunchService.cs index d2686ad..d4998f7 100644 --- a/AlayaCore/Services/GameLaunchService.cs +++ b/AlayaCore/Services/GameLaunchService.cs @@ -1,7 +1,124 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using AlayaCore.Abstractions.Interfaces; +using AlayaCore.Abstractions.Interfaces.Services; +using AlayaCore.Installation; +using AlayaCore.Models; +using AlayaCore.Models.Configuration; +using AlayaCore.Models.Manifests; +using AlayaCore.Utilities.Enums; +using CmlLib.Core; +using CmlLib.Core.Auth; +using CmlLib.Core.ProcessBuilder; + namespace AlayaCore.Services { - public class GameLaunchService + public sealed class GameLaunchService : IGameLaunchService { - + private readonly IAuthService _authService; + private readonly IFileStore _fileStore; + private readonly ILaunchDirector _director; + private readonly GameOptions _gameOptions; + + private AlayaPath? _gamePath; + private MinecraftLauncher? _minecraftLauncher; + + public GameLaunchService( + IAuthService authService, + IFileStore fileStore, + ILaunchDirector director, + GameOptions gameOptions) + { + _authService = authService ?? throw new ArgumentNullException(nameof(authService)); + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); + _director = director ?? throw new ArgumentNullException(nameof(director)); + _gameOptions = gameOptions ?? throw new ArgumentNullException(nameof(gameOptions)); + } + + public async Task LaunchAsync( + ManifestModel manifest, + InstallEnvironment environment, + CancellationToken cancellationToken = default) + { + if (!_director.CanRun) + { + throw new InvalidOperationException("The launcher is not in a runnable state."); + } + + if (manifest == null) + { + throw new ArgumentNullException(nameof(manifest)); + } + + if (environment == null) + { + throw new ArgumentNullException(nameof(environment)); + } + + if (string.IsNullOrWhiteSpace(_gameOptions.LaunchVersion)) + { + throw new InvalidDataException("GameOptions.LaunchVersion is not configured."); + } + + if (string.IsNullOrWhiteSpace(environment.JavaPath)) + { + throw new InvalidOperationException("A valid Java path is required to launch the game."); + } + + cancellationToken.ThrowIfCancellationRequested(); + + MLaunchOption option = await BuildLaunchOptions(manifest, environment); + MinecraftLauncher launcher = GetOrCreateLauncher(); + + var process = await launcher + .CreateProcessAsync(_gameOptions.LaunchVersion, option) + .ConfigureAwait(false); + + var processWrapper = new ProcessWrapper(process); + processWrapper.StartWithEvents(); + + await processWrapper.WaitForExitTaskAsync().ConfigureAwait(false); + } + + private MinecraftLauncher GetOrCreateLauncher() + { + if (_minecraftLauncher != null) + { + return _minecraftLauncher; + } + + _gamePath = new AlayaPath(_fileStore); + _minecraftLauncher = new MinecraftLauncher(_gamePath); + + return _minecraftLauncher; + } + + private string GetMinecraftPath() + { + return _fileStore.GetOrCreate(FolderLocation.Game); + } + + private async Task BuildLaunchOptions(ManifestModel manifest, InstallEnvironment environment) + { + if (manifest.ServerUrl == null) + { + throw new InvalidDataException("Manifest Server Url is not configured."); + } + + return new MLaunchOption + { + Session = await _authService.GetSessionAsync(), + JavaPath = environment.JavaPath, + MinimumRamMb = _gameOptions.MinimumRamMB, + MaximumRamMb = _gameOptions.MaximumRamMB, + ScreenWidth = _gameOptions.ScreenWidth, + ScreenHeight = _gameOptions.ScreenHeight, + ServerIp = manifest.ServerUrl.Host, + ServerPort = manifest.ServerPort, + DockName = "AlayaCraft" + }; + } } } \ No newline at end of file diff --git a/AlayaCore/Services/HttpDownloadService.cs b/AlayaCore/Services/HttpDownloadService.cs index 767fbc9..2f68d16 100644 --- a/AlayaCore/Services/HttpDownloadService.cs +++ b/AlayaCore/Services/HttpDownloadService.cs @@ -12,13 +12,13 @@ using AlayaCore.Models.Results; namespace AlayaCore.Services { - public sealed class DownloadService : IDownloadService + public sealed class HttpDownloadService : IDownloadService { private const int BUFFER_SIZE = 81920; private readonly IHttpClient _httpClient; - public DownloadService(IHttpClient httpClient) + public HttpDownloadService(IHttpClient httpClient) { _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); } diff --git a/AlayaCore/Services/InstallStateService.cs b/AlayaCore/Services/InstallStateService.cs index 98a1c29..253dc87 100644 --- a/AlayaCore/Services/InstallStateService.cs +++ b/AlayaCore/Services/InstallStateService.cs @@ -1,24 +1,32 @@ using System; using System.Diagnostics; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using AlayaCore.Abstractions.Interfaces; using AlayaCore.Abstractions.Interfaces.Services; using AlayaCore.Installation; using AlayaCore.Models.Manifests; +using AlayaCore.Utilities.Enums; +using Newtonsoft.Json.Linq; namespace AlayaCore.Services { public sealed class InstallationStateService : IInstallStateService { - private const string JAVA_RUNTIME_FOLDER_NAME = "java-runtime-epsilon"; + private const string VersionsFolderName = "versions"; + private readonly IFileStore _fileStore; private readonly IManifestService _manifestService; - public InstallationStateService(IManifestService manifestService) + public InstallationStateService( + IFileStore fileStore, + IManifestService manifestService) { + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); _manifestService = manifestService ?? throw new ArgumentNullException(nameof(manifestService)); } @@ -36,26 +44,20 @@ namespace AlayaCore.Services javaVersion = GetJavaVersion(javaPath!); } - bool minecraftInstalled = IsMinecraftInstalled(); - string? minecraftVersion = null; - - bool neoforgeInstalled = IsNeoforgeInstalled(); - string? neoforgeVersion = null; - - + InstalledVersionState versionState = GetInstalledVersionState(); + InstalledModsManifestModel installedModsManifest = - await _manifestService.GetInstalledModsManifestAsync(cancellationToken).ConfigureAwait(false) - ?? new InstalledModsManifestModel(); + await _manifestService.GetInstalledModsManifestAsync(cancellationToken).ConfigureAwait(false); return new InstallEnvironment( osPlatform: platform, javaInstalled: javaInstalled, javaPath: javaPath, javaVersion: javaVersion, - minecraftInstalled: minecraftInstalled, - minecraftVersion: minecraftVersion, - neoforgedInstalled: neoforgeInstalled, - neoforgedVersion: neoforgeVersion, + minecraftInstalled: !string.IsNullOrWhiteSpace(versionState.MinecraftVersion), + minecraftVersion: versionState.MinecraftVersion, + neoforgedInstalled: !string.IsNullOrWhiteSpace(versionState.NeoForgeVersion), + neoforgedVersion: versionState.NeoForgeVersion, installedModsManifest: installedModsManifest); } @@ -131,18 +133,14 @@ namespace AlayaCore.Services : null; } - private static bool TryGetJavaPath(out string? javaPath) + private bool TryGetJavaPath(out string? javaPath) { string executableName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) - ? "java.exe" - : "java"; + ? "javaw.exe" + : "javaw"; - string fullPath = Path.Combine( - AppContext.BaseDirectory, - "Java", - JAVA_RUNTIME_FOLDER_NAME, - "bin", - executableName); + string runtimePath = _fileStore.GetOrCreate(FolderLocation.JavaRuntime); + string fullPath = Path.Combine(runtimePath, "bin", executableName); if (!File.Exists(fullPath)) { @@ -154,14 +152,130 @@ namespace AlayaCore.Services return true; } - private static bool IsMinecraftInstalled() + private InstalledVersionState GetInstalledVersionState() { - return true; + string versionsPath = GetVersionsPath(); + + if (!Directory.Exists(versionsPath)) + { + return InstalledVersionState.Empty(); + } + + string[] versionDirectories = Directory.GetDirectories(versionsPath); + + if (versionDirectories.Length == 0) + { + return InstalledVersionState.Empty(); + } + + string? minecraftVersion = null; + string? neoForgeVersion = null; + + foreach (string versionDirectory in versionDirectories) + { + string? versionFolderName = Path.GetFileName(versionDirectory); + + if (string.IsNullOrWhiteSpace(versionFolderName)) + { + continue; + } + + string versionJsonPath = Path.Combine(versionDirectory, $"{versionFolderName}.json"); + + if (!File.Exists(versionJsonPath)) + { + continue; + } + + JObject versionJson = LoadJson(versionJsonPath); + + string? id = versionJson.Value("id"); + string? inheritsFrom = versionJson.Value("inheritsFrom"); + + if (string.IsNullOrWhiteSpace(id)) + { + continue; + } + + if (IsNeoForgeVersion(id, inheritsFrom)) + { + neoForgeVersion = id; + + if (string.IsNullOrWhiteSpace(minecraftVersion) && !string.IsNullOrWhiteSpace(inheritsFrom)) + { + minecraftVersion = inheritsFrom; + } + + continue; + } + + if (string.IsNullOrWhiteSpace(minecraftVersion)) + { + minecraftVersion = id; + } + } + + return new InstalledVersionState(minecraftVersion, neoForgeVersion); } - private static bool IsNeoforgeInstalled() + private string GetVersionsPath() { - return true; + return Path.Combine(_fileStore.GetOrCreate(FolderLocation.Game), VersionsFolderName); + } + + private static bool IsNeoForgeVersion(string? id, string? inheritsFrom) + { + return ContainsNeoForgeMarker(id) || ContainsNeoForgeMarker(inheritsFrom); + } + + private static bool ContainsNeoForgeMarker(string? value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return false; + } + + return value.Contains("neoforge", StringComparison.OrdinalIgnoreCase) || + value.Contains("neoforged", StringComparison.OrdinalIgnoreCase); + } + + private static JObject LoadJson(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException("Path cannot be null, empty, or whitespace.", nameof(path)); + } + + string json = File.ReadAllText(path); + + if (string.IsNullOrWhiteSpace(json)) + { + throw new InvalidDataException($"File '{path}' was empty."); + } + + return JObject.Parse(json); + } + + private sealed class InstalledVersionState + { + public string? MinecraftVersion { get; } + public string? NeoForgeVersion { get; } + + public InstalledVersionState(string? minecraftVersion, string? neoForgeVersion) + { + MinecraftVersion = Normalize(minecraftVersion); + NeoForgeVersion = Normalize(neoForgeVersion); + } + + public static InstalledVersionState Empty() + { + return new InstalledVersionState(null, null); + } + + private static string? Normalize(string? value) + { + return string.IsNullOrWhiteSpace(value) ? null : value; + } } } } \ No newline at end of file diff --git a/AlayaCore/Services/JavaService.cs b/AlayaCore/Services/JavaService.cs index 12aaa1a..ac4556d 100644 --- a/AlayaCore/Services/JavaService.cs +++ b/AlayaCore/Services/JavaService.cs @@ -1,24 +1,30 @@ using System; +using System.Diagnostics; using System.IO; +using System.IO.Compression; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; +using AlayaCore.Abstractions.Interfaces; using AlayaCore.Abstractions.Interfaces.Services; using AlayaCore.Installation; using AlayaCore.Models.Manifests; +using AlayaCore.Utilities.Enums; namespace AlayaCore.Services { public sealed class JavaService : IJavaService { - private const string DOWNLOAD_FILE_NAME = "java-runtime.download"; - private const string JAVA_INSTALL_FOLDER_NAME = "Java"; - private const string JAVA_ARCHIVE_HASH_PLACEHOLDER = "REPLACE_WITH_MANIFEST_HASH_SUPPORT"; + private const string JavaArchiveHashPlaceholder = "REPLACE_WITH_MANIFEST_HASH_SUPPORT"; + private const string BaseUrl = "https://aka.ms/download-jdk/"; private readonly IDownloadService _downloadService; + private readonly IFileStore _fileStore; - public JavaService(IDownloadService downloadService) + public JavaService(IDownloadService downloadService, IFileStore fileStore) { _downloadService = downloadService ?? throw new ArgumentNullException(nameof(downloadService)); + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); } public async Task EnsureValidJavaInstalledAsync( @@ -38,26 +44,28 @@ namespace AlayaCore.Services cancellationToken.ThrowIfCancellationRequested(); + string installDirectory = GetJavaInstallDirectory(); + if (environment.JavaInstalled && + Directory.Exists(installDirectory) && string.Equals(environment.JavaVersion, manifest.RequiredJavaVersion, StringComparison.OrdinalIgnoreCase)) { return; } - if (environment.JavaInstalled && !string.IsNullOrWhiteSpace(environment.JavaPath)) + if (Directory.Exists(installDirectory)) { - string javaRootFolder = ResolveJavaRootFolder(environment.JavaPath); - await RemoveJavaAsync(javaRootFolder, cancellationToken).ConfigureAwait(false); + await RemoveDirectoryAsync(installDirectory, cancellationToken).ConfigureAwait(false); } - string downloadPath = GetJavaDownloadPath(); - string installDirectory = GetJavaInstallDirectory(); + Uri downloadUri = GetPlatformSpecificJavaUri(manifest.RequiredJavaVersion); + string downloadPath = GetJavaDownloadPath(downloadUri); Directory.CreateDirectory(Path.GetDirectoryName(downloadPath) ?? AppContext.BaseDirectory); Directory.CreateDirectory(installDirectory); await DownloadJavaAsync( - manifest.RequiredJavaUrl, + downloadUri, downloadPath, cancellationToken).ConfigureAwait(false); @@ -67,52 +75,100 @@ namespace AlayaCore.Services cancellationToken).ConfigureAwait(false); } - private static string GetJavaInstallDirectory() + public Uri GetPlatformSpecificJavaUri(string javaVersion) { - return Path.Combine(AppContext.BaseDirectory, JAVA_INSTALL_FOLDER_NAME); - } - - private static string GetJavaDownloadPath() - { - return Path.Combine(AppContext.BaseDirectory, "Temp", DOWNLOAD_FILE_NAME); - } - - private static string ResolveJavaRootFolder(string javaExecutablePath) - { - if (string.IsNullOrWhiteSpace(javaExecutablePath)) + if (string.IsNullOrWhiteSpace(javaVersion)) { - throw new ArgumentException("Java executable path cannot be null, empty, or whitespace.", nameof(javaExecutablePath)); + throw new ArgumentException("Java version must be provided.", nameof(javaVersion)); } - string? binFolder = Path.GetDirectoryName(javaExecutablePath); - if (string.IsNullOrWhiteSpace(binFolder)) - { - throw new InvalidOperationException("Could not resolve the Java bin directory."); - } + string os = GetOsSegment(); + string arch = GetArchitectureSegment(); + string extension = GetFileExtension(os); - string? javaRootFolder = Path.GetDirectoryName(binFolder); - if (string.IsNullOrWhiteSpace(javaRootFolder)) - { - throw new InvalidOperationException("Could not resolve the Java installation directory."); - } - - return javaRootFolder; + string fileName = $"microsoft-jdk-{javaVersion}-{os}-{arch}.{extension}"; + return new Uri($"{BaseUrl}{fileName}"); } - private static Task RemoveJavaAsync( - string oldJavaFolder, + private string GetJavaInstallDirectory() + { + return _fileStore.GetOrCreate(FolderLocation.Java); + } + + private string GetJavaDownloadPath(Uri downloadUri) + { + if (downloadUri == null) + { + throw new ArgumentNullException(nameof(downloadUri)); + } + + string fileName = Path.GetFileName(downloadUri.AbsolutePath); + if (string.IsNullOrWhiteSpace(fileName)) + { + throw new InvalidOperationException("Could not determine Java archive file name from download URI."); + } + + return Path.Combine(_fileStore.GetOrCreate(FolderLocation.Downloads), fileName); + } + + private static string GetOsSegment() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return "windows"; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return "linux"; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return "macos"; + } + + throw new PlatformNotSupportedException("Unsupported operating system."); + } + + private static string GetArchitectureSegment() + { + return RuntimeInformation.OSArchitecture switch + { + Architecture.X64 => "x64", + Architecture.Arm64 => "aarch64", + Architecture.X86 => throw new NotSupportedException("X86 is not supported."), + Architecture.Arm => throw new NotSupportedException("Arm32 is not supported."), + _ => throw new PlatformNotSupportedException( + $"Unsupported architecture: {RuntimeInformation.OSArchitecture}") + }; + } + + private static string GetFileExtension(string os) + { + return os switch + { + "windows" => "zip", + "linux" => "tar.gz", + "macos" => "tar.gz", + _ => throw new PlatformNotSupportedException($"Unsupported OS: {os}") + }; + } + + private static Task RemoveDirectoryAsync( + string directoryPath, CancellationToken cancellationToken = default) { - if (string.IsNullOrWhiteSpace(oldJavaFolder)) + if (string.IsNullOrWhiteSpace(directoryPath)) { - throw new ArgumentException("Old Java folder cannot be null, empty, or whitespace.", nameof(oldJavaFolder)); + throw new ArgumentException("Directory path cannot be null, empty, or whitespace.", nameof(directoryPath)); } cancellationToken.ThrowIfCancellationRequested(); - if (Directory.Exists(oldJavaFolder)) + if (Directory.Exists(directoryPath)) { - Directory.Delete(oldJavaFolder, recursive: true); + Directory.Delete(directoryPath, recursive: true); } return Task.CompletedTask; @@ -140,22 +196,32 @@ namespace AlayaCore.Services cancellationToken.ThrowIfCancellationRequested(); - // Replace this when your manifest includes a Java archive/runtime hash. + string directory = Path.GetDirectoryName(destinationPath); + if (!string.IsNullOrWhiteSpace(directory)) + { + Directory.CreateDirectory(directory); + } + + if (File.Exists(destinationPath)) + { + File.Delete(destinationPath); + } + await _downloadService.DownloadFileAsync( javaUri, destinationPath, - JAVA_ARCHIVE_HASH_PLACEHOLDER, + JavaArchiveHashPlaceholder, cancellationToken: cancellationToken).ConfigureAwait(false); } - private static Task InstallJavaAsync( - string installerPath, + private static async Task InstallJavaAsync( + string archivePath, string installDirectory, CancellationToken cancellationToken = default) { - if (string.IsNullOrWhiteSpace(installerPath)) + if (string.IsNullOrWhiteSpace(archivePath)) { - throw new ArgumentException("Installer path cannot be null, empty, or whitespace.", nameof(installerPath)); + throw new ArgumentException("Archive path cannot be null, empty, or whitespace.", nameof(archivePath)); } if (string.IsNullOrWhiteSpace(installDirectory)) @@ -165,23 +231,87 @@ namespace AlayaCore.Services cancellationToken.ThrowIfCancellationRequested(); - if (!File.Exists(installerPath)) + if (!File.Exists(archivePath)) { - throw new FileNotFoundException("Java installer or archive was not found.", installerPath); + throw new FileNotFoundException("Java archive was not found.", archivePath); } Directory.CreateDirectory(installDirectory); - // TODO: - // Implement this based on the actual Java package format. - // - // Examples: - // - If the file is a .zip, extract it into installDirectory - // - If it is a .tar.gz, unpack it appropriately - // - If it is an installer executable, launch it silently - // - // For now this is intentionally left explicit rather than guessing the wrong install strategy. - throw new NotImplementedException("InstallJavaAsync must be implemented for the actual Java package format."); + if (archivePath.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)) + { + ZipFile.ExtractToDirectory(archivePath, installDirectory); + return; + } + + if (archivePath.EndsWith(".tar.gz", StringComparison.OrdinalIgnoreCase)) + { + await ExtractTarGzAsync(archivePath, installDirectory, cancellationToken).ConfigureAwait(false); + return; + } + + throw new NotSupportedException( + $"Unsupported Java archive format: {Path.GetFileName(archivePath)}"); + } + + private static async Task ExtractTarGzAsync( + string archivePath, + string destinationDirectory, + CancellationToken cancellationToken) + { + if (string.IsNullOrWhiteSpace(archivePath)) + { + throw new ArgumentException("Archive path cannot be null, empty, or whitespace.", nameof(archivePath)); + } + + if (string.IsNullOrWhiteSpace(destinationDirectory)) + { + throw new ArgumentException("Destination directory cannot be null, empty, or whitespace.", nameof(destinationDirectory)); + } + + Directory.CreateDirectory(destinationDirectory); + + var startInfo = new ProcessStartInfo + { + FileName = "tar", + Arguments = $"-xzf \"{archivePath}\" -C \"{destinationDirectory}\"", + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using var process = new Process { StartInfo = startInfo }; + await using (cancellationToken.Register(() => + { + try + { + if (!process.HasExited) + { + process.Kill(); + } + } + catch + { + // Ignore race conditions if the process exits while cancellation is being handled. + } + })) + { + process.Start(); + + string standardOutput = await process.StandardOutput.ReadToEndAsync().ConfigureAwait(false); + string standardError = await process.StandardError.ReadToEndAsync().ConfigureAwait(false); + + await Task.Run(() => process.WaitForExit(), cancellationToken).ConfigureAwait(false); + + cancellationToken.ThrowIfCancellationRequested(); + + if (process.ExitCode != 0) + { + throw new InvalidOperationException( + $"tar extraction failed with exit code {process.ExitCode}. Error: {standardError}. Output: {standardOutput}"); + } + } } } } \ No newline at end of file diff --git a/AlayaCore/Services/ManifestService.cs b/AlayaCore/Services/ManifestService.cs index a9b7ca4..95287ab 100644 --- a/AlayaCore/Services/ManifestService.cs +++ b/AlayaCore/Services/ManifestService.cs @@ -3,11 +3,13 @@ using System.IO; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using AlayaCore.Abstractions.Interfaces; using AlayaCore.Abstractions.Interfaces.Clients; using AlayaCore.Abstractions.Interfaces.Services; using AlayaCore.Models.Configuration; using AlayaCore.Models.Manifests; using AlayaCore.Models.Manifests.DTO; +using AlayaCore.Utilities.Enums; using AlayaCore.Utilities.Extensions; using Newtonsoft.Json; @@ -21,15 +23,18 @@ namespace AlayaCore.Services private readonly IDownloadService _downloadService; private readonly IHttpClient _httpClient; + private readonly IFileStore _fileStore; private readonly ManifestServiceOptions _options; public ManifestService( IDownloadService downloadService, IHttpClient httpClient, + IFileStore fileStore, ManifestServiceOptions options) { _downloadService = downloadService ?? throw new ArgumentNullException(nameof(downloadService)); _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); _options = options ?? throw new ArgumentNullException(nameof(options)); } @@ -168,17 +173,17 @@ namespace AlayaCore.Services public string GetLauncherManifestPath() { - return Path.Combine(_options.ManifestDirectoryPath, LAUNCHER_MANIFEST_FILE_NAME); + return Path.Combine(_fileStore.GetOrCreate(FolderLocation.Manifests), LAUNCHER_MANIFEST_FILE_NAME); } public string GetCoreManifestPath() { - return Path.Combine(_options.ManifestDirectoryPath, CORE_MANIFEST_FILE_NAME); + return Path.Combine(_fileStore.GetOrCreate(FolderLocation.Manifests), CORE_MANIFEST_FILE_NAME); } public string GetInstalledModsManifestPath() { - return Path.Combine(_options.ManifestDirectoryPath, INSTALLED_MODS_MANIFEST_FILE_NAME); + return Path.Combine(_fileStore.GetOrCreate(FolderLocation.Manifests), INSTALLED_MODS_MANIFEST_FILE_NAME); } private async Task LoadLocalManifestAsync( diff --git a/AlayaCore/Services/ModService.cs b/AlayaCore/Services/ModService.cs index f99cd2d..50de224 100644 --- a/AlayaCore/Services/ModService.cs +++ b/AlayaCore/Services/ModService.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using AlayaCore.Abstractions.Interfaces; using AlayaCore.Abstractions.Interfaces.Clients; using AlayaCore.Abstractions.Interfaces.Services; using AlayaCore.Installation; @@ -21,23 +22,23 @@ namespace AlayaCore.Services { public sealed class ModService : IModService { - private const string InstalledModsManifestFileName = "InstalledModsManifest.json"; + private const string INSTALLED_MODS_MANIFEST_FILE_NAME = "InstalledModsManifest.json"; private readonly IDownloadService _downloadService; private readonly ModrinthConnectionOptions _options; - private readonly ManifestServiceOptions _manifestOptions; private readonly IHttpClient _httpClient; + private readonly IFileStore _fileStore; public ModService( IDownloadService downloadService, ModrinthConnectionOptions options, - ManifestServiceOptions manifestOptions, - IHttpClient httpClient) + IHttpClient httpClient, + IFileStore fileStore) { _downloadService = downloadService ?? throw new ArgumentNullException(nameof(downloadService)); _options = options ?? throw new ArgumentNullException(nameof(options)); - _manifestOptions = manifestOptions ?? throw new ArgumentNullException(nameof(manifestOptions)); _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); } public async Task ProcessModsAsync( @@ -238,7 +239,7 @@ namespace AlayaCore.Services return $"{baseUrl}/version_file/{sha512Hash}"; } - private static string GetModDestinationPath(ModFileEntry fileEntry) + private string GetModDestinationPath(ModFileEntry fileEntry) { if (fileEntry == null) { @@ -251,17 +252,16 @@ namespace AlayaCore.Services } string modsDirectory = GetModsDirectoryPath(); - Directory.CreateDirectory(modsDirectory); return Path.Combine(modsDirectory, fileEntry.FileName); } - private static string GetModsDirectoryPath() + private string GetModsDirectoryPath() { - return Path.Combine(AppContext.BaseDirectory, "Game", "mods"); + return _fileStore.GetOrCreate(FolderLocation.Mods); } - private static void RemoveStaleMods(IEnumerable requiredMods) + private void RemoveStaleMods(IEnumerable requiredMods) { if (requiredMods == null) { @@ -269,6 +269,7 @@ namespace AlayaCore.Services } string modsDirectory = GetModsDirectoryPath(); + if (!Directory.Exists(modsDirectory)) { return; @@ -302,10 +303,9 @@ namespace AlayaCore.Services List entries = installedMods.ToList(); InstalledModsManifestModel manifest = new InstalledModsManifestModel(entries); - string manifestsDirectory = _manifestOptions.ManifestDirectoryPath; - Directory.CreateDirectory(manifestsDirectory); + string manifestsDirectory = _fileStore.GetOrCreate(FolderLocation.Manifests); - string manifestPath = Path.Combine(manifestsDirectory, InstalledModsManifestFileName); + string manifestPath = Path.Combine(manifestsDirectory, INSTALLED_MODS_MANIFEST_FILE_NAME); string temporaryManifestPath = manifestPath + ".tmp"; InstalledModsManifestDto dto = manifest.ToDto(); diff --git a/AlayaCore/Services/SettingsService.cs b/AlayaCore/Services/SettingsService.cs index 7a2b08b..973b4ca 100644 --- a/AlayaCore/Services/SettingsService.cs +++ b/AlayaCore/Services/SettingsService.cs @@ -2,21 +2,30 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using AlayaCore.Abstractions.Configuration; +using AlayaCore.Abstractions.Interfaces; using AlayaCore.Abstractions.Interfaces.Services; using AlayaCore.Models.Configuration; +using AlayaCore.Utilities.Enums; using Newtonsoft.Json; namespace AlayaCore.Services { public sealed class SettingsService : ISettingsService { - private const string LauncherSettingsFileName = "Launcher.json"; + private readonly IFileStore _fileStore; public LauncherOptions LauncherOptions { get; } + public GameOptions GameOptions { get; } - public SettingsService(LauncherOptions launcherOptions) + public SettingsService( + LauncherOptions launcherOptions, + GameOptions gameOptions, + IFileStore fileStore) { LauncherOptions = launcherOptions ?? throw new ArgumentNullException(nameof(launcherOptions)); + GameOptions = gameOptions ?? throw new ArgumentNullException(nameof(gameOptions)); + _fileStore = fileStore ?? throw new ArgumentNullException(nameof(fileStore)); } public async Task SetForceReinstallAsync(bool value, CancellationToken cancellationToken = default) @@ -25,10 +34,16 @@ namespace AlayaCore.Services await SaveLauncherOptionsAsync(cancellationToken).ConfigureAwait(false); } + public async Task UpdateLaunchVersionAsync(string newVersion, CancellationToken cancellationToken = default) + { + GameOptions.LaunchVersion = newVersion ?? string.Empty; + await SaveGameOptionsAsync(cancellationToken).ConfigureAwait(false); + } + public async Task SaveLauncherOptionsAsync(CancellationToken cancellationToken = default) { await SaveAsync( - LauncherSettingsFileName, + LauncherOptions.FileName, LauncherOptions, cancellationToken).ConfigureAwait(false); } @@ -36,7 +51,7 @@ namespace AlayaCore.Services public async Task LoadLauncherOptionsAsync(CancellationToken cancellationToken = default) { LauncherOptions? loadedOptions = await LoadAsync( - LauncherSettingsFileName, + LauncherOptions.FileName, cancellationToken).ConfigureAwait(false); if (loadedOptions == null) @@ -47,10 +62,49 @@ namespace AlayaCore.Services LauncherOptions.ForceReinstall = loadedOptions.ForceReinstall; } + public async Task SaveGameOptionsAsync(CancellationToken cancellationToken = default) + { + await SaveAsync( + GameOptions.FileName, + GameOptions, + cancellationToken).ConfigureAwait(false); + } + + public async Task LoadGameOptionsAsync(CancellationToken cancellationToken = default) + { + GameOptions? loadedOptions = await LoadAsync( + GameOptions.FileName, + cancellationToken).ConfigureAwait(false); + + if (loadedOptions == null) + { + return; + } + + GameOptions.LaunchVersion = loadedOptions.LaunchVersion; + GameOptions.MinimumRamMB = loadedOptions.MinimumRamMB; + GameOptions.MaximumRamMB = loadedOptions.MaximumRamMB; + GameOptions.ScreenWidth = loadedOptions.ScreenWidth; + GameOptions.ScreenHeight = loadedOptions.ScreenHeight; + GameOptions.Fullscreen = loadedOptions.Fullscreen; + } + + public async Task LoadAllAsync(CancellationToken cancellationToken = default) + { + await LoadLauncherOptionsAsync(cancellationToken).ConfigureAwait(false); + await LoadGameOptionsAsync(cancellationToken).ConfigureAwait(false); + } + + public async Task SaveAllAsync(CancellationToken cancellationToken = default) + { + await SaveLauncherOptionsAsync(cancellationToken).ConfigureAwait(false); + await SaveGameOptionsAsync(cancellationToken).ConfigureAwait(false); + } + private async Task SaveAsync( string fileName, T value, - CancellationToken cancellationToken) + CancellationToken cancellationToken) where T : BaseConfig { if (string.IsNullOrWhiteSpace(fileName)) { @@ -89,7 +143,7 @@ namespace AlayaCore.Services private async Task LoadAsync( string fileName, - CancellationToken cancellationToken) + CancellationToken cancellationToken) where T : BaseConfig { if (string.IsNullOrWhiteSpace(fileName)) { @@ -124,9 +178,9 @@ namespace AlayaCore.Services } } - private static string GetFullPath(string fileName) + private string GetFullPath(string fileName) { - return Path.Combine(AppContext.BaseDirectory, "Config", fileName); + return Path.Combine(_fileStore.GetOrCreate(FolderLocation.Config), fileName); } } } \ No newline at end of file diff --git a/AlayaCore/States/LaunchPlan.cs b/AlayaCore/States/LaunchPlan.cs index 9eb87e9..2062bef 100644 --- a/AlayaCore/States/LaunchPlan.cs +++ b/AlayaCore/States/LaunchPlan.cs @@ -4,6 +4,7 @@ namespace AlayaCore.States { Ready, LauncherNeedsUpdate, + NeedAuthenticating, InstallJava, InstallMinecraft, InstallNeoforge, @@ -17,35 +18,46 @@ namespace AlayaCore.States public bool MinecraftNeedsInstallOrUpdate { get; } public bool NeoforgeNeedsInstallOrUpdate { get; } public bool ModsNeedSync { get; } + public bool NeedAuthenticating { get; } public LaunchState State => ComputeState(); - public bool CanRun => - State == LaunchState.Ready; + public bool CanRun => State == LaunchState.Ready; public bool NeedsUpdating => - State != LaunchState.Ready; + LauncherNeedsUpdate || + JavaNeedsInstallOrUpdate || + MinecraftNeedsInstallOrUpdate || + NeoforgeNeedsInstallOrUpdate || + ModsNeedSync; + + public bool NeedsAttention => + NeedsUpdating || NeedAuthenticating; public LaunchPlan( bool launcherNeedsUpdate, bool javaNeedsInstallOrUpdate, bool minecraftNeedsInstallOrUpdate, bool neoforgeNeedsInstallOrUpdate, - bool modsNeedSync) + bool modsNeedSync, + bool needAuthenticating) { LauncherNeedsUpdate = launcherNeedsUpdate; JavaNeedsInstallOrUpdate = javaNeedsInstallOrUpdate; MinecraftNeedsInstallOrUpdate = minecraftNeedsInstallOrUpdate; NeoforgeNeedsInstallOrUpdate = neoforgeNeedsInstallOrUpdate; ModsNeedSync = modsNeedSync; + NeedAuthenticating = needAuthenticating; } private LaunchState ComputeState() { - // Priority order matters a LOT here if (LauncherNeedsUpdate) return LaunchState.LauncherNeedsUpdate; + if (NeedAuthenticating) + return LaunchState.NeedAuthenticating; + if (JavaNeedsInstallOrUpdate) return LaunchState.InstallJava; @@ -68,7 +80,8 @@ namespace AlayaCore.States javaNeedsInstallOrUpdate: false, minecraftNeedsInstallOrUpdate: false, neoforgeNeedsInstallOrUpdate: false, - modsNeedSync: false); + modsNeedSync: false, + needAuthenticating: false); } } } \ No newline at end of file diff --git a/AlayaCore/Utilities/Converters/UriConverter.cs b/AlayaCore/Utilities/Converters/UriConverter.cs index aaf1308..ea389cf 100644 --- a/AlayaCore/Utilities/Converters/UriConverter.cs +++ b/AlayaCore/Utilities/Converters/UriConverter.cs @@ -1,5 +1,4 @@ using System; -using System.Globalization; using Newtonsoft.Json; namespace AlayaCore.Utilities.Converters @@ -12,9 +11,9 @@ namespace AlayaCore.Utilities.Converters { writer.WriteNull(); } - else if (value is Uri) + else if (value is Uri uri) { - writer.WriteValue(((Uri)value).AbsoluteUri); + writer.WriteValue(uri.AbsoluteUri); } else { @@ -33,8 +32,7 @@ namespace AlayaCore.Utilities.Converters { try { - Uri uri = new Uri((string)reader.Value!); - return uri; + return new Uri((string)reader.Value!, UriKind.Absolute); } catch (Exception ex) { @@ -47,7 +45,7 @@ namespace AlayaCore.Utilities.Converters public override bool CanConvert(Type objectType) { - return objectType == typeof(Uri); + return typeof(Uri).IsAssignableFrom(objectType); } } } \ No newline at end of file diff --git a/AlayaCore/Utilities/Enums/FolderLocation.cs b/AlayaCore/Utilities/Enums/FolderLocation.cs index 942304b..a6353da 100644 --- a/AlayaCore/Utilities/Enums/FolderLocation.cs +++ b/AlayaCore/Utilities/Enums/FolderLocation.cs @@ -1,7 +1,17 @@ namespace AlayaCore.Utilities.Enums { - public class FolderLocation + public enum FolderLocation { - + BaseDirectory, + Java, + JavaRuntime, + Game, + Mods, + ResourcePacks, + Config, + Downloads, + Manifests, + Plugins, + Data } } \ No newline at end of file diff --git a/AlayaCore/Utilities/Extensions/MappingExtensions.cs b/AlayaCore/Utilities/Extensions/MappingExtensions.cs index 6c02f80..c9dc425 100644 --- a/AlayaCore/Utilities/Extensions/MappingExtensions.cs +++ b/AlayaCore/Utilities/Extensions/MappingExtensions.cs @@ -50,9 +50,9 @@ namespace AlayaCore.Utilities.Extensions dto.RequiredJavaVersion, dto.RequiredJavaUrl, dto.MinecraftVersion, - dto.MinecraftUrl, dto.NeoforgedVersion, - dto.NeoforgedUrl, + dto.ServerUrl, + dto.ServerPort, dto.Files?.Select(file => file.ToModel()) ?? Array.Empty()); } @@ -81,11 +81,9 @@ namespace AlayaCore.Utilities.Extensions { AlayaVersion = model.AlayaVersion, RequiredJavaVersion = model.RequiredJavaVersion, - RequiredJavaUrl = model.RequiredJavaUrl, + RequiredJavaUrl = model.RequiredJavaBaseUrl, MinecraftVersion = model.MinecraftVersion, - MinecraftUrl = model.MinecraftUrl, NeoforgedVersion = model.NeoforgedVersion, - NeoforgedUrl = model.NeoforgedUrl, Files = model.Files.Select(file => file.ToDto()).ToList() }; } diff --git a/AlayaCore/Utilities/Stores/LocalFileStore.cs b/AlayaCore/Utilities/Stores/LocalFileStore.cs index caf2ac6..ef2daab 100644 --- a/AlayaCore/Utilities/Stores/LocalFileStore.cs +++ b/AlayaCore/Utilities/Stores/LocalFileStore.cs @@ -6,20 +6,86 @@ using AlayaCore.Utilities.Enums; namespace AlayaCore.Utilities.Stores { - public class FileStore : IFileStore + public sealed class LocalFileStore : IFileStore { - private static readonly string _baseDirectory = AppContext.BaseDirectory; - private static readonly string _javaDirectory = Path.Combine(_baseDirectory, "Java"); - - private static readonly Dictionary _folders = new() - { - { FolderLocation.BaseDirectory, _baseDirectory }, - { FolderLocation.Java, _javaDirectory} - }; - + private static readonly string BaseDirectoryPath = AppContext.BaseDirectory; + private static readonly string JavaDirectoryPath = Path.Combine(BaseDirectoryPath, "Java"); + private static readonly string JavaRuntimeDirectoryPath = Path.Combine(JavaDirectoryPath, "java-runtime-epsilon"); + private static readonly string GameDirectoryPath = Path.Combine(BaseDirectoryPath, "Game"); + private static readonly string ModsDirectoryPath = Path.Combine(GameDirectoryPath, "mods"); + private static readonly string ResourcePacksDirectoryPath = Path.Combine(GameDirectoryPath, "resourcepacks"); + private static readonly string ConfigDirectoryPath = Path.Combine(BaseDirectoryPath, "Config"); + private static readonly string DownloadsDirectoryPath = Path.Combine(BaseDirectoryPath, "Temp"); + private static readonly string ManifestsDirectoryPath = Path.Combine(BaseDirectoryPath, "Manifests"); + private static readonly string PluginsDirectoryPath = Path.Combine(GameDirectoryPath, "plugins"); + private static readonly string DataDirectoryPath = Path.Combine(BaseDirectoryPath, "Data"); + + private static readonly IReadOnlyDictionary Folders = + new Dictionary + { + { FolderLocation.BaseDirectory, BaseDirectoryPath }, + { FolderLocation.Java, JavaDirectoryPath }, + { FolderLocation.JavaRuntime, JavaRuntimeDirectoryPath }, + { FolderLocation.Game, GameDirectoryPath }, + { FolderLocation.Mods, ModsDirectoryPath }, + { FolderLocation.ResourcePacks, ResourcePacksDirectoryPath }, + { FolderLocation.Config, ConfigDirectoryPath }, + { FolderLocation.Downloads, DownloadsDirectoryPath }, + { FolderLocation.Manifests, ManifestsDirectoryPath}, + { FolderLocation.Plugins, PluginsDirectoryPath }, + { FolderLocation.Data, DataDirectoryPath} + }; + public string Get(FolderLocation location) { - return _folders[location]; + if (!Folders.TryGetValue(location, out string? path)) + { + throw new ArgumentOutOfRangeException(nameof(location), location, "Unknown folder location."); + } + + return path; + } + + public string GetOrCreate(FolderLocation location) + { + string path = Get(location); + Directory.CreateDirectory(path); + return path; + } + + public string Combine(FolderLocation location, params string[] paths) + { + if (paths == null) + { + throw new ArgumentNullException(nameof(paths)); + } + + string rootPath = Get(location); + + if (paths.Length == 0) + { + return rootPath; + } + + string[] combinedPaths = new string[paths.Length + 1]; + combinedPaths[0] = rootPath; + + for (int i = 0; i < paths.Length; i++) + { + if (string.IsNullOrWhiteSpace(paths[i])) + { + throw new ArgumentException("Path segments cannot be null, empty, or whitespace.", nameof(paths)); + } + + combinedPaths[i + 1] = paths[i]; + } + + return Path.Combine(combinedPaths); + } + + public bool Exists(FolderLocation location) + { + return Directory.Exists(Get(location)); } } } \ No newline at end of file diff --git a/AlayaCore/obj/AlayaCore.csproj.nuget.dgspec.json b/AlayaCore/obj/AlayaCore.csproj.nuget.dgspec.json index 01e0f34..e05610b 100644 --- a/AlayaCore/obj/AlayaCore.csproj.nuget.dgspec.json +++ b/AlayaCore/obj/AlayaCore.csproj.nuget.dgspec.json @@ -44,9 +44,25 @@ "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { + "CmlLib.Core": { + "target": "Package", + "version": "[4.0.6, )" + }, + "CmlLib.Core.Auth.Microsoft": { + "target": "Package", + "version": "[3.3.1, )" + }, + "CmlLib.Core.Installer.NeoForge": { + "target": "Package", + "version": "[4.0.0, )" + }, "Newtonsoft.Json": { "target": "Package", "version": "[13.0.4, )" + }, + "XboxAuthNet.Game.Msal": { + "target": "Package", + "version": "[0.1.3, )" } }, "imports": [ diff --git a/AlayaCore/obj/AlayaCore.csproj.nuget.g.targets b/AlayaCore/obj/AlayaCore.csproj.nuget.g.targets index 3dc06ef..c83d375 100644 --- a/AlayaCore/obj/AlayaCore.csproj.nuget.g.targets +++ b/AlayaCore/obj/AlayaCore.csproj.nuget.g.targets @@ -1,2 +1,7 @@  - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfo.cs b/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfo.cs index 086189c..ac30a3e 100644 --- a/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfo.cs +++ b/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("AlayaCore")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+823ccf4b877ddf1fc1293f72c6b704d6a449ddaa")] [assembly: System.Reflection.AssemblyProductAttribute("AlayaCore")] [assembly: System.Reflection.AssemblyTitleAttribute("AlayaCore")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfoInputs.cache b/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfoInputs.cache index 97b33d8..d33f649 100644 --- a/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfoInputs.cache +++ b/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.AssemblyInfoInputs.cache @@ -1 +1 @@ -02d72db7e7301cd87568f68f39a003b2484df3c699c3ceed1d9bd04f25f6e3dd +c63b3bf6f0fd998ece1d911c58e61eb584840e2e19d535b62f67f54b1510e49e diff --git a/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.assets.cache b/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.assets.cache index 2155a533f4467499bbc32236e1f5c7ae65ab3020..9c715d93aaf6fe9c65356792a3cbdd68edb2b5a3 100644 GIT binary patch literal 20619 zcmdU1S$7o26&A6?62L6N#z5G_4yH#!5*9ebXkn2NGDczvabmY-dZdP#?s0buG1zfp z$FbwY4&IVH_#r26IeE*E$!i|+EAozq>0)Kt~|>eg~^eRFGW zT)Q&5sjI8&&Og8VkM`BSc8}H8SeyU%n2vgg0Ae4+3A_w-M?x_*Fi z->oU!at+5VICb5s>cs`UTF|V;dBZEz^x^}3-f#<5v*_5aUG_BNk!M)0X=%pj&#S{+Jpq*`9@#P`gsMhP0tV(JfpLTf5X~ZA!Fu#jp%V z_iV@2N|g!$q`x&t^!hoZ_p|Z3b=Nbhng_Jneb=^pSi>2xW`atyROxk8(q`;Mr)UU3 z=p6^tEdcf4Nq_s1Zf654Rx1^APAl4uQ5b@%&KB^t01dgGZk2SWbVlnhj8`jDC^U{j zB$E0}e`}FQ2kVg5BW*zPS`w-0i{6434rXCc8^mB`AQ+`OjUi)zeh2^rXd@BvacCb=48Z`~JjPIMl&VdJ)i|t|1gu>G)^0ri(e7SXGHQlZGOS|VwC)@J zUZ>jkVoQnRWt-hZ*xY2;+$h^dc|Z1ue$X~RgZU$*uiNcM%AOs=-p_Q+u*;1)2`}HO z3GZGcx0UH&LeCx+fL5%Sc!j;;?0`0?S^|w-X;Ri1_v>)|?Sp(;iL^r#o&!kVw4}cX zAZ`Pzu3l*iAXDgdw7~%%1V9eB5AQ!~3vksg8CY6uVinG6gTtzY#Rpp|^SWO>X`BxU zn1}Hsy&ge&JA0fhW68sgPrih2nFj{3(uY)|JKZShn`35qjtbewgzV#Z&SlGX7j&og z*sRf1$F{1SiHjX5Opeb`v2k=>^Iu`Rn}RuJ;!gQj0xZszC;L}2|hUX_ariSo`N~S(<*{)|6;aoLd`)&?q26=9ZT|mH@ zXjIS|uLB>6V=M@a{Q~0vo*(DOXxduYtQZ2ZUW74li?-!CcBO!si@BSuvB@{I%cv^= zkNS1TgSs5y8G&$6ARNN;Uhd(m8dck=`=d9UqOR+HF)nskh&?OBzJljMZn5wYwFS?s zHT+qHdF(HUzE7j{RVp1_IU@puw2J5O-pUVRv1&Lpdmh3D!bOJ`;JKxY$h53*JE*|* zab7@q6;IkgevI^a{)yr&!b(&P_|nxH2Hn9K=Ant%qAgmkUN-#soTj3iqCUJzzy6G@ zf6K4WkzNo;aboh3zJ_NG4@b;l*C;MJWY1cg%rmlD;yk`6V99wriud2OjR~~D6*(plkK;*0K7sU68;EO;32(6m zySZdqC40%u+!{ilH^QoSf~p+fC4oqm6!!wa@2$460$T#uKF;$pI zZCT zna-h$r#O4pN^>NH{`lFu(=I6!%U#j{NbsLdJsTOJM7g`!d##z?p^tm{$AWXA{Czw> z&VEplEfG?J^43q?yFPk)W`Y)J*WSjFO>umu62pxWY;k2Bn5pIoWlhy_l}hhwl$Pfm zEjTSfoGFl?pp`hXi zqs3!pol5NzrQ%kWKHbVcB|n)m_sh)CMl_otDkFs_8v`n}k?mLXek*&g(GE(PFGMpn zIj4wN-o{oOOcUs0%Dsz3T<}kkhzq`l^fRQlkbaKz3#7M^4zSvhWgalUvN7UusWIYl zRgJxa{KLGl_~Q4`^~(l{{G^4PDFdbGmlb(XnIK8?uv?>$MY1Nga zQyGNwVgn#LbrsR53?Zjcb9fqV@O4Q@Q!WdA%HUiS3L~;_71E{*>6kz|j%N!zSE#vV zrAryEOH6|+O_MShoF>iToQrwY4n4|*a(eVx(xMC!r$t+sCY_-}87@wTV#ahbR*KHW z^hZzfZs~kX4D1G^5|V*bMw&-jKr)e@Neq<)N@s5ZN@s5Zx(P`I^gi-eD7H#MQ^i)P zpgjPzXBu-Q0jpxJRDg-I%dt;91s@DzUV`F>cp6}e#ZrN)B7d0=`3wa=t(Ndux z4lIXh?g$CM;Bpdx;Oeo(BJsvqwn zf5k}#hLe*Fg!4cGP6zp`kAz?y;Uolgq%WZ(F7j6kNx|TAl7iqLNr3MmzoR4u!*mp~ z$O047Oqh-%spjw^@;gm(Fj$=AAXujoU_C^ByCg{LTlg?8fyJIlL&ixE0<@F>=n?W) z1xdn`$w?BzPBCe!F|H$jSxJ;+4X1oZM_;W=t#cBEkUvg9{vPr>MY1qBoMa(56vL)c zeTdhp3HuT9J3<2G0H6F-H}A=q=n0WPr1;+; zse1A;@>@9lXOcuYIuQHvo#W;t5#j!A0`582cI63Pe@XC>zDD{qe>cL7Uim#rN)IR;b0+vM zrgeM!4M1}6-!kxjYXf|Cta?gM=yGkeC+!*EKSjF5$K**H-Aeq1CZ#v3acRjC|2fhL zJ~sHs|N9I6KR>;A#qj8oDK3Lgmh#70_VS9iaYX}{sC)by;<4B}KYN%*s`mH+Z<}xE z-om6Mg!d_&5gwR^{X8YOwa35jJdn{wb3iP4GOB=BA6@^+jJDW~<&5ar;f$8zA$No< z8gIK!+!sEoXe|<&OVz{B+_k}t-~Ebe{Kjv3^sYaI{X?-f_#Ie9&@TaLFX(qFRTPWU z&59l-2p40G@hg$6F;ze@HIN)oyf(PO+Mg;R8fJ_Z*+Pqc%J5LYXgc_e$^<@F1oPV9 z^60C%`VkL+COOdn=(R!Ar)s`N;zOx650&omFK}uxEU6bbBeB(3#JGZaB>6%iqrvjT zVE6cUD9^_*g;pmmfSWp)BY?ZdzXW+M8FPl0(H#8kYhd_rGUCQHMrDlnspOhXvE2f2k5tnowX87xv$1w^T`-eMN{;OJhhu0Y)_l0c zldDqy_@w~2Be?mla%p&6J1WI)4)}ZDfJ#@qro5%4zGKkihsnRJ=t!&$dC#hQ8n+hK z2|uoP(w(g0CVkQLD)kAYY+6RC=dxaLjrBJT*RDJ?O5L;0qR~wb++cQeeKGpWIAbl< zQU0{e<<^=o!(Vi1{w0`^>}IUSZxyg#HMo#nF?u*>ci=XRx~}2P)@#N(ao2gnxLvDH z*+sq5?LoEMCk))>w{-gDrJ2P!QuLOHH{9fP#y#7eyf|}K`*^FF_D$!TbxT4kl`{&TbogAn*h>q8D0`OF;^h&wuSqr%GmFb?L=;&(T*xj zX%0gkKbnM6L#xx1_@_rz^CD#Xf}^nWEM?SB9O literal 928 zcmcgrJx{|h5G@e;0knk%RqDXP09#VN1V{{2RFqH@RZtKcauc@=I8GEhl>7m9MkXc} zHW(TC1&9fWKf{?OqKc5p0+yamzI(ZMzPmK)waQc?k*I7h7L~ew^YQjPx88erT6^ET z+j_me-z&X5ma?a}-YAg5GXnNZJ!aTrsuv(?BcqFKRiSHqM7l*$%Ek&SToC^$^QCe8;Ex`8h*O)yJeDe zWaCtrNYj#f)1Nad_L2-x6YSY){31@Ckc({-Xc@ diff --git a/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.csproj.AssemblyReference.cache b/AlayaCore/obj/Debug/netstandard2.1/AlayaCore.csproj.AssemblyReference.cache index ed409144b5d578cbf064cef09f6b85e16908d05a..f394b67dea4521e07b7860a7436e1865b4ce58fe 100644 GIT binary patch literal 11617 zcmds7dt4ON9%pz6feI+3sF;Y?0%3NSg>?am$BKv|pa^RDV0LGAS=^n$nc;agEGSwJ-_ew z_c-TwrUx|8&dv_X5TsKWNeRe81lJ;pEJQ1S@mv)~3vv*}Y(#}o0)X zL-%2Phl;_a<9skH@Tq@?;!HGyhGc-bstG)bod+xo8Y0Wp(77ZQg=4uiiD-g`q~^*s zYQ=c0a56C)!=vzAjfNeK8IbOfu`rTLXTe&vf+Q$HNejfV7#7*GJ(kg#V9?>92s}RQ zxbzYO#Q+n7;P&E>1DGZAPX~Zu-r&0>WF}f4hy#k9bccabb_^&5q16&N#d?R(7D6(e zFbB;fw{cmEFEG&bHMK}DXY>{h4c(PROvYIlfdhl_8t~UaubJC1Fw{7R3ylUNVH_ir z1gX+RjZItYc|BSM7ZVTF=}b zrprC=fXg2Cy6=Cv|}v*-6)ynzhgyWBmu)UMB_o~hF9<=YPj9yxmp zashKXBwFXwdT)0GG}+8jjw(HZe7szaibdgaQ8aDI7sE}cui;nCKHF2I%ZN~nLCwTo_V@Xi+pZK8 z**4Lb`C++210z%+u2ADNMk)~nsESg{W{U(|@{a>*v5Z=xQH{ew6nxF^2i9wSpQyp| zZi-DOe0cm@b;k=PuM0i!*?`FYc2^_+-m~jwxE<~2E!pz(@uuQgj;Gw;oRhw_YHYVXLmv&*WWPPqHR*eY2VP@mOVE1?e9SyglqhK))}W`u@BrRvh8$)O7gt2Tv4dTvoQq? z{u4&z6j*7n*E%n-uqH6|f_QGY(Z=Btjl;#7499uLeUC5q1+z6Vj6if}z zzz-rTfAkvA@7Qbi>amM6o1Mn5Jf%1|DtlivxjkaXuTkzt{}Z}2FJ(u~r$?x$X0K`0 z+s90GSolQ+U3c|$bniD;6aH9vz`0~l#iGE|2U%OH_7_S6E>>qk1y6;?Q+N}C%EL#7 zi=`pqD2iYbLkY2i%AVGnG=xf}##OvLNNAErOn6Vy4`JDB+Ez`|drg2vlq_j?Ur*8S z#-J;`gX&1CQG?tKTvsG|LQ_dgH8jJj z%^bTrc=?nPAtC{lBosx%rQw(q!E|5&xXL>e{AT>ZCZ$D7A)2S++aw!I0Aq0cw~-!s zI{r=r4s2^zK!+=u>C`PGpD`0x~>cx zy!idvXfN*@d!j$_6ji%@FRs6p>8A>Qw|}c>YxSXC>zxJvIzR6K(cu1Q+VaL9!mcHS zFN>EsxBMKraJW}gbwk_g1;o2wJxEAxes?;0wf~3lm+sFF9MLDC>L@m%?Wl{>jBRX! z5Pc!dsFEayL0Npv=X^njKc8G77Ri-jX_y2-#gb4=9A*Fynq|8b;8;El7Mh^F1ZPtO zE)a>qwj$J00Z8T~#{o$$>_cUnAKYh~Z0=?dFV5AtCC-zVhV1tE z=G04g+FYlEVGsUU|GX^z_Yp6nLjuli?Rj+K%98YuW#cX^aa`K z`%HZFz+smf5%gZIi_fas(tyuZ6U*u3?G;q~zRl#+oBh7)bMnx^of}^tJMU!cpA`!# z%iTjfq7VB9c*eb2Psi9FW4RPorTnsUbM=3rG&4&%+E@U2^?1ZW1PxVU5_t$BK`;z8 zUWKNMfhiQa@egz!zIAbC~qAZOOlY!ub*(Cf4-q1n%h zEZe{U4G24?A;GZO2?qCXNZ$HaMedr*ErET?Hi{hX`1KZ)EpZ>CR_yTq=i!f=Do!l> zVEE1Nyv`lj-S30(4Ux}h?7bB{PIYmvPZ{=dulMUiAFLctOpUaMU5mDUEWGbrE?Aq@ zWhSR}UHtrN+GVoZW4lp>KNR5?;?Wb!Q@$(SmnXiN*EYD9$-6s=Z( zT_1N%p3@Iu;&%eR(Jmk`FnwyfR$^2KAW4l;%etdUFy};4wf~ z|1Fl)mFaXjADDM)h){OqwJe2 z7X9gvr&*A+rfl%e$m?sH&RnRyxc0Q9ub+LX8#(HK^H&wuUCH-Y@uhQqN zo7YQ!au=PR)U&*H`CPYm7nOQtCx-OEz zsTQ0?(>c0oY^BF16zI822GV00>Gl=5)pMr5uC?c7NsxuYl-X_**;6c;%Msc6M&2_1 zp-kq2owXJN$Clb05SAo3<;+uqc!qOv3Q_8Ey5+XD&J!l-^}#U|tDk1jPiOVHkWSk< zbI+I!3BtjL~2WE)96CyP-O8hDif~=6G0FHy+n^K|Ai*N(EZ}AaEYSoX>*| zuQ;O{ zdV?RA?!L>u=~iv#$nE^vkH^y_l&;dV9q=gwM|OgEGJ?9-FXzM5&6n!YSPN)%_J$r;YhgU<@2-NQsYQj>|XunN&)Y}?p^ zOA7@i^MVtABxm-wSwr>Dkb0O485_lhUV_1Xi?%12t8)M_-E2{Z0m!x;;^qLr>;Wj~ pt6DzqHlHEf{;ZRGoYvc-Bnt!cW>{E15sxH`V{o9bv+O7+{|78;u4n)N delta 13 UcmaDDwU?QhjgfJ4yznkY03PrI=Kufz diff --git a/AlayaCore/obj/project.assets.json b/AlayaCore/obj/project.assets.json index 27806ee..a3915f3 100644 --- a/AlayaCore/obj/project.assets.json +++ b/AlayaCore/obj/project.assets.json @@ -2,6 +2,181 @@ "version": 3, "targets": { ".NETStandard,Version=v2.1": { + "CmlLib.Core/4.0.6": { + "type": "package", + "dependencies": { + "CmlLib.Core.Commons": "4.0.0", + "LZMA-SDK": "19.0.0", + "SharpZipLib": "1.4.2", + "System.Text.Json": "8.0.5", + "System.Threading.Tasks.Dataflow": "8.0.1" + }, + "compile": { + "lib/netstandard2.0/CmlLib.Core.dll": {} + }, + "runtime": { + "lib/netstandard2.0/CmlLib.Core.dll": {} + } + }, + "CmlLib.Core.Auth.Microsoft/3.3.1": { + "type": "package", + "dependencies": { + "CmlLib.Core.Commons": "4.0.0", + "XboxAuthNet.Game": "1.4.1" + }, + "compile": { + "lib/netstandard2.0/CmlLib.Core.Auth.Microsoft.dll": {} + }, + "runtime": { + "lib/netstandard2.0/CmlLib.Core.Auth.Microsoft.dll": {} + } + }, + "CmlLib.Core.Commons/4.0.0": { + "type": "package", + "dependencies": { + "System.Text.Json": "8.0.3" + }, + "compile": { + "lib/netstandard2.0/CmlLib.Core.Commons.dll": {} + }, + "runtime": { + "lib/netstandard2.0/CmlLib.Core.Commons.dll": {} + } + }, + "CmlLib.Core.Installer.NeoForge/4.0.0": { + "type": "package", + "dependencies": { + "CmlLib.Core": "4.0.6", + "HtmlAgilityPack": "1.11.48" + }, + "compile": { + "lib/netstandard2.0/CmlLib.Core.Installer.NeoForge.dll": {} + }, + "runtime": { + "lib/netstandard2.0/CmlLib.Core.Installer.NeoForge.dll": {} + } + }, + "HtmlAgilityPack/1.11.48": { + "type": "package", + "compile": { + "lib/netstandard2.0/HtmlAgilityPack.dll": { + "related": ".deps.json;.pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/HtmlAgilityPack.dll": { + "related": ".deps.json;.pdb;.xml" + } + } + }, + "LZMA-SDK/19.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/SevenZip.dll": { + "related": ".deps.json;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/SevenZip.dll": { + "related": ".deps.json;.xml" + } + } + }, + "Microsoft.Bcl.AsyncInterfaces/8.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.1": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.1", + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5" + }, + "compile": { + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets": {} + } + }, + "Microsoft.Identity.Client/4.61.3": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" + }, + "compile": { + "lib/netstandard2.0/Microsoft.Identity.Client.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Identity.Client.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Identity.Client.Extensions.Msal/4.61.3": { + "type": "package", + "dependencies": { + "Microsoft.Identity.Client": "4.61.3", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + }, + "compile": { + "lib/netstandard2.0/Microsoft.Identity.Client.Extensions.Msal.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Identity.Client.Extensions.Msal.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Abstractions/6.35.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + } + }, "Newtonsoft.Json/13.0.4": { "type": "package", "compile": { @@ -14,10 +189,622 @@ "related": ".xml" } } + }, + "SharpZipLib/1.4.2": { + "type": "package", + "compile": { + "lib/netstandard2.1/ICSharpCode.SharpZipLib.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.1/ICSharpCode.SharpZipLib.dll": { + "related": ".pdb;.xml" + } + } + }, + "System.Buffers/4.5.1": { + "type": "package", + "compile": { + "ref/netstandard2.0/System.Buffers.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Buffers.dll": { + "related": ".xml" + } + } + }, + "System.Diagnostics.DiagnosticSource/6.0.1": { + "type": "package", + "dependencies": { + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "compile": { + "lib/netstandard2.0/System.Diagnostics.DiagnosticSource.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Diagnostics.DiagnosticSource.dll": { + "related": ".xml" + } + } + }, + "System.IO.FileSystem.AccessControl/5.0.0": { + "type": "package", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + }, + "compile": { + "ref/netstandard2.0/System.IO.FileSystem.AccessControl.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.IO.FileSystem.AccessControl.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/win/lib/netstandard2.0/System.IO.FileSystem.AccessControl.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Memory/4.5.5": { + "type": "package", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + }, + "compile": { + "lib/netstandard2.0/System.Memory.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Memory.dll": { + "related": ".xml" + } + } + }, + "System.Net.Http.Json/8.0.0": { + "type": "package", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Text.Json": "8.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "compile": { + "lib/netstandard2.0/System.Net.Http.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Net.Http.Json.dll": { + "related": ".xml" + } + } + }, + "System.Numerics.Vectors/4.4.0": { + "type": "package", + "compile": { + "ref/netstandard2.0/System.Numerics.Vectors.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Numerics.Vectors.dll": { + "related": ".xml" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { + "related": ".xml" + } + } + }, + "System.Security.AccessControl/5.0.0": { + "type": "package", + "dependencies": { + "System.Security.Principal.Windows": "5.0.0" + }, + "compile": { + "ref/netstandard2.0/System.Security.AccessControl.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Security.AccessControl.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Security.Cryptography.ProtectedData/4.5.0": { + "type": "package", + "dependencies": { + "System.Memory": "4.5.0" + }, + "compile": { + "ref/netstandard2.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll": {} + }, + "runtimeTargets": { + "runtimes/win/lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Security.Principal.Windows/5.0.0": { + "type": "package", + "compile": { + "ref/netstandard2.0/System.Security.Principal.Windows.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Security.Principal.Windows.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Text.Encodings.Web/8.0.0": { + "type": "package", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "compile": { + "lib/netstandard2.0/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + } + }, + "System.Text.Json/8.0.5": { + "type": "package", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "8.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "compile": { + "lib/netstandard2.0/System.Text.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Text.Json.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netstandard2.0/System.Text.Json.targets": {} + } + }, + "System.Threading.Tasks.Dataflow/8.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.1/System.Threading.Tasks.Dataflow.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/System.Threading.Tasks.Dataflow.dll": { + "related": ".xml" + } + } + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + }, + "compile": { + "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { + "related": ".xml" + } + } + }, + "XboxAuthNet/3.0.4": { + "type": "package", + "dependencies": { + "System.Net.Http.Json": "8.0.0", + "System.Text.Json": "8.0.4" + }, + "compile": { + "lib/netstandard2.0/XboxAuthNet.dll": {} + }, + "runtime": { + "lib/netstandard2.0/XboxAuthNet.dll": {} + } + }, + "XboxAuthNet.Game/1.4.1": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "8.0.1", + "XboxAuthNet": "3.0.4" + }, + "compile": { + "lib/netstandard2.0/XboxAuthNet.Game.dll": {} + }, + "runtime": { + "lib/netstandard2.0/XboxAuthNet.Game.dll": {} + } + }, + "XboxAuthNet.Game.Msal/0.1.3": { + "type": "package", + "dependencies": { + "Microsoft.Identity.Client": "4.61.3", + "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", + "XboxAuthNet.Game": "1.4.1" + }, + "compile": { + "lib/netstandard2.0/XboxAuthNet.Game.Msal.dll": {} + }, + "runtime": { + "lib/netstandard2.0/XboxAuthNet.Game.Msal.dll": {} + } } } }, "libraries": { + "CmlLib.Core/4.0.6": { + "sha512": "57aUOFdDxfuD+tI3gigMK8jMuICYyw4CvpUj6d5/emdcl+3PscnOBWzj7SzrGRsTZ5RzgavP0dSmRwLfCiZRMA==", + "type": "package", + "path": "cmllib.core/4.0.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "cmllib.core.4.0.6.nupkg.sha512", + "cmllib.core.nuspec", + "icon.png", + "lib/netstandard2.0/CmlLib.Core.dll" + ] + }, + "CmlLib.Core.Auth.Microsoft/3.3.1": { + "sha512": "olPXBRd9SqwyQKxE7FyqfK/zIrlG88WUgk4F1ubvrhLoZQn0xi3nmzUwM/dYWSObt0JnJSyjy+wqwG7heYtqYA==", + "type": "package", + "path": "cmllib.core.auth.microsoft/3.3.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "cmllib.core.auth.microsoft.3.3.1.nupkg.sha512", + "cmllib.core.auth.microsoft.nuspec", + "icon.png", + "lib/netstandard2.0/CmlLib.Core.Auth.Microsoft.dll" + ] + }, + "CmlLib.Core.Commons/4.0.0": { + "sha512": "8yD43GJA9RyFpqR8PGP9LpUKORBgOVXQVwH0OxwXnNp/gNpVQMIiraKdmHbFO5bhO7jujFOg1FdtUIFYYdlykg==", + "type": "package", + "path": "cmllib.core.commons/4.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "cmllib.core.commons.4.0.0.nupkg.sha512", + "cmllib.core.commons.nuspec", + "icon.png", + "lib/netstandard2.0/CmlLib.Core.Commons.dll" + ] + }, + "CmlLib.Core.Installer.NeoForge/4.0.0": { + "sha512": "+UmX/b5wN2mZLe8cf5F7NqpBIKftglua6Mip7+y3jo6Kp7l54ViCX8wVBv4rp9vpCtdUW/G2VKQlsC/CH5racw==", + "type": "package", + "path": "cmllib.core.installer.neoforge/4.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "cmllib.core.installer.neoforge.4.0.0.nupkg.sha512", + "cmllib.core.installer.neoforge.nuspec", + "icon.png", + "lib/netstandard2.0/CmlLib.Core.Installer.NeoForge.dll" + ] + }, + "HtmlAgilityPack/1.11.48": { + "sha512": "BTYfqMoTtnlUz5hqJZ3qxh/SDWMtJAulcz2vIr2TRj5BhfdJZD1E1HSpNI9rvIQiYJzl2xoVtCNzCcANjzbScQ==", + "type": "package", + "path": "htmlagilitypack/1.11.48", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "htmlagilitypack.1.11.48.nupkg.sha512", + "htmlagilitypack.nuspec", + "lib/Net35/HtmlAgilityPack.dll", + "lib/Net35/HtmlAgilityPack.pdb", + "lib/Net35/HtmlAgilityPack.xml", + "lib/Net40-client/HtmlAgilityPack.dll", + "lib/Net40-client/HtmlAgilityPack.pdb", + "lib/Net40-client/HtmlAgilityPack.xml", + "lib/Net40/HtmlAgilityPack.XML", + "lib/Net40/HtmlAgilityPack.dll", + "lib/Net40/HtmlAgilityPack.pdb", + "lib/Net45/HtmlAgilityPack.XML", + "lib/Net45/HtmlAgilityPack.dll", + "lib/Net45/HtmlAgilityPack.pdb", + "lib/NetCore45/HtmlAgilityPack.XML", + "lib/NetCore45/HtmlAgilityPack.dll", + "lib/NetCore45/HtmlAgilityPack.pdb", + "lib/netstandard1.3/HtmlAgilityPack.deps.json", + "lib/netstandard1.3/HtmlAgilityPack.dll", + "lib/netstandard1.3/HtmlAgilityPack.pdb", + "lib/netstandard1.3/HtmlAgilityPack.xml", + "lib/netstandard1.6/HtmlAgilityPack.deps.json", + "lib/netstandard1.6/HtmlAgilityPack.dll", + "lib/netstandard1.6/HtmlAgilityPack.pdb", + "lib/netstandard1.6/HtmlAgilityPack.xml", + "lib/netstandard2.0/HtmlAgilityPack.deps.json", + "lib/netstandard2.0/HtmlAgilityPack.dll", + "lib/netstandard2.0/HtmlAgilityPack.pdb", + "lib/netstandard2.0/HtmlAgilityPack.xml", + "lib/portable-net45+netcore45+wp8+MonoAndroid+MonoTouch/HtmlAgilityPack.XML", + "lib/portable-net45+netcore45+wp8+MonoAndroid+MonoTouch/HtmlAgilityPack.dll", + "lib/portable-net45+netcore45+wp8+MonoAndroid+MonoTouch/HtmlAgilityPack.pdb", + "lib/portable-net45+netcore45+wpa81+wp8+MonoAndroid+MonoTouch/HtmlAgilityPack.XML", + "lib/portable-net45+netcore45+wpa81+wp8+MonoAndroid+MonoTouch/HtmlAgilityPack.dll", + "lib/portable-net45+netcore45+wpa81+wp8+MonoAndroid+MonoTouch/HtmlAgilityPack.pdb", + "lib/uap10.0/HtmlAgilityPack.XML", + "lib/uap10.0/HtmlAgilityPack.dll", + "lib/uap10.0/HtmlAgilityPack.pdb", + "lib/uap10.0/HtmlAgilityPack.pri" + ] + }, + "LZMA-SDK/19.0.0": { + "sha512": "/4yPB/YNtttdbxmHifyNUw6rUiBqCCUgeuokXsWvM/X9CDXJq1eQdI9uVgNpJdrzAZhTIAqNzbOP7Z2ogZt+2g==", + "type": "package", + "path": "lzma-sdk/19.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "7z_rm01.jpg", + "lib/net20/SevenZip.dll", + "lib/net20/SevenZip.xml", + "lib/netstandard2.0/SevenZip.deps.json", + "lib/netstandard2.0/SevenZip.dll", + "lib/netstandard2.0/SevenZip.xml", + "lzma-sdk.19.0.0.nupkg.sha512", + "lzma-sdk.nuspec" + ] + }, + "Microsoft.Bcl.AsyncInterfaces/8.0.0": { + "sha512": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", + "type": "package", + "path": "microsoft.bcl.asyncinterfaces/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Bcl.AsyncInterfaces.targets", + "buildTransitive/net462/_._", + "lib/net462/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/net462/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml", + "microsoft.bcl.asyncinterfaces.8.0.0.nupkg.sha512", + "microsoft.bcl.asyncinterfaces.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.1": { + "sha512": "fGLiCRLMYd00JYpClraLjJTNKLmMJPnqxMaiRzEBIIvevlzxz33mXy39Lkd48hu1G+N21S7QpaO5ZzKsI6FRuA==", + "type": "package", + "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "microsoft.extensions.dependencyinjection.abstractions.8.0.1.nupkg.sha512", + "microsoft.extensions.dependencyinjection.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.1": { + "sha512": "RIFgaqoaINxkM2KTOw72dmilDmTrYA0ns2KW4lDz4gZ2+o6IQ894CzmdL3StM2oh7QQq44nCWiqKqc4qUI9Jmg==", + "type": "package", + "path": "microsoft.extensions.logging.abstractions/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", + "microsoft.extensions.logging.abstractions.8.0.1.nupkg.sha512", + "microsoft.extensions.logging.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Identity.Client/4.61.3": { + "sha512": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", + "type": "package", + "path": "microsoft.identity.client/4.61.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net462/Microsoft.Identity.Client.dll", + "lib/net462/Microsoft.Identity.Client.xml", + "lib/net6.0-android31.0/Microsoft.Identity.Client.dll", + "lib/net6.0-android31.0/Microsoft.Identity.Client.xml", + "lib/net6.0-ios15.4/Microsoft.Identity.Client.dll", + "lib/net6.0-ios15.4/Microsoft.Identity.Client.xml", + "lib/net6.0/Microsoft.Identity.Client.dll", + "lib/net6.0/Microsoft.Identity.Client.xml", + "lib/netstandard2.0/Microsoft.Identity.Client.dll", + "lib/netstandard2.0/Microsoft.Identity.Client.xml", + "microsoft.identity.client.4.61.3.nupkg.sha512", + "microsoft.identity.client.nuspec" + ] + }, + "Microsoft.Identity.Client.Extensions.Msal/4.61.3": { + "sha512": "PWnJcznrSGr25MN8ajlc2XIDW4zCFu0U6FkpaNLEWLgd1NgFCp5uDY3mqLDgM8zCN8hqj8yo5wHYfLB2HjcdGw==", + "type": "package", + "path": "microsoft.identity.client.extensions.msal/4.61.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net6.0/Microsoft.Identity.Client.Extensions.Msal.dll", + "lib/net6.0/Microsoft.Identity.Client.Extensions.Msal.xml", + "lib/netstandard2.0/Microsoft.Identity.Client.Extensions.Msal.dll", + "lib/netstandard2.0/Microsoft.Identity.Client.Extensions.Msal.xml", + "microsoft.identity.client.extensions.msal.4.61.3.nupkg.sha512", + "microsoft.identity.client.extensions.msal.nuspec" + ] + }, + "Microsoft.IdentityModel.Abstractions/6.35.0": { + "sha512": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==", + "type": "package", + "path": "microsoft.identitymodel.abstractions/6.35.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net45/Microsoft.IdentityModel.Abstractions.dll", + "lib/net45/Microsoft.IdentityModel.Abstractions.xml", + "lib/net461/Microsoft.IdentityModel.Abstractions.dll", + "lib/net461/Microsoft.IdentityModel.Abstractions.xml", + "lib/net462/Microsoft.IdentityModel.Abstractions.dll", + "lib/net462/Microsoft.IdentityModel.Abstractions.xml", + "lib/net472/Microsoft.IdentityModel.Abstractions.dll", + "lib/net472/Microsoft.IdentityModel.Abstractions.xml", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.xml", + "microsoft.identitymodel.abstractions.6.35.0.nupkg.sha512", + "microsoft.identitymodel.abstractions.nuspec" + ] + }, "Newtonsoft.Json/13.0.4": { "sha512": "pdgNNMai3zv51W5aq268sujXUyx7SNdE2bj1wZcWjAQrKMFZV260lbqYop1d2GM67JI1huLRwxo9ZqnfF/lC6A==", "type": "package", @@ -47,11 +834,616 @@ "newtonsoft.json.nuspec", "packageIcon.png" ] + }, + "SharpZipLib/1.4.2": { + "sha512": "yjj+3zgz8zgXpiiC3ZdF/iyTBbz2fFvMxZFEBPUcwZjIvXOf37Ylm+K58hqMfIBt5JgU/Z2uoUS67JmTLe973A==", + "type": "package", + "path": "sharpziplib/1.4.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "images/sharpziplib-nuget-256x256.png", + "lib/net6.0/ICSharpCode.SharpZipLib.dll", + "lib/net6.0/ICSharpCode.SharpZipLib.pdb", + "lib/net6.0/ICSharpCode.SharpZipLib.xml", + "lib/netstandard2.0/ICSharpCode.SharpZipLib.dll", + "lib/netstandard2.0/ICSharpCode.SharpZipLib.pdb", + "lib/netstandard2.0/ICSharpCode.SharpZipLib.xml", + "lib/netstandard2.1/ICSharpCode.SharpZipLib.dll", + "lib/netstandard2.1/ICSharpCode.SharpZipLib.pdb", + "lib/netstandard2.1/ICSharpCode.SharpZipLib.xml", + "sharpziplib.1.4.2.nupkg.sha512", + "sharpziplib.nuspec" + ] + }, + "System.Buffers/4.5.1": { + "sha512": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", + "type": "package", + "path": "system.buffers/4.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/System.Buffers.dll", + "lib/net461/System.Buffers.xml", + "lib/netcoreapp2.0/_._", + "lib/netstandard1.1/System.Buffers.dll", + "lib/netstandard1.1/System.Buffers.xml", + "lib/netstandard2.0/System.Buffers.dll", + "lib/netstandard2.0/System.Buffers.xml", + "lib/uap10.0.16299/_._", + "ref/net45/System.Buffers.dll", + "ref/net45/System.Buffers.xml", + "ref/netcoreapp2.0/_._", + "ref/netstandard1.1/System.Buffers.dll", + "ref/netstandard1.1/System.Buffers.xml", + "ref/netstandard2.0/System.Buffers.dll", + "ref/netstandard2.0/System.Buffers.xml", + "ref/uap10.0.16299/_._", + "system.buffers.4.5.1.nupkg.sha512", + "system.buffers.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Diagnostics.DiagnosticSource/6.0.1": { + "sha512": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "type": "package", + "path": "system.diagnostics.diagnosticsource/6.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Diagnostics.DiagnosticSource.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Diagnostics.DiagnosticSource.dll", + "lib/net461/System.Diagnostics.DiagnosticSource.xml", + "lib/net5.0/System.Diagnostics.DiagnosticSource.dll", + "lib/net5.0/System.Diagnostics.DiagnosticSource.xml", + "lib/net6.0/System.Diagnostics.DiagnosticSource.dll", + "lib/net6.0/System.Diagnostics.DiagnosticSource.xml", + "lib/netstandard2.0/System.Diagnostics.DiagnosticSource.dll", + "lib/netstandard2.0/System.Diagnostics.DiagnosticSource.xml", + "system.diagnostics.diagnosticsource.6.0.1.nupkg.sha512", + "system.diagnostics.diagnosticsource.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.IO.FileSystem.AccessControl/5.0.0": { + "sha512": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "type": "package", + "path": "system.io.filesystem.accesscontrol/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net46/System.IO.FileSystem.AccessControl.dll", + "lib/net461/System.IO.FileSystem.AccessControl.dll", + "lib/net461/System.IO.FileSystem.AccessControl.xml", + "lib/netstandard1.3/System.IO.FileSystem.AccessControl.dll", + "lib/netstandard2.0/System.IO.FileSystem.AccessControl.dll", + "lib/netstandard2.0/System.IO.FileSystem.AccessControl.xml", + "ref/net46/System.IO.FileSystem.AccessControl.dll", + "ref/net461/System.IO.FileSystem.AccessControl.dll", + "ref/net461/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/System.IO.FileSystem.AccessControl.dll", + "ref/netstandard1.3/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/de/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/es/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/fr/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/it/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/ja/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/ko/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/ru/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/zh-hans/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard1.3/zh-hant/System.IO.FileSystem.AccessControl.xml", + "ref/netstandard2.0/System.IO.FileSystem.AccessControl.dll", + "ref/netstandard2.0/System.IO.FileSystem.AccessControl.xml", + "runtimes/win/lib/net46/System.IO.FileSystem.AccessControl.dll", + "runtimes/win/lib/net461/System.IO.FileSystem.AccessControl.dll", + "runtimes/win/lib/net461/System.IO.FileSystem.AccessControl.xml", + "runtimes/win/lib/netstandard1.3/System.IO.FileSystem.AccessControl.dll", + "runtimes/win/lib/netstandard2.0/System.IO.FileSystem.AccessControl.dll", + "runtimes/win/lib/netstandard2.0/System.IO.FileSystem.AccessControl.xml", + "system.io.filesystem.accesscontrol.5.0.0.nupkg.sha512", + "system.io.filesystem.accesscontrol.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Memory/4.5.5": { + "sha512": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "type": "package", + "path": "system.memory/4.5.5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/System.Memory.dll", + "lib/net461/System.Memory.xml", + "lib/netcoreapp2.1/_._", + "lib/netstandard1.1/System.Memory.dll", + "lib/netstandard1.1/System.Memory.xml", + "lib/netstandard2.0/System.Memory.dll", + "lib/netstandard2.0/System.Memory.xml", + "ref/netcoreapp2.1/_._", + "system.memory.4.5.5.nupkg.sha512", + "system.memory.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Net.Http.Json/8.0.0": { + "sha512": "48Bxrd6zcGeQzS4GMEDVjuqCcAw/9wcEWnIu48FQJ5IzfKPiMR1nGtz9LrvGzU4+3TLbx/9FDlGmCUeLin1Eqg==", + "type": "package", + "path": "system.net.http.json/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Net.Http.Json.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Net.Http.Json.targets", + "lib/net462/System.Net.Http.Json.dll", + "lib/net462/System.Net.Http.Json.xml", + "lib/net6.0/System.Net.Http.Json.dll", + "lib/net6.0/System.Net.Http.Json.xml", + "lib/net7.0/System.Net.Http.Json.dll", + "lib/net7.0/System.Net.Http.Json.xml", + "lib/net8.0/System.Net.Http.Json.dll", + "lib/net8.0/System.Net.Http.Json.xml", + "lib/netstandard2.0/System.Net.Http.Json.dll", + "lib/netstandard2.0/System.Net.Http.Json.xml", + "system.net.http.json.8.0.0.nupkg.sha512", + "system.net.http.json.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Numerics.Vectors/4.4.0": { + "sha512": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", + "type": "package", + "path": "system.numerics.vectors/4.4.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Numerics.Vectors.dll", + "lib/net46/System.Numerics.Vectors.xml", + "lib/netcoreapp2.0/_._", + "lib/netstandard1.0/System.Numerics.Vectors.dll", + "lib/netstandard1.0/System.Numerics.Vectors.xml", + "lib/netstandard2.0/System.Numerics.Vectors.dll", + "lib/netstandard2.0/System.Numerics.Vectors.xml", + "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll", + "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Numerics.Vectors.dll", + "ref/net46/System.Numerics.Vectors.xml", + "ref/netcoreapp2.0/_._", + "ref/netstandard1.0/System.Numerics.Vectors.dll", + "ref/netstandard1.0/System.Numerics.Vectors.xml", + "ref/netstandard2.0/System.Numerics.Vectors.dll", + "ref/netstandard2.0/System.Numerics.Vectors.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.numerics.vectors.4.4.0.nupkg.sha512", + "system.numerics.vectors.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "sha512": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", + "type": "package", + "path": "system.runtime.compilerservices.unsafe/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net461/System.Runtime.CompilerServices.Unsafe.xml", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", + "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "system.runtime.compilerservices.unsafe.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Security.AccessControl/5.0.0": { + "sha512": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "type": "package", + "path": "system.security.accesscontrol/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net46/System.Security.AccessControl.dll", + "lib/net461/System.Security.AccessControl.dll", + "lib/net461/System.Security.AccessControl.xml", + "lib/netstandard1.3/System.Security.AccessControl.dll", + "lib/netstandard2.0/System.Security.AccessControl.dll", + "lib/netstandard2.0/System.Security.AccessControl.xml", + "lib/uap10.0.16299/_._", + "ref/net46/System.Security.AccessControl.dll", + "ref/net461/System.Security.AccessControl.dll", + "ref/net461/System.Security.AccessControl.xml", + "ref/netstandard1.3/System.Security.AccessControl.dll", + "ref/netstandard1.3/System.Security.AccessControl.xml", + "ref/netstandard1.3/de/System.Security.AccessControl.xml", + "ref/netstandard1.3/es/System.Security.AccessControl.xml", + "ref/netstandard1.3/fr/System.Security.AccessControl.xml", + "ref/netstandard1.3/it/System.Security.AccessControl.xml", + "ref/netstandard1.3/ja/System.Security.AccessControl.xml", + "ref/netstandard1.3/ko/System.Security.AccessControl.xml", + "ref/netstandard1.3/ru/System.Security.AccessControl.xml", + "ref/netstandard1.3/zh-hans/System.Security.AccessControl.xml", + "ref/netstandard1.3/zh-hant/System.Security.AccessControl.xml", + "ref/netstandard2.0/System.Security.AccessControl.dll", + "ref/netstandard2.0/System.Security.AccessControl.xml", + "ref/uap10.0.16299/_._", + "runtimes/win/lib/net46/System.Security.AccessControl.dll", + "runtimes/win/lib/net461/System.Security.AccessControl.dll", + "runtimes/win/lib/net461/System.Security.AccessControl.xml", + "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll", + "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.xml", + "runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll", + "runtimes/win/lib/uap10.0.16299/_._", + "system.security.accesscontrol.5.0.0.nupkg.sha512", + "system.security.accesscontrol.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Security.Cryptography.ProtectedData/4.5.0": { + "sha512": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==", + "type": "package", + "path": "system.security.cryptography.protecteddata/4.5.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Security.Cryptography.ProtectedData.dll", + "lib/net461/System.Security.Cryptography.ProtectedData.dll", + "lib/netstandard1.3/System.Security.Cryptography.ProtectedData.dll", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Security.Cryptography.ProtectedData.dll", + "ref/net461/System.Security.Cryptography.ProtectedData.dll", + "ref/net461/System.Security.Cryptography.ProtectedData.xml", + "ref/netstandard1.3/System.Security.Cryptography.ProtectedData.dll", + "ref/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "ref/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/win/lib/net46/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "system.security.cryptography.protecteddata.4.5.0.nupkg.sha512", + "system.security.cryptography.protecteddata.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Security.Principal.Windows/5.0.0": { + "sha512": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==", + "type": "package", + "path": "system.security.principal.windows/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net46/System.Security.Principal.Windows.dll", + "lib/net461/System.Security.Principal.Windows.dll", + "lib/net461/System.Security.Principal.Windows.xml", + "lib/netstandard1.3/System.Security.Principal.Windows.dll", + "lib/netstandard2.0/System.Security.Principal.Windows.dll", + "lib/netstandard2.0/System.Security.Principal.Windows.xml", + "lib/uap10.0.16299/_._", + "ref/net46/System.Security.Principal.Windows.dll", + "ref/net461/System.Security.Principal.Windows.dll", + "ref/net461/System.Security.Principal.Windows.xml", + "ref/netcoreapp3.0/System.Security.Principal.Windows.dll", + "ref/netcoreapp3.0/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/System.Security.Principal.Windows.dll", + "ref/netstandard1.3/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", + "ref/netstandard2.0/System.Security.Principal.Windows.dll", + "ref/netstandard2.0/System.Security.Principal.Windows.xml", + "ref/uap10.0.16299/_._", + "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", + "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", + "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", + "runtimes/win/lib/net461/System.Security.Principal.Windows.dll", + "runtimes/win/lib/net461/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", + "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", + "runtimes/win/lib/uap10.0.16299/_._", + "system.security.principal.windows.5.0.0.nupkg.sha512", + "system.security.principal.windows.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Text.Encodings.Web/8.0.0": { + "sha512": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", + "type": "package", + "path": "system.text.encodings.web/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Text.Encodings.Web.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Text.Encodings.Web.targets", + "lib/net462/System.Text.Encodings.Web.dll", + "lib/net462/System.Text.Encodings.Web.xml", + "lib/net6.0/System.Text.Encodings.Web.dll", + "lib/net6.0/System.Text.Encodings.Web.xml", + "lib/net7.0/System.Text.Encodings.Web.dll", + "lib/net7.0/System.Text.Encodings.Web.xml", + "lib/net8.0/System.Text.Encodings.Web.dll", + "lib/net8.0/System.Text.Encodings.Web.xml", + "lib/netstandard2.0/System.Text.Encodings.Web.dll", + "lib/netstandard2.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net7.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net7.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.xml", + "system.text.encodings.web.8.0.0.nupkg.sha512", + "system.text.encodings.web.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Text.Json/8.0.5": { + "sha512": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==", + "type": "package", + "path": "system.text.json/8.0.5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "buildTransitive/net461/System.Text.Json.targets", + "buildTransitive/net462/System.Text.Json.targets", + "buildTransitive/net6.0/System.Text.Json.targets", + "buildTransitive/netcoreapp2.0/System.Text.Json.targets", + "buildTransitive/netstandard2.0/System.Text.Json.targets", + "lib/net462/System.Text.Json.dll", + "lib/net462/System.Text.Json.xml", + "lib/net6.0/System.Text.Json.dll", + "lib/net6.0/System.Text.Json.xml", + "lib/net7.0/System.Text.Json.dll", + "lib/net7.0/System.Text.Json.xml", + "lib/net8.0/System.Text.Json.dll", + "lib/net8.0/System.Text.Json.xml", + "lib/netstandard2.0/System.Text.Json.dll", + "lib/netstandard2.0/System.Text.Json.xml", + "system.text.json.8.0.5.nupkg.sha512", + "system.text.json.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Threading.Tasks.Dataflow/8.0.1": { + "sha512": "4pjq2vIPNZkKA9asAXzf5IRBb7K+b0+UQZZbpv6g029sAPZgnKdg/NNOC/DbJL8SWqYcFMVjb/T/YEmb0PHUYg==", + "type": "package", + "path": "system.threading.tasks.dataflow/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Threading.Tasks.Dataflow.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Threading.Tasks.Dataflow.targets", + "lib/net462/System.Threading.Tasks.Dataflow.dll", + "lib/net462/System.Threading.Tasks.Dataflow.xml", + "lib/net6.0/System.Threading.Tasks.Dataflow.dll", + "lib/net6.0/System.Threading.Tasks.Dataflow.xml", + "lib/net7.0/System.Threading.Tasks.Dataflow.dll", + "lib/net7.0/System.Threading.Tasks.Dataflow.xml", + "lib/net8.0/System.Threading.Tasks.Dataflow.dll", + "lib/net8.0/System.Threading.Tasks.Dataflow.xml", + "lib/netstandard2.0/System.Threading.Tasks.Dataflow.dll", + "lib/netstandard2.0/System.Threading.Tasks.Dataflow.xml", + "lib/netstandard2.1/System.Threading.Tasks.Dataflow.dll", + "lib/netstandard2.1/System.Threading.Tasks.Dataflow.xml", + "system.threading.tasks.dataflow.8.0.1.nupkg.sha512", + "system.threading.tasks.dataflow.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "sha512": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "type": "package", + "path": "system.threading.tasks.extensions/4.5.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net461/System.Threading.Tasks.Extensions.dll", + "lib/net461/System.Threading.Tasks.Extensions.xml", + "lib/netcoreapp2.1/_._", + "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", + "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", + "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll", + "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml", + "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", + "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/netcoreapp2.1/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.threading.tasks.extensions.4.5.4.nupkg.sha512", + "system.threading.tasks.extensions.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "XboxAuthNet/3.0.4": { + "sha512": "P9PzZkhULaN4N0/KFFlB4mNTYLcyffoL7Rzo0R6743rKmVCUam+xTfR4NQbS8GXbf+fzliyicRCn9w/BPW31Nw==", + "type": "package", + "path": "xboxauthnet/3.0.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net472/XboxAuthNet.dll", + "lib/net6.0-windows7.0/XboxAuthNet.dll", + "lib/netstandard2.0/XboxAuthNet.dll", + "xboxauthnet.3.0.4.nupkg.sha512", + "xboxauthnet.nuspec" + ] + }, + "XboxAuthNet.Game/1.4.1": { + "sha512": "4EfaNtWc+K4/TxYE7KA3sjSo6xRDogeKEF0zRm0pVsFhVvABxubQ668+ohDflcDFjUX1sWswpvzGbK0zOeb/tw==", + "type": "package", + "path": "xboxauthnet.game/1.4.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/netstandard2.0/XboxAuthNet.Game.dll", + "xboxauthnet.game.1.4.1.nupkg.sha512", + "xboxauthnet.game.nuspec" + ] + }, + "XboxAuthNet.Game.Msal/0.1.3": { + "sha512": "+thPPJUIAlZbN1qvwmD6nVgYOQrmPUvNfRlfg+DEpA8dW5BUiqHxVoI/JUA6ylzxxwAwMTT105EsDvben7Vmog==", + "type": "package", + "path": "xboxauthnet.game.msal/0.1.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/netstandard2.0/XboxAuthNet.Game.Msal.dll", + "xboxauthnet.game.msal.0.1.3.nupkg.sha512", + "xboxauthnet.game.msal.nuspec" + ] } }, "projectFileDependencyGroups": { ".NETStandard,Version=v2.1": [ - "Newtonsoft.Json >= 13.0.4" + "CmlLib.Core >= 4.0.6", + "CmlLib.Core.Auth.Microsoft >= 3.3.1", + "CmlLib.Core.Installer.NeoForge >= 4.0.0", + "Newtonsoft.Json >= 13.0.4", + "XboxAuthNet.Game.Msal >= 0.1.3" ] }, "packageFolders": { @@ -97,9 +1489,25 @@ "netstandard2.1": { "targetAlias": "netstandard2.1", "dependencies": { + "CmlLib.Core": { + "target": "Package", + "version": "[4.0.6, )" + }, + "CmlLib.Core.Auth.Microsoft": { + "target": "Package", + "version": "[3.3.1, )" + }, + "CmlLib.Core.Installer.NeoForge": { + "target": "Package", + "version": "[4.0.0, )" + }, "Newtonsoft.Json": { "target": "Package", "version": "[13.0.4, )" + }, + "XboxAuthNet.Game.Msal": { + "target": "Package", + "version": "[0.1.3, )" } }, "imports": [ diff --git a/AlayaCore/obj/project.nuget.cache b/AlayaCore/obj/project.nuget.cache index 1c53788..1ee3dd6 100644 --- a/AlayaCore/obj/project.nuget.cache +++ b/AlayaCore/obj/project.nuget.cache @@ -1,10 +1,40 @@ { "version": 2, - "dgSpecHash": "iqHG7z//q/I=", + "dgSpecHash": "pXFuC0zr6Zg=", "success": true, "projectFilePath": "/Users/ryanmacham/Documents/Coding/AlayaCore/AlayaCore/AlayaCore.csproj", "expectedPackageFiles": [ + "/Users/ryanmacham/.nuget/packages/cmllib.core/4.0.6/cmllib.core.4.0.6.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/cmllib.core.auth.microsoft/3.3.1/cmllib.core.auth.microsoft.3.3.1.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/cmllib.core.commons/4.0.0/cmllib.core.commons.4.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/cmllib.core.installer.neoforge/4.0.0/cmllib.core.installer.neoforge.4.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/htmlagilitypack/1.11.48/htmlagilitypack.1.11.48.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/lzma-sdk/19.0.0/lzma-sdk.19.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/microsoft.bcl.asyncinterfaces/8.0.0/microsoft.bcl.asyncinterfaces.8.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/8.0.1/microsoft.extensions.dependencyinjection.abstractions.8.0.1.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/microsoft.extensions.logging.abstractions/8.0.1/microsoft.extensions.logging.abstractions.8.0.1.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/microsoft.identity.client/4.61.3/microsoft.identity.client.4.61.3.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/microsoft.identity.client.extensions.msal/4.61.3/microsoft.identity.client.extensions.msal.4.61.3.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/microsoft.identitymodel.abstractions/6.35.0/microsoft.identitymodel.abstractions.6.35.0.nupkg.sha512", "/Users/ryanmacham/.nuget/packages/newtonsoft.json/13.0.4/newtonsoft.json.13.0.4.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/sharpziplib/1.4.2/sharpziplib.1.4.2.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.buffers/4.5.1/system.buffers.4.5.1.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.diagnostics.diagnosticsource/6.0.1/system.diagnostics.diagnosticsource.6.0.1.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.io.filesystem.accesscontrol/5.0.0/system.io.filesystem.accesscontrol.5.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.memory/4.5.5/system.memory.4.5.5.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.net.http.json/8.0.0/system.net.http.json.8.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.numerics.vectors/4.4.0/system.numerics.vectors.4.4.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.security.accesscontrol/5.0.0/system.security.accesscontrol.5.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.security.cryptography.protecteddata/4.5.0/system.security.cryptography.protecteddata.4.5.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.security.principal.windows/5.0.0/system.security.principal.windows.5.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.text.encodings.web/8.0.0/system.text.encodings.web.8.0.0.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.text.json/8.0.5/system.text.json.8.0.5.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.threading.tasks.dataflow/8.0.1/system.threading.tasks.dataflow.8.0.1.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/system.threading.tasks.extensions/4.5.4/system.threading.tasks.extensions.4.5.4.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/xboxauthnet/3.0.4/xboxauthnet.3.0.4.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/xboxauthnet.game/1.4.1/xboxauthnet.game.1.4.1.nupkg.sha512", + "/Users/ryanmacham/.nuget/packages/xboxauthnet.game.msal/0.1.3/xboxauthnet.game.msal.0.1.3.nupkg.sha512", "/Users/ryanmacham/.nuget/packages/netstandard.library.ref/2.1.0/netstandard.library.ref.2.1.0.nupkg.sha512" ], "logs": [] diff --git a/AlayaCore/obj/project.packagespec.json b/AlayaCore/obj/project.packagespec.json index 2965cda..4cbaa1e 100644 --- a/AlayaCore/obj/project.packagespec.json +++ b/AlayaCore/obj/project.packagespec.json @@ -1 +1 @@ -"restore":{"projectUniqueName":"/Users/ryanmacham/Documents/Coding/AlayaCore/AlayaCore/AlayaCore.csproj","projectName":"AlayaCore","projectPath":"/Users/ryanmacham/Documents/Coding/AlayaCore/AlayaCore/AlayaCore.csproj","packagesPath":"","outputPath":"/Users/ryanmacham/Documents/Coding/AlayaCore/AlayaCore/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["netstandard2.1"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"10.0.200"}"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","dependencies":{"Newtonsoft.Json":{"target":"Package","version":"[13.0.4, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"NETStandard.Library.Ref","version":"[2.1.0, 2.1.0]"}],"frameworkReferences":{"NETStandard.Library":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/10.0.201/RuntimeIdentifierGraph.json"}} \ No newline at end of file +"restore":{"projectUniqueName":"/Users/ryanmacham/Documents/Coding/AlayaCore/AlayaCore/AlayaCore.csproj","projectName":"AlayaCore","projectPath":"/Users/ryanmacham/Documents/Coding/AlayaCore/AlayaCore/AlayaCore.csproj","packagesPath":"","outputPath":"/Users/ryanmacham/Documents/Coding/AlayaCore/AlayaCore/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["netstandard2.1"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"10.0.200"}"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","dependencies":{"CmlLib.Core":{"target":"Package","version":"[4.0.6, )"},"CmlLib.Core.Auth.Microsoft":{"target":"Package","version":"[3.3.1, )"},"CmlLib.Core.Installer.NeoForge":{"target":"Package","version":"[4.0.0, )"},"Newtonsoft.Json":{"target":"Package","version":"[13.0.4, )"},"XboxAuthNet.Game.Msal":{"target":"Package","version":"[0.1.3, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"NETStandard.Library.Ref","version":"[2.1.0, 2.1.0]"}],"frameworkReferences":{"NETStandard.Library":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/10.0.201/RuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/AlayaCore/obj/rider.project.model.nuget.info b/AlayaCore/obj/rider.project.model.nuget.info index b4d7764..468a87c 100644 --- a/AlayaCore/obj/rider.project.model.nuget.info +++ b/AlayaCore/obj/rider.project.model.nuget.info @@ -1 +1 @@ -17752277078247393 \ No newline at end of file +17754069520908862 \ No newline at end of file diff --git a/AlayaCore/obj/rider.project.restore.info b/AlayaCore/obj/rider.project.restore.info index b4d7764..468a87c 100644 --- a/AlayaCore/obj/rider.project.restore.info +++ b/AlayaCore/obj/rider.project.restore.info @@ -1 +1 @@ -17752277078247393 \ No newline at end of file +17754069520908862 \ No newline at end of file