From f36e0300ef17d547257cc7b80101a74c5c0e00c0 Mon Sep 17 00:00:00 2001 From: YangSpring114 Date: Wed, 10 Jul 2024 01:33:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E4=B8=80=E4=BA=9B=E4=B8=BB=E8=A6=81?= =?UTF-8?q?=E7=B1=BB=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Checker/ResourceChecker.cs | 16 ++++++-- .../Components/Fetcher/CurseForgeFetcher.cs | 41 ++++++++++++++++--- .../Components/Fetcher/JavaFetcher.cs | 11 +++++ .../Components/Fetcher/ModrinthFetcher.cs | 31 +++++++++++--- .../Components/Launcher/Launcher.cs | 36 ++++++++++++---- MinecraftLaunch/MinecraftLaunch.csproj | 1 + 6 files changed, 111 insertions(+), 25 deletions(-) diff --git a/MinecraftLaunch/Components/Checker/ResourceChecker.cs b/MinecraftLaunch/Components/Checker/ResourceChecker.cs index b6bec0b..e13ec64 100644 --- a/MinecraftLaunch/Components/Checker/ResourceChecker.cs +++ b/MinecraftLaunch/Components/Checker/ResourceChecker.cs @@ -7,18 +7,26 @@ namespace MinecraftLaunch.Components.Checker; /// -/// Minecraft 游戏资源检查器 +/// A checker for Minecraft game resources. /// /// -/// 包含 Assets 和 Libraries +/// This includes both Assets and Libraries. /// public sealed class ResourceChecker(GameEntry entry) : IChecker { private AssetsResolver AssetsResolver => new(entry); - private LibrariesResolver LibraryResolver => new(entry); + /// + /// Gets the collection of missing resources. + /// public IReadOnlyCollection MissingResources { get; private set; } + /// + /// Checks the game resources asynchronously. + /// + /// + /// A ValueTask that represents the asynchronous operation. The task result contains a boolean value indicating whether all resources are present. + /// public async ValueTask CheckAsync() { var assetIndex = AssetsResolver.GetAssetIndexJson(); if (!assetIndex.Verify()) { @@ -35,4 +43,4 @@ public async ValueTask CheckAsync() { return !MissingResources.Any(); } -} \ No newline at end of file +} diff --git a/MinecraftLaunch/Components/Fetcher/CurseForgeFetcher.cs b/MinecraftLaunch/Components/Fetcher/CurseForgeFetcher.cs index e09adfc..da67a66 100644 --- a/MinecraftLaunch/Components/Fetcher/CurseForgeFetcher.cs +++ b/MinecraftLaunch/Components/Fetcher/CurseForgeFetcher.cs @@ -10,14 +10,34 @@ namespace MinecraftLaunch.Components.Fetcher; -public sealed class CurseForgeFetcher(string apiKey) : IFetcher> { - private readonly string _key = apiKey; - private readonly string _api = "https://api.curseforge.com/v1/mods"; - +/// +/// Fetches resources from CurseForge. +/// +public sealed class CurseForgeFetcher : IFetcher> { + private const string BASE_API = "https://api.curseforge.com/v1/mods"; + + private readonly string _key; + + /// + /// Initializes a new instance of the class. + /// + /// The API key for CurseForge. + public CurseForgeFetcher(string apiKey) { + _key = apiKey; + } + + /// + /// Fetches the CurseForge resources synchronously. + /// + /// An enumerable collection of CurseForge resources. public IEnumerable Fetch() { return FetchAsync().GetAwaiter().GetResult(); } + /// + /// Fetches the CurseForge resources asynchronously. + /// + /// A ValueTask that represents the asynchronous operation. The task result contains an enumerable collection of CurseForge resources. public async ValueTask> FetchAsync() { var result = new List(); var payload = new { @@ -26,7 +46,7 @@ public async ValueTask> FetchAsync() { gameVersionTypeId = null as string }; try { - using var responseMessage = await $"{_api}/featured" + using var responseMessage = await $"{BASE_API}/featured" .WithHeader("x-api-key", _key) .PostJsonAsync(payload); @@ -44,13 +64,22 @@ public async ValueTask> FetchAsync() { return result; } + /// + /// Searches for CurseForge resources asynchronously based on the provided search filter and other parameters. + /// + /// The search filter. + /// The class ID. Defaults to 6. + /// The category. Defaults to -1. + /// The game version. Defaults to null. + /// The mod loader type. Defaults to LoaderType.Any. + /// A ValueTask that represents the asynchronous operation. The task result contains an enumerable collection of CurseForge resources. public async ValueTask> SearchResourcesAsync( string searchFilter, int classId = 6, int category = -1, string gameVersion = null, LoaderType modLoaderType = LoaderType.Any) { - var stringBuilder = new StringBuilder(_api); + var stringBuilder = new StringBuilder(BASE_API); stringBuilder.Append("/search?gameId=432"); stringBuilder.Append("&sortField=Featured"); stringBuilder.Append("&sortOrder=desc"); diff --git a/MinecraftLaunch/Components/Fetcher/JavaFetcher.cs b/MinecraftLaunch/Components/Fetcher/JavaFetcher.cs index 50622c1..47ebaf7 100644 --- a/MinecraftLaunch/Components/Fetcher/JavaFetcher.cs +++ b/MinecraftLaunch/Components/Fetcher/JavaFetcher.cs @@ -10,6 +10,9 @@ namespace MinecraftLaunch.Components.Fetcher; +/// +/// Fetches Java installations on the system. +/// public sealed class JavaFetcher : IFetcher> { #region Fields [SupportedOSPlatform(nameof(OSPlatform.OSX))] @@ -66,10 +69,18 @@ public sealed class JavaFetcher : IFetcher> { #endregion + /// + /// Fetches the Java installations synchronously. + /// + /// An immutable array of Java entries. public ImmutableArray Fetch() { return FetchAsync().GetAwaiter().GetResult(); } + /// + /// Fetches the Java installations asynchronously. + /// + /// A ValueTask that represents the asynchronous operation. The task result contains an immutable array of Java entries. public async ValueTask> FetchAsync() { return EnvironmentUtil.GetPlatformName() switch { "windows" => FetchWindowJava(), diff --git a/MinecraftLaunch/Components/Fetcher/ModrinthFetcher.cs b/MinecraftLaunch/Components/Fetcher/ModrinthFetcher.cs index 3c394d3..97b684c 100644 --- a/MinecraftLaunch/Components/Fetcher/ModrinthFetcher.cs +++ b/MinecraftLaunch/Components/Fetcher/ModrinthFetcher.cs @@ -7,25 +7,44 @@ using MinecraftLaunch.Classes.Interfaces; using MinecraftLaunch.Classes.Models.Download; -namespace MinecraftLaunch.Components.Fetcher; +namespace MinecraftLaunch.Components.Fetcher; + +/// +/// Fetches resources from Modrinth. +/// public sealed class ModrinthFetcher : IFetcher> { - private readonly string _api = "https://api.modrinth.com/v2/"; - + private const string BASE_API = "https://api.modrinth.com/v2/"; + + /// + /// Fetches the Modrinth resources synchronously. + /// + /// An enumerable collection of Modrinth resources. public IEnumerable Fetch() { return FetchAsync().GetAwaiter().GetResult(); } + /// + /// Fetches the Modrinth resources asynchronously. + /// + /// A ValueTask that represents the asynchronous operation. The task result contains an enumerable collection of Modrinth resources. public async ValueTask> FetchAsync() { - var jNode = (await $"{_api}search".GetStringAsync()).AsNode(); + var jNode = (await $"{BASE_API}search".GetStringAsync()).AsNode(); return jNode?.Select("hits")?.GetEnumerable() .Deserialize>(JsonConverterUtil.DefaultJsonOptions); } - + + /// + /// Searches for Modrinth resources asynchronously based on the provided search filter and other parameters. + /// + /// The search filter. + /// The version. Defaults to null. + /// The resource type. Defaults to ModrinthResourceType.Mod. + /// A ValueTask that represents the asynchronous operation. The task result contains an enumerable collection of Modrinth resources. public async ValueTask> SearchResourcesAsync( string searchFilter, string version = default, ModrinthResourceType? resourceType = ModrinthResourceType.Mod) { - var stringBuilder = new StringBuilder(_api); + var stringBuilder = new StringBuilder(BASE_API); stringBuilder.Append($"search?query={searchFilter}"); var facets = new List(); diff --git a/MinecraftLaunch/Components/Launcher/Launcher.cs b/MinecraftLaunch/Components/Launcher/Launcher.cs index e857428..3445a98 100644 --- a/MinecraftLaunch/Components/Launcher/Launcher.cs +++ b/MinecraftLaunch/Components/Launcher/Launcher.cs @@ -10,25 +10,43 @@ namespace MinecraftLaunch.Components.Launcher; /// -/// 标准 Java版 Minecraft 启动器 +/// Launcher for the Java version of Minecraft. /// -public sealed class Launcher(IGameResolver resolver, LaunchConfig config) : ILauncher { +public sealed class Launcher : ILauncher { private ArgumentsBuilder _argumentsBuilder; - public LaunchConfig LaunchConfig => config; + /// + /// Gets the launch configuration. + /// + public LaunchConfig LaunchConfig { get; } - public IGameResolver GameResolver => resolver; + public IGameResolver GameResolver { get; } + /// + /// Initializes a new instance of the class. + /// + /// The game resolver. + /// The launch configuration. + public Launcher(IGameResolver resolver, LaunchConfig config) { + GameResolver = resolver; + LaunchConfig = config; + } + + /// + /// Launches the game asynchronously. + /// + /// The ID of the game to launch. + /// A ValueTask that represents the asynchronous operation. The task result contains a . public async ValueTask LaunchAsync(string id) { - var gameEntry = GameResolver.GetGameEntity(id); - var versionPath = gameEntry.OfVersionDirectoryPath(config.IsEnableIndependencyCore); - _argumentsBuilder = new(gameEntry, config); + var gameEntry = GameResolver.GetGameEntity(id); + var versionPath = gameEntry.OfVersionDirectoryPath(LaunchConfig.IsEnableIndependencyCore); + _argumentsBuilder = new(gameEntry, LaunchConfig); var arguments = _argumentsBuilder.Build(); var process = CreateProcess(arguments, versionPath); LibrariesResolver librariesResolver = new(gameEntry); - await ExtractNatives(versionPath, librariesResolver); + await Launcher.ExtractNatives(versionPath, librariesResolver); return new GameProcessWatcher(process, arguments); } @@ -46,7 +64,7 @@ private Process CreateProcess(IEnumerable arguments, string versionPath) }; } - private async Task ExtractNatives(string versionPath, LibrariesResolver librariesResolver) { + private static async Task ExtractNatives(string versionPath, LibrariesResolver librariesResolver) { var libraries = librariesResolver.GetLibraries() .Where(x => ((x as LibraryEntry)?.IsNative) != null) .Select(x => x.Path) diff --git a/MinecraftLaunch/MinecraftLaunch.csproj b/MinecraftLaunch/MinecraftLaunch.csproj index 3423d5b..d77b31a 100644 --- a/MinecraftLaunch/MinecraftLaunch.csproj +++ b/MinecraftLaunch/MinecraftLaunch.csproj @@ -15,6 +15,7 @@ latest MinecraftLaunch disable + False