From b76af4a8b0aa843b54c903656ceda1b90061bad8 Mon Sep 17 00:00:00 2001 From: zznty <94796179+zznty@users.noreply.github.com> Date: Wed, 15 May 2024 21:16:10 +0700 Subject: [PATCH] feature: Add console command listener for nogui scenarios --- .../Managers/ConsoleCommandManager.cs | 54 +++++++++++++++++++ Torch.Server/TorchServer.cs | 1 + Torch/Managers/Manager.cs | 2 + 3 files changed, 57 insertions(+) create mode 100644 Torch.Server/Managers/ConsoleCommandManager.cs diff --git a/Torch.Server/Managers/ConsoleCommandManager.cs b/Torch.Server/Managers/ConsoleCommandManager.cs new file mode 100644 index 0000000..ee5fcd5 --- /dev/null +++ b/Torch.Server/Managers/ConsoleCommandManager.cs @@ -0,0 +1,54 @@ +using NLog; +using System; +using System.Threading; +using Torch.API; +using Torch.API.Managers; +using Torch.Commands; +using Torch.Managers; + +namespace Torch.Server.Managers +{ + internal class ConsoleCommandManager(ITorchBase torchInstance) : Manager(torchInstance) + { + private static readonly Logger Log = LogManager.GetCurrentClassLogger(); + + [Dependency] + private CommandManager _commandManager; + + public override void Attach() + { + if (!Torch.Config.NoGui) + return; + + Log.Info("Starting console command listener"); + + new Thread(CommandListener) + { + Name = "Console Command Listener", + IsBackground = true, + }.Start(); + } + + private void CommandListener() + { + while (Torch.GameState < TorchGameState.Unloading) + { + var line = Console.ReadLine(); + + if (line == null) + break; + + Torch.Invoke(() => + { + if (!_commandManager.HandleCommandFromServer(line, LogResponse)) + Log.Error("Invalid input '{0}'", line); + }); + } + } + + private void LogResponse(TorchChatMessage message) + { + Log.Info(message.Message); + } + } +} diff --git a/Torch.Server/TorchServer.cs b/Torch.Server/TorchServer.cs index 22f4aa9..0cda497 100644 --- a/Torch.Server/TorchServer.cs +++ b/Torch.Server/TorchServer.cs @@ -59,6 +59,7 @@ namespace Torch.Server var sessionManager = Managers.GetManager(); sessionManager.AddFactory(_ => new MultiplayerManagerDedicated(this)); + sessionManager.AddFactory(_ => new ConsoleCommandManager(this)); sessionManager.SessionStateChanged += OnSessionStateChanged; // Needs to be done at some point after MyVRageWindows.Init diff --git a/Torch/Managers/Manager.cs b/Torch/Managers/Manager.cs index 0942ed4..18500e1 100644 --- a/Torch/Managers/Manager.cs +++ b/Torch/Managers/Manager.cs @@ -1,4 +1,5 @@ using System; +using JetBrains.Annotations; using Torch.API; using Torch.API.Managers; @@ -25,6 +26,7 @@ namespace Torch.Managers /// /// [AttributeUsage(AttributeTargets.Field)] + [MeansImplicitUse(ImplicitUseKindFlags.Assign)] public class DependencyAttribute : Attribute { ///