using System.Threading; using System.Threading.Tasks; using CliWrap; using DTLib.Extensions; using Млаумчерб.Клиент.классы; namespace Млаумчерб.Клиент; public interface IGame { string Name { get; } IOPath InstallationDirectory { get; } Progress BeginUpdate(); void EndUpdate(); Task Launch(); void Close(); } public class MinecraftVersion : IGame { public string Name { get; } public IOPath InstallationDirectory { get; } private IOPath JavawFilePath; private JavaArguments javaArgs; private GameArguments gameArgs; private CancellationTokenSource? cts; private CommandTask commandTask; public MinecraftVersion(string name) { Name = name; InstallationDirectory = Path.Concat("minecraft", Path.ReplaceRestrictedChars(name)); } public Progress BeginUpdate() { throw new NotImplementedException(); } public void EndUpdate() { throw new NotImplementedException(); } public async Task Launch() { var javaArgsList = javaArgs.FillPlaceholders([]); var gameArgsList = gameArgs.FillPlaceholders([]); var command = Cli.Wrap(JavawFilePath.ToString()) .WithWorkingDirectory(InstallationDirectory.ToString()) .WithArguments(javaArgsList) .WithArguments(gameArgsList); Приложение.Логгер.LogInfo(nameof(MinecraftVersion), $"launching the game" + "\njava: " + command.TargetFilePath + "\nworking_dir: " + command.WorkingDirPath + "\njava_arguments: \n\t" + javaArgsList.MergeToString("\n\t") + "\ngame_arguments: \n\t" + gameArgsList.MergeToString("\n\t")); cts = new(); commandTask = command.ExecuteAsync(cts.Token); var result = await commandTask; Приложение.Логгер.LogInfo(nameof(MinecraftVersion), $"game exited with code {result.ExitCode}"); } public void Close() { cts?.Cancel(); } }