From 91a7b0c916c401477396960329c9c8da91f5975c Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 6 Nov 2021 23:50:02 +0100 Subject: [PATCH 01/30] a --- SecretAdmin/Features/Console/Log.cs | 6 ++--- .../Features/Program/Config/ConfigManager.cs | 26 +++++++++++++++++++ .../Features/Program/Config/MainConfig.cs | 8 ++++-- SecretAdmin/Features/Program/Paths.cs | 2 ++ .../Features/Program/ProgramIntroduction.cs | 18 ++++++++++--- SecretAdmin/SecretAdmin.csproj | 4 +++ 6 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 SecretAdmin/Features/Program/Config/ConfigManager.cs diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index e14f6ca..3769243 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -78,13 +78,13 @@ private static void Warn(string title, string message) WriteLine(message, ConsoleColor.Yellow); } - private static void WriteLine(string message, ConsoleColor color = ConsoleColor.White) + public static void WriteLine(string message, ConsoleColor color = ConsoleColor.White) { SConsole.ForegroundColor = color; SConsole.WriteLine(message); } - private static void Write(string message, ConsoleColor color = ConsoleColor.White) + public static void Write(string message, ConsoleColor color = ConsoleColor.White) { SConsole.ForegroundColor = color; SConsole.Write(message); @@ -117,8 +117,6 @@ public static void HandleMessage(string message, byte code) break; } } - - } else { diff --git a/SecretAdmin/Features/Program/Config/ConfigManager.cs b/SecretAdmin/Features/Program/Config/ConfigManager.cs new file mode 100644 index 0000000..101018f --- /dev/null +++ b/SecretAdmin/Features/Program/Config/ConfigManager.cs @@ -0,0 +1,26 @@ +using System.IO; +using YamlDotNet.Serialization; + +namespace SecretAdmin.Features.Program.Config +{ + public class ConfigManager + { + public MainConfig SecretAdminConfig { get; private set; } + + private readonly Serializer _serializer = new (); + private readonly Deserializer _deserializer = new (); + + public MainConfig LoadConfig() + { + if(File.Exists(Paths.ProgramConfig)) + SaveConfig(new MainConfig()); + + return SecretAdminConfig = _deserializer.Deserialize(File.ReadAllText(Paths.ProgramConfig)); + } + + public void SaveConfig(MainConfig config) + { + File.WriteAllText(Paths.ProgramConfig, _serializer.Serialize(config)); + } + } +} \ No newline at end of file diff --git a/SecretAdmin/Features/Program/Config/MainConfig.cs b/SecretAdmin/Features/Program/Config/MainConfig.cs index ea16374..9989d52 100644 --- a/SecretAdmin/Features/Program/Config/MainConfig.cs +++ b/SecretAdmin/Features/Program/Config/MainConfig.cs @@ -2,7 +2,11 @@ { public class MainConfig { - // TODO: this - public bool AutoUpdater; + public bool AutoUpdater { get; set; } = true; + public bool RestartOnCrash { get; set; } = true; + public bool ManualStart { get; set; } = true; + public bool SafeShutdown { get; set; } = true; + public bool RestartWithLowMemory { get; set; } = true; + public int MaxMemory { get; set; } = 2048; } } \ No newline at end of file diff --git a/SecretAdmin/Features/Program/Paths.cs b/SecretAdmin/Features/Program/Paths.cs index 5837deb..bf31fcd 100644 --- a/SecretAdmin/Features/Program/Paths.cs +++ b/SecretAdmin/Features/Program/Paths.cs @@ -8,6 +8,7 @@ public class Paths public static string LogsFolder { get; private set; } public static string ServerLogsFolder { get; private set; } public static string ProgramLogsFolder { get; private set; } + public static string ServerConfigsFolder { get; private set; } public static string ProgramConfig { get; private set; } public static void Load() @@ -16,6 +17,7 @@ public static void Load() LogsFolder = Path.Combine(MainFolder, "Logs"); ServerLogsFolder = Path.Combine(LogsFolder, "Server"); ProgramLogsFolder = Path.Combine(LogsFolder, "SecretAdmin"); + ServerConfigsFolder = Path.Combine(MainFolder, "Configs"); ProgramConfig = Path.Combine(MainFolder, "config.yml"); CreateIfNotExists(); } diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index 49b0dc6..da23fc7 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -1,6 +1,7 @@ using System; using System.IO; using SecretAdmin.Features.Console; +using SecretAdmin.Features.Program.Config; namespace SecretAdmin.Features.Program { @@ -10,14 +11,23 @@ public class ProgramIntroduction public static void ShowIntroduction() { - System.Console.WriteLine(); + Log.WriteLine(""); Log.Alert("Hi, welcome to SecretAdmin!"); Log.Alert("It seems like your first time using it, so we have to configure some things before!"); - System.Console.ForegroundColor = ConsoleColor.Green; - System.Console.WriteLine("Press any key to continue."); + Log.WriteLine("Press any key to continue.", ConsoleColor.Green); System.Console.ReadKey(); - // Options + // Program Options + + var cfg = new MainConfig(); + + Log.Alert("Do you want to enable the auto updater? (Y) yes (y) / no (n)"); + var au = System.Console.ReadLine()?.ToLower(); + if (au != null && (au[0] == 'y' || au[0] == 'n')) + cfg.AutoUpdater = au[0] == 'y'; + + + // Server Options Log.Alert("Ok, thats all! Time to enjoy the server :)"); System.Console.ForegroundColor = ConsoleColor.Green; diff --git a/SecretAdmin/SecretAdmin.csproj b/SecretAdmin/SecretAdmin.csproj index 3278f83..47dbb93 100644 --- a/SecretAdmin/SecretAdmin.csproj +++ b/SecretAdmin/SecretAdmin.csproj @@ -10,4 +10,8 @@ + + + + From d929974648d150e532578e8706efd22629432a64 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 12:39:40 +0100 Subject: [PATCH 02/30] SilentCrashHandler done --- SecretAdmin/Features/Server/ScpServer.cs | 2 +- .../Features/Server/SilentCrashHandler.cs | 37 +++++++++++++++---- SecretAdmin/Features/Server/SocketServer.cs | 15 +++++++- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index dcd5f23..9a704a0 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -27,7 +27,7 @@ public void Start() { var fileName = "SCPSL.x86_64"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - fileName = "SCPSL.exe"; + fileName = @"C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL.exe"; if (!File.Exists(fileName)) { diff --git a/SecretAdmin/Features/Server/SilentCrashHandler.cs b/SecretAdmin/Features/Server/SilentCrashHandler.cs index 5f4c4d5..66c4cde 100644 --- a/SecretAdmin/Features/Server/SilentCrashHandler.cs +++ b/SecretAdmin/Features/Server/SilentCrashHandler.cs @@ -1,20 +1,43 @@ -namespace SecretAdmin.Features.Server +using System.Threading.Tasks; +using SecretAdmin.Features.Server.Enums; +using Main = SecretAdmin.Program; + +namespace SecretAdmin.Features.Server { public class SilentCrashHandler { - private ScpServer _server; + private SocketServer _server; + private int _pingCount; + private Task _pingTask; // TODO: this - public SilentCrashHandler(ScpServer server) + public SilentCrashHandler(SocketServer server) => _server = server; + + public void Start() { - _server = server; - + _pingTask = Task.Run(SendPing); } - public void Start() + private async void SendPing() + { + await Task.Delay(15000); + while (true) + { + _server.SendMessage("saping"); + _pingCount++; + await Task.Delay(5000); + if (_pingCount == 4) + { + Main.Server.Status = ServerStatus.Restarting; + Main.Server.Restart(); + } + } + } + + public void OnReceivePing() { - + _pingCount = 0; } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 7bff5b9..92d3f51 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -20,6 +20,7 @@ public class SocketServer : IDisposable private readonly TcpListener _listener; private TcpClient _client; private NetworkStream _stream; + private SilentCrashHandler _crashHandler; public SocketServer(ScpServer server) { @@ -35,6 +36,9 @@ public SocketServer(ScpServer server) _stream = _client.GetStream(); Task.Run(ListenRequests); }, _listener); + + _crashHandler = new SilentCrashHandler(this); + _crashHandler.Start(); } public async void ListenRequests() @@ -51,14 +55,14 @@ public async void ListenRequests() var messageBuffer = new byte[length]; var messageBytesRead = await _stream.ReadAsync(messageBuffer, 0, length); - + if (codeBytes <= 0 || lengthBytes != sizeof(int) || messageBytesRead <= 0) { if(_server.Status == ServerStatus.Online) Log.Alert("Socket disconnected."); break; } - + if (codeType >= 16) { HandleAction(codeType); @@ -69,6 +73,13 @@ public async void ListenRequests() return; var message = Encoding.GetString(messageBuffer, 0, length); + + if (message == "Command saping does not exist!") + { + _crashHandler.OnReceivePing(); + continue; + } + Log.HandleMessage(message, codeType); } } From 5cbf571bb7461ecfa0a211dfadca2974bb212aee Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 12:40:12 +0100 Subject: [PATCH 03/30] ups --- SecretAdmin/Features/Server/ScpServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 9a704a0..dcd5f23 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -27,7 +27,7 @@ public void Start() { var fileName = "SCPSL.x86_64"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - fileName = @"C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL.exe"; + fileName = "SCPSL.exe"; if (!File.Exists(fileName)) { From 9d97a2a1b1b7a16c0a1d0c256c581ebac71f083f Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 12:41:51 +0100 Subject: [PATCH 04/30] .Stop --- SecretAdmin/Features/Server/SilentCrashHandler.cs | 5 +++++ SecretAdmin/Features/Server/SocketServer.cs | 1 + 2 files changed, 6 insertions(+) diff --git a/SecretAdmin/Features/Server/SilentCrashHandler.cs b/SecretAdmin/Features/Server/SilentCrashHandler.cs index 66c4cde..00b4f58 100644 --- a/SecretAdmin/Features/Server/SilentCrashHandler.cs +++ b/SecretAdmin/Features/Server/SilentCrashHandler.cs @@ -39,5 +39,10 @@ public void OnReceivePing() { _pingCount = 0; } + + public void Stop() + { + _pingTask.Dispose(); + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 92d3f51..bd1f843 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -88,6 +88,7 @@ public void Dispose() { _client?.Close(); _listener?.Stop(); + _crashHandler.Stop(); } public void SendMessage(string message) From 7fed8109f8d1e1750f903b8f6730569d44e58f93 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 13:09:36 +0100 Subject: [PATCH 05/30] Round restart + more --- SecretAdmin/Features/Program/AutoUpdater.cs | 7 ++++ .../Features/Program/Config/ServerConfig.cs | 3 +- .../Features/Server/Enums/OutputCodes.cs | 3 +- SecretAdmin/Features/Server/ScpServer.cs | 21 +++++++--- .../Features/Server/SilentCrashHandler.cs | 2 - SecretAdmin/Features/Server/SocketServer.cs | 39 ++++++++++--------- SecretAdmin/Program.cs | 3 +- 7 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 SecretAdmin/Features/Program/AutoUpdater.cs diff --git a/SecretAdmin/Features/Program/AutoUpdater.cs b/SecretAdmin/Features/Program/AutoUpdater.cs new file mode 100644 index 0000000..9893516 --- /dev/null +++ b/SecretAdmin/Features/Program/AutoUpdater.cs @@ -0,0 +1,7 @@ +namespace SecretAdmin.Features.Program +{ + public class AutoUpdater + { + + } +} \ No newline at end of file diff --git a/SecretAdmin/Features/Program/Config/ServerConfig.cs b/SecretAdmin/Features/Program/Config/ServerConfig.cs index db566fd..d2e6626 100644 --- a/SecretAdmin/Features/Program/Config/ServerConfig.cs +++ b/SecretAdmin/Features/Program/Config/ServerConfig.cs @@ -2,6 +2,7 @@ { public class ServerConfig { - // TODO: this + public uint Port { get; set; } = 7777; + public int RoundsToRestart { get; set; } = -1; } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/Enums/OutputCodes.cs b/SecretAdmin/Features/Server/Enums/OutputCodes.cs index ca8a8fe..0b5dbdb 100644 --- a/SecretAdmin/Features/Server/Enums/OutputCodes.cs +++ b/SecretAdmin/Features/Server/Enums/OutputCodes.cs @@ -10,7 +10,6 @@ public enum OutputCodes : byte ExitActionReset = 0x13, ExitActionShutdown = 0x14, ExitActionSilentShutdown = 0x15, - ExitActionRestart = 0x16, - RoundEnd = 0x17 + ExitActionRestart = 0x16 } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index dcd5f23..7bc5a41 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using System.Threading; using SecretAdmin.Features.Console; +using SecretAdmin.Features.Program.Config; using SecretAdmin.Features.Server.Enums; using static System.String; @@ -13,15 +14,16 @@ namespace SecretAdmin.Features.Server public class ScpServer { public SocketServer Socket { get; private set; } + public ServerConfig Config { get; } + public DateTime StartedTime; public ServerStatus Status; - + public int Rounds; + + private Process _serverProcess; - private readonly uint _port; - public DateTime StartedTime; - public int Rounds; - public ScpServer(uint port) => _port = port; + public ScpServer(ServerConfig config) => Config = config; public void Start() { @@ -40,7 +42,7 @@ public void Start() _serverProcess?.Dispose(); Socket = new SocketServer(this); - var gameArgs = new List { "-batchmode", "-nographics", "-silent-crashes", "-nodedicateddelete", $"-id{Process.GetCurrentProcess().Id}", $"-console{Socket.Port}", $"-port{_port}" }; + var gameArgs = new List { "-batchmode", "-nographics", "-silent-crashes", "-nodedicateddelete", $"-id{Process.GetCurrentProcess().Id}", $"-console{Socket.Port}", $"-port{Config.Port}" }; var startInfo = new ProcessStartInfo(fileName, Join(' ', gameArgs)) { CreateNoWindow = true, UseShellExecute = false }; System.Console.WriteLine(); @@ -53,6 +55,7 @@ public void Start() Status = ServerStatus.Online; StartedTime = DateTime.Now; + Rounds = 0; } private void OnExited(object o, EventArgs e) @@ -95,5 +98,11 @@ public void Restart() Kill(); Start(); } + + public void ForceRestart() + { + Status = ServerStatus.Restarting; + Restart(); + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/SilentCrashHandler.cs b/SecretAdmin/Features/Server/SilentCrashHandler.cs index 00b4f58..54b0ccf 100644 --- a/SecretAdmin/Features/Server/SilentCrashHandler.cs +++ b/SecretAdmin/Features/Server/SilentCrashHandler.cs @@ -10,8 +10,6 @@ public class SilentCrashHandler private int _pingCount; private Task _pingTask; - // TODO: this - public SilentCrashHandler(SocketServer server) => _server = server; public void Start() diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index bd1f843..519b5d4 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -73,14 +73,8 @@ public async void ListenRequests() return; var message = Encoding.GetString(messageBuffer, 0, length); - - if (message == "Command saping does not exist!") - { - _crashHandler.OnReceivePing(); - continue; - } - - Log.HandleMessage(message, codeType); + if (HandleSecretAdminEvents(message)) + Log.HandleMessage(message, codeType); } } @@ -95,7 +89,7 @@ public void SendMessage(string message) { if (_stream == null) { - Log.Alert($"The server hasn't been initialized yet"); + Log.Alert("The server hasn't been initialized yet"); return; } @@ -118,7 +112,6 @@ public void HandleAction(byte action) { switch ((OutputCodes)action) { - // This seems to show up at the waiting for players event case OutputCodes.RoundRestart: Log.Raw("Waiting for players.", ConsoleColor.DarkCyan); break; @@ -132,33 +125,43 @@ public void HandleAction(byte action) break; case OutputCodes.ExitActionReset: - Log.Alert("ExitActionReset."); // DEBUG: Dont remove _server.Status = ServerStatus.Online; break; case OutputCodes.ExitActionShutdown: - Log.Alert("ExitActionShutdown."); // DEBUG: Dont remove _server.Status = ServerStatus.Exiting; break; case OutputCodes.ExitActionSilentShutdown: - Log.Alert("ExitActionSilentShutdown."); // DEBUG: Dont remove _server.Status = ServerStatus.Exiting; break; case OutputCodes.ExitActionRestart: - Log.Alert("ExitActionRestart"); // DEBUG: Dont remove _server.Status = ServerStatus.Restarting; break; - case OutputCodes.RoundEnd: - Log.Alert("RoundEnd"); // DEBUG: Dont remove - break; - default: Log.Alert($"Received unknown output code ({action}) ({(OutputCodes)action}), is SecretAdmin up to date?"); break; } } + + private bool HandleSecretAdminEvents(string message) + { + switch (message.Trim('.', ' ', '\t', '!', '?', ',')) + { + case "Command saping does not exist!": + _crashHandler.OnReceivePing(); + return false; + + case "the round is about to restart! please wait": + _server.Rounds++; + if (_server.Config.RoundsToRestart >= _server.Rounds) + _server.ForceRestart(); + return true; + } + + return true; + } } } \ No newline at end of file diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 965e262..5443a64 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; +using SecretAdmin.Features.Program.Config; using SecretAdmin.Features.Server; using SecretAdmin.Features.Server.Commands; using SecretAdmin.Features.Server.Enums; @@ -32,7 +33,7 @@ static void Main(string[] args) CommandHandler = new CommandHandler(); - Server = new ScpServer(7777); + Server = new ScpServer(new ServerConfig()); Server.Start(); InputManager.Start(); From 2611e407c1b7000efe4eacb9b173f385778d2a45 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 13:28:16 +0100 Subject: [PATCH 06/30] ups --- SecretAdmin/Features/Program/ProgramIntroduction.cs | 2 ++ SecretAdmin/Features/Server/ScpServer.cs | 2 +- SecretAdmin/Features/Server/SocketServer.cs | 6 ++++-- SecretAdmin/Program.cs | 6 ++++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index da23fc7..416c64a 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -26,6 +26,8 @@ public static void ShowIntroduction() if (au != null && (au[0] == 'y' || au[0] == 'n')) cfg.AutoUpdater = au[0] == 'y'; + Paths.Load(); + SecretAdmin.Program.ConfigManager.SaveConfig(cfg); // Server Options diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 7bc5a41..640abb6 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -88,9 +88,9 @@ private void OnExited(object o, EventArgs e) public void Kill() { + _serverProcess?.Kill(); Socket?.Dispose(); Socket = null; - _serverProcess?.Kill(); } public void Restart() diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 519b5d4..091a52a 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -80,9 +80,10 @@ public async void ListenRequests() public void Dispose() { + _crashHandler.Stop(); + _crashHandler = null; _client?.Close(); _listener?.Stop(); - _crashHandler.Stop(); } public void SendMessage(string message) @@ -148,13 +149,14 @@ public void HandleAction(byte action) private bool HandleSecretAdminEvents(string message) { - switch (message.Trim('.', ' ', '\t', '!', '?', ',')) + switch (message) { case "Command saping does not exist!": _crashHandler.OnReceivePing(); return false; case "the round is about to restart! please wait": + System.Console.WriteLine("a"); _server.Rounds++; if (_server.Config.RoundsToRestart >= _server.Rounds) _server.ForceRestart(); diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 5443a64..4286802 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -16,16 +16,18 @@ class Program public static Version Version { get; } = new (0, 0, 0,1); public static ScpServer Server { get; private set; } public static CommandHandler CommandHandler { get; private set; } + public static ConfigManager ConfigManager { get; private set; } static void Main(string[] args) { + Console.Title = $"SecretAdmin [v{Version}]"; AppDomain.CurrentDomain.ProcessExit += OnExit; - Console.Title = $"SecretAdmin [v{Version}]"; - Log.Intro(); Console.ReadKey(); + ConfigManager = new ConfigManager(); + if (ProgramIntroduction.FirstTime) ProgramIntroduction.ShowIntroduction(); From 2fdd3fc73e562143edd89791eb74941d56013611 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 13:32:23 +0100 Subject: [PATCH 07/30] Will replace this events with exiled ones --- SecretAdmin/Features/Server/SocketServer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 091a52a..8f5ff1d 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -155,12 +155,12 @@ private bool HandleSecretAdminEvents(string message) _crashHandler.OnReceivePing(); return false; - case "the round is about to restart! please wait": + /*case "the round is about to restart! please wait": System.Console.WriteLine("a"); _server.Rounds++; if (_server.Config.RoundsToRestart >= _server.Rounds) _server.ForceRestart(); - return true; + return true;*/ } return true; From c898a402ca8605cf47184c749a177bbb41be405c Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 13:38:19 +0100 Subject: [PATCH 08/30] pathy path --- SecretAdmin/Features/Program/Paths.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SecretAdmin/Features/Program/Paths.cs b/SecretAdmin/Features/Program/Paths.cs index bf31fcd..41e18ca 100644 --- a/SecretAdmin/Features/Program/Paths.cs +++ b/SecretAdmin/Features/Program/Paths.cs @@ -28,6 +28,7 @@ public static void CreateIfNotExists() Directory.CreateDirectory(LogsFolder); Directory.CreateDirectory(ServerLogsFolder); Directory.CreateDirectory(ProgramLogsFolder); + Directory.CreateDirectory(ServerConfigsFolder); } } } \ No newline at end of file From bfddd769c23b16af47814088aa2255347ee349d7 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 14:41:20 +0100 Subject: [PATCH 09/30] dispose --- SecretAdmin/Features/Server/ScpServer.cs | 2 +- .../Features/Server/SilentCrashHandler.cs | 16 +++++++++------- SecretAdmin/Features/Server/SocketServer.cs | 3 +-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 640abb6..7bc5a41 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -88,9 +88,9 @@ private void OnExited(object o, EventArgs e) public void Kill() { - _serverProcess?.Kill(); Socket?.Dispose(); Socket = null; + _serverProcess?.Kill(); } public void Restart() diff --git a/SecretAdmin/Features/Server/SilentCrashHandler.cs b/SecretAdmin/Features/Server/SilentCrashHandler.cs index 54b0ccf..f7cd5a5 100644 --- a/SecretAdmin/Features/Server/SilentCrashHandler.cs +++ b/SecretAdmin/Features/Server/SilentCrashHandler.cs @@ -1,26 +1,28 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using SecretAdmin.Features.Server.Enums; using Main = SecretAdmin.Program; namespace SecretAdmin.Features.Server { - public class SilentCrashHandler + public class SilentCrashHandler : IDisposable { private SocketServer _server; + private bool _killed; private int _pingCount; - private Task _pingTask; public SilentCrashHandler(SocketServer server) => _server = server; public void Start() { - _pingTask = Task.Run(SendPing); + _killed = false; + Task.Run(SendPing); } private async void SendPing() { await Task.Delay(15000); - while (true) + while (!_killed) { _server.SendMessage("saping"); _pingCount++; @@ -38,9 +40,9 @@ public void OnReceivePing() _pingCount = 0; } - public void Stop() + public void Dispose() { - _pingTask.Dispose(); + _killed = true; } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 8f5ff1d..47c5254 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -80,8 +80,7 @@ public async void ListenRequests() public void Dispose() { - _crashHandler.Stop(); - _crashHandler = null; + _crashHandler.Dispose(); _client?.Close(); _listener?.Stop(); } From 98fd007aec75cf60cf574485352e380d33b55d68 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 14:59:16 +0100 Subject: [PATCH 10/30] changes --- .../Features/Program/Config/ConfigManager.cs | 5 ++-- SecretAdmin/Features/Server/ScpServer.cs | 30 ++++++++++++------- .../Features/Server/SilentCrashHandler.cs | 19 +++++------- SecretAdmin/Program.cs | 4 ++- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/SecretAdmin/Features/Program/Config/ConfigManager.cs b/SecretAdmin/Features/Program/Config/ConfigManager.cs index 101018f..0af95b7 100644 --- a/SecretAdmin/Features/Program/Config/ConfigManager.cs +++ b/SecretAdmin/Features/Program/Config/ConfigManager.cs @@ -10,17 +10,18 @@ public class ConfigManager private readonly Serializer _serializer = new (); private readonly Deserializer _deserializer = new (); - public MainConfig LoadConfig() + public void LoadConfig() { if(File.Exists(Paths.ProgramConfig)) SaveConfig(new MainConfig()); - return SecretAdminConfig = _deserializer.Deserialize(File.ReadAllText(Paths.ProgramConfig)); + SecretAdminConfig = _deserializer.Deserialize(File.ReadAllText(Paths.ProgramConfig)); } public void SaveConfig(MainConfig config) { File.WriteAllText(Paths.ProgramConfig, _serializer.Serialize(config)); + LoadConfig(); } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 7bc5a41..9453125 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -19,10 +19,8 @@ public class ScpServer public ServerStatus Status; public int Rounds; - private Process _serverProcess; - public ScpServer(ServerConfig config) => Config = config; public void Start() @@ -33,8 +31,7 @@ public void Start() if (!File.Exists(fileName)) { - System.Console.WriteLine(); - Log.Alert("Executable not found, make sure this file is on the same folder as LocalAdmin."); + Log.Alert("\nExecutable not found, make sure this file is on the same folder as LocalAdmin."); System.Console.ReadLine(); Environment.Exit(-1); } @@ -46,7 +43,7 @@ public void Start() var startInfo = new ProcessStartInfo(fileName, Join(' ', gameArgs)) { CreateNoWindow = true, UseShellExecute = false }; System.Console.WriteLine(); - Log.Alert("Starting server on port 7777."); + Log.Alert($"Starting server on port {Config.Port}."); System.Console.WriteLine(); _serverProcess = Process.Start(startInfo); @@ -64,11 +61,13 @@ private void OnExited(object o, EventArgs e) { case ServerStatus.Restarting: Restart(); - break; + return; + case ServerStatus.Exiting: Kill(); Environment.Exit(0); - break; + return; + case ServerStatus.Online: Log.Raw(@" █████████ █████ ███ @@ -78,9 +77,20 @@ private void OnExited(object o, EventArgs e) ░███ ░███ ░░░ ███████ ░░█████ ░███ ░███ ░███ ░░███ ███ ░███ ███░░███ ░░░░███ ░███ ░███ ░░░ ░░█████████ █████ ░░████████ ██████ ████ █████ ███ - ░░░░░░░░░ ░░░░░ ░░░░░░░░ ░░░░░░ ░░░░ ░░░░░ ░░░ ", ConsoleColor.DarkYellow, false); - Restart(); - break; + ░░░░░░░░░ ░░░░░ ░░░░░░░░ ░░░░░░ ░░░░ ░░░░░ ░░░ ", + ConsoleColor.DarkYellow, false); + + if (SecretAdmin.Program.ConfigManager.SecretAdminConfig.RestartOnCrash) + { + Restart(); + } + else + { + Log.Raw("Server crashed, press any key to close SecretAdmin."); + System.Console.ReadKey(); + } + return; + default: throw new ArgumentOutOfRangeException(); } diff --git a/SecretAdmin/Features/Server/SilentCrashHandler.cs b/SecretAdmin/Features/Server/SilentCrashHandler.cs index f7cd5a5..7a336d4 100644 --- a/SecretAdmin/Features/Server/SilentCrashHandler.cs +++ b/SecretAdmin/Features/Server/SilentCrashHandler.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using SecretAdmin.Features.Console; using SecretAdmin.Features.Server.Enums; using Main = SecretAdmin.Program; @@ -7,7 +8,7 @@ namespace SecretAdmin.Features.Server { public class SilentCrashHandler : IDisposable { - private SocketServer _server; + private readonly SocketServer _server; private bool _killed; private int _pingCount; @@ -27,22 +28,16 @@ private async void SendPing() _server.SendMessage("saping"); _pingCount++; await Task.Delay(5000); - if (_pingCount == 4) + if (_pingCount == 3) { - Main.Server.Status = ServerStatus.Restarting; - Main.Server.Restart(); + Log.Alert("The server silently crashed, restarting...."); + Main.Server.ForceRestart(); } } } - public void OnReceivePing() - { - _pingCount = 0; - } + public void OnReceivePing() => _pingCount = 0; - public void Dispose() - { - _killed = true; - } + public void Dispose() => _killed = true; } } \ No newline at end of file diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 4286802..98d59fe 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -27,6 +27,7 @@ static void Main(string[] args) Console.ReadKey(); ConfigManager = new ConfigManager(); + ConfigManager.LoadConfig(); if (ProgramIntroduction.FirstTime) ProgramIntroduction.ShowIntroduction(); @@ -46,7 +47,8 @@ private static void OnExit(object obj, EventArgs ev) Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("\nExit Detected. Killing game process."); - Server?.Kill(); + if(ConfigManager.SecretAdminConfig.SafeShutdown) + Server?.Kill(); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Everything seems good to go! Bye :)"); From 75b28a12f1db69e29c3f7657657eef2e929838d2 Mon Sep 17 00:00:00 2001 From: xRoier Date: Sun, 7 Nov 2021 15:05:21 +0100 Subject: [PATCH 11/30] Logs into file --- SecretAdmin/Features/Console/Log.cs | 16 ++++++++++++++++ SecretAdmin/Features/Server/ScpServer.cs | 3 ++- SecretAdmin/Features/Server/SocketServer.cs | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index 3769243..2c302ba 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -1,6 +1,8 @@ using System; using System.Drawing; +using System.IO; using System.Text.RegularExpressions; +using SecretAdmin.Features.Program; using SConsole = System.Console; namespace SecretAdmin.Features.Console @@ -82,12 +84,14 @@ public static void WriteLine(string message, ConsoleColor color = ConsoleColor.W { SConsole.ForegroundColor = color; SConsole.WriteLine(message); + AppendLog(message, true); } public static void Write(string message, ConsoleColor color = ConsoleColor.White) { SConsole.ForegroundColor = color; SConsole.Write(message); + AppendLog(message); } public static void HandleMessage(string message, byte code) @@ -131,5 +135,17 @@ public static void DeletePrevConsoleLine() SConsole.Write(new string(' ', SConsole.WindowWidth)); SConsole.SetCursorPosition(0, SConsole.CursorTop - 1); } + + private static void AppendLog(string message, bool newLine = false) + { + var server = SecretAdmin.Program.Server; + if(server == null) return; + var date = server.RoundStartedTime == DateTime.MinValue ? server.StartedTime : server.RoundStartedTime; + using var sw = File.AppendText(Path.Combine(Paths.ProgramLogsFolder, $"{server.Config.Port}-{new DateTimeOffset(date.ToUniversalTime()).ToUnixTimeMilliseconds()}.txt")); + if (newLine) + sw.WriteLine(message); + else + sw.Write(message); + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 640abb6..9066d50 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -16,6 +16,7 @@ public class ScpServer public SocketServer Socket { get; private set; } public ServerConfig Config { get; } public DateTime StartedTime; + public DateTime RoundStartedTime = DateTime.MinValue; public ServerStatus Status; public int Rounds; @@ -27,6 +28,7 @@ public class ScpServer public void Start() { + StartedTime = DateTime.Now; var fileName = "SCPSL.x86_64"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) fileName = "SCPSL.exe"; @@ -54,7 +56,6 @@ public void Start() _serverProcess.EnableRaisingEvents = true; Status = ServerStatus.Online; - StartedTime = DateTime.Now; Rounds = 0; } diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 091a52a..30a05a8 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -115,6 +115,7 @@ public void HandleAction(byte action) { case OutputCodes.RoundRestart: Log.Raw("Waiting for players.", ConsoleColor.DarkCyan); + _server.RoundStartedTime = DateTime.Now; break; case OutputCodes.IdleEnter: From 33f448e9afd691f8b5b7f9e651ed72acadf4ec0a Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 15:16:45 +0100 Subject: [PATCH 12/30] nre --- SecretAdmin/Program.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 98d59fe..3c488d3 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -27,13 +27,14 @@ static void Main(string[] args) Console.ReadKey(); ConfigManager = new ConfigManager(); - ConfigManager.LoadConfig(); if (ProgramIntroduction.FirstTime) ProgramIntroduction.ShowIntroduction(); - + Paths.Load(); + ConfigManager.LoadConfig(); + CommandHandler = new CommandHandler(); Server = new ScpServer(new ServerConfig()); From a46c689e62a8e91a2effde4b543414747d9bd89c Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 15:17:39 +0100 Subject: [PATCH 13/30] aa --- SecretAdmin/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 3c488d3..183a6f5 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -26,14 +26,14 @@ static void Main(string[] args) Log.Intro(); Console.ReadKey(); - ConfigManager = new ConfigManager(); + //ConfigManager = new ConfigManager(); if (ProgramIntroduction.FirstTime) ProgramIntroduction.ShowIntroduction(); Paths.Load(); - ConfigManager.LoadConfig(); + //ConfigManager.LoadConfig(); CommandHandler = new CommandHandler(); From e90447614538aae6027230be7575e29962b9cc9c Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 7 Nov 2021 15:19:24 +0100 Subject: [PATCH 14/30] aaa --- SecretAdmin/Features/Server/ScpServer.cs | 16 ++++++++-------- SecretAdmin/Program.cs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 9453125..1d1e3a7 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -80,15 +80,15 @@ private void OnExited(object o, EventArgs e) ░░░░░░░░░ ░░░░░ ░░░░░░░░ ░░░░░░ ░░░░ ░░░░░ ░░░ ", ConsoleColor.DarkYellow, false); - if (SecretAdmin.Program.ConfigManager.SecretAdminConfig.RestartOnCrash) - { + //if (SecretAdmin.Program.ConfigManager.SecretAdminConfig.RestartOnCrash) + //{ Restart(); - } - else - { - Log.Raw("Server crashed, press any key to close SecretAdmin."); - System.Console.ReadKey(); - } + //} + //else + //{ + // Log.Raw("Server crashed, press any key to close SecretAdmin."); + //System.Console.ReadKey(); + //} return; default: diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 183a6f5..1c29f46 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -48,7 +48,7 @@ private static void OnExit(object obj, EventArgs ev) Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("\nExit Detected. Killing game process."); - if(ConfigManager.SecretAdminConfig.SafeShutdown) + //if(ConfigManager.SecretAdminConfig.SafeShutdown) Server?.Kill(); Console.ForegroundColor = ConsoleColor.Cyan; From 508b64b4929b9038e13a59d2b760a739ed2c81cf Mon Sep 17 00:00:00 2001 From: xRoier Date: Sun, 7 Nov 2021 17:47:31 +0100 Subject: [PATCH 15/30] Logs ready --- SecretAdmin/Features/Console/Log.cs | 10 ++++++---- SecretAdmin/Features/Server/ScpServer.cs | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index 2c302ba..d254001 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -136,12 +136,14 @@ public static void DeletePrevConsoleLine() SConsole.SetCursorPosition(0, SConsole.CursorTop - 1); } - private static void AppendLog(string message, bool newLine = false) + public static void AppendLog(string message, bool newLine = false, bool serverLog = false) { var server = SecretAdmin.Program.Server; - if(server == null) return; - var date = server.RoundStartedTime == DateTime.MinValue ? server.StartedTime : server.RoundStartedTime; - using var sw = File.AppendText(Path.Combine(Paths.ProgramLogsFolder, $"{server.Config.Port}-{new DateTimeOffset(date.ToUniversalTime()).ToUnixTimeMilliseconds()}.txt")); + if (server == null) return; + var date = + serverLog ? server.StartedTime : server.RoundStartedTime == DateTime.MinValue ? server.StartedTime : server.RoundStartedTime; + using var sw = File.AppendText(Path.Combine(serverLog ? Paths.ServerLogsFolder : Paths.ProgramLogsFolder, + $"{server.Config.Port}-{new DateTimeOffset(date.ToUniversalTime()).ToUnixTimeMilliseconds()}.txt")); if (newLine) sw.WriteLine(message); else diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index e581d0c..12324fd 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -42,16 +42,29 @@ public void Start() Socket = new SocketServer(this); var gameArgs = new List { "-batchmode", "-nographics", "-silent-crashes", "-nodedicateddelete", $"-id{Process.GetCurrentProcess().Id}", $"-console{Socket.Port}", $"-port{Config.Port}" }; - var startInfo = new ProcessStartInfo(fileName, Join(' ', gameArgs)) { CreateNoWindow = true, UseShellExecute = false }; + var startInfo = new ProcessStartInfo(fileName, Join(' ', gameArgs)) { CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; System.Console.WriteLine(); Log.Alert($"Starting server on port {Config.Port}."); System.Console.WriteLine(); - + _serverProcess = Process.Start(startInfo); _serverProcess!.Exited += OnExited; - _serverProcess.EnableRaisingEvents = true; + _serverProcess.ErrorDataReceived += (sender, args) => + { + if(IsNullOrEmpty(args.Data)) return; + Log.AppendLog("[STDERR] " + args.Data, true, true); + }; + _serverProcess.OutputDataReceived += (sender, args) => + { + if(IsNullOrEmpty(args.Data)) return; + Log.AppendLog("[STDOUT] " + args.Data, true, true); + }; + _serverProcess.EnableRaisingEvents = true; + _serverProcess.BeginErrorReadLine(); + _serverProcess.BeginOutputReadLine(); + Status = ServerStatus.Online; Rounds = 0; } From 3b91473a30bc975574dc7d485e5d77f93de2f384 Mon Sep 17 00:00:00 2001 From: zerob10000 Date: Wed, 10 Nov 2021 17:26:44 -0500 Subject: [PATCH 16/30] Add EXILED autoinstaller --- .../Features/Program/ExiledInstaller.cs | 64 +++++++++++++++++++ .../Features/Program/ProgramIntroduction.cs | 5 ++ 2 files changed, 69 insertions(+) create mode 100644 SecretAdmin/Features/Program/ExiledInstaller.cs diff --git a/SecretAdmin/Features/Program/ExiledInstaller.cs b/SecretAdmin/Features/Program/ExiledInstaller.cs new file mode 100644 index 0000000..0be4cda --- /dev/null +++ b/SecretAdmin/Features/Program/ExiledInstaller.cs @@ -0,0 +1,64 @@ +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Runtime.InteropServices; +using SecretAdmin.Features.Console; + +namespace SecretAdmin.Features.Program +{ + public class ExiledInstaller + { + public static void InstallExiled() + { + string platformSpecificString = null; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + platformSpecificString = "Win.exe"; + } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + platformSpecificString = "Linux"; + } + + if (platformSpecificString == null) + { + Log.Alert("Platform does not seem to be supported by EXILED! You will need to manually install it."); + return; + } + + Log.Alert("Downloading EXILED..."); + using (var client = new WebClient()) + { + client.DownloadFile( + $"https://github.com/Exiled-Team/EXILED/releases/latest/download/Exiled.Installer-{platformSpecificString}", + $"Exiled.Installer-{platformSpecificString}"); + } + + Log.Alert("Running installer..."); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Log.Alert("Marking installer as executable..."); + using (Process p = new Process()) + { + p.StartInfo.FileName = "/bin/bash"; + p.StartInfo.Arguments = "-c \" chmod +x ./Exiled.Installer-Linux\" "; + p.StartInfo.CreateNoWindow = true; + + p.Start(); + p.WaitForExit(); + } + } + + using (Process p = new Process()) + { + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.FileName = $@"{Directory.GetCurrentDirectory()}/Exiled.Installer-{platformSpecificString}"; + p.Start(); + p.WaitForExit(); + } + + } + } +} \ No newline at end of file diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index 416c64a..aaca805 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -31,6 +31,11 @@ public static void ShowIntroduction() // Server Options + Log.Alert("Do you want to auto-install EXILED? (y/n)"); + var ai = System.Console.ReadLine()?.ToLower(); + if (ai != null && (ai[0] == 'y' || ai[0] == 'n')) + ExiledInstaller.InstallExiled(); + Log.Alert("Ok, thats all! Time to enjoy the server :)"); System.Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine("Press any key to continue."); From 83a08916bb118a17fe96d9e4b2b907cae2a839ab Mon Sep 17 00:00:00 2001 From: Jesus Date: Thu, 11 Nov 2021 18:44:20 +0100 Subject: [PATCH 17/30] bomb --- SecretAdmin/Features/Console/Log.cs | 26 ++------ SecretAdmin/Features/Console/Logger.cs | 27 ++++++++ .../Features/Program/Config/ConfigManager.cs | 2 +- .../Features/Program/Config/MainConfig.cs | 3 +- .../Features/Program/ProgramIntroduction.cs | 3 +- SecretAdmin/Features/Server/ScpServer.cs | 64 ++++++++++--------- .../Features/Server/SilentCrashHandler.cs | 1 - SecretAdmin/Features/Server/SocketServer.cs | 14 ++-- SecretAdmin/Features/Server/Utils.cs | 48 ++++++++++++++ SecretAdmin/Program.cs | 18 +++--- 10 files changed, 138 insertions(+), 68 deletions(-) create mode 100644 SecretAdmin/Features/Console/Logger.cs create mode 100644 SecretAdmin/Features/Server/Utils.cs diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index d254001..f11852d 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -2,8 +2,8 @@ using System.Drawing; using System.IO; using System.Text.RegularExpressions; -using SecretAdmin.Features.Program; using SConsole = System.Console; +using static SecretAdmin.Program; namespace SecretAdmin.Features.Console { @@ -15,6 +15,7 @@ public class Log public static void Intro() { + SConsole.Clear(); WriteLine(@" .--. .-. .--. .-. _ : .--' .' `. : .; : : : :_; `. `. .--. .--. .--. .--.`. .' : : .-' :,-.,-.,-..-.,-.,-. @@ -25,6 +26,7 @@ public static void Intro() WriteLine(" by Jesus-QC", ConsoleColor.Blue); WriteLine("Released under MIT License Copyright © Jesus-QC 2021", ConsoleColor.Red); WriteLine("Press any key to continue.", ConsoleColor.Green); + SConsole.ReadKey(); } public static void Input(string message, string title = "SERVER") @@ -80,18 +82,18 @@ private static void Warn(string title, string message) WriteLine(message, ConsoleColor.Yellow); } - public static void WriteLine(string message, ConsoleColor color = ConsoleColor.White) + public static void WriteLine(string message = "", ConsoleColor color = ConsoleColor.White) { SConsole.ForegroundColor = color; SConsole.WriteLine(message); - AppendLog(message, true); + ProgramLogger?.AppendLog(message, true); } - public static void Write(string message, ConsoleColor color = ConsoleColor.White) + public static void Write(string message = "", ConsoleColor color = ConsoleColor.White) { SConsole.ForegroundColor = color; SConsole.Write(message); - AppendLog(message); + ProgramLogger?.AppendLog(message); } public static void HandleMessage(string message, byte code) @@ -135,19 +137,5 @@ public static void DeletePrevConsoleLine() SConsole.Write(new string(' ', SConsole.WindowWidth)); SConsole.SetCursorPosition(0, SConsole.CursorTop - 1); } - - public static void AppendLog(string message, bool newLine = false, bool serverLog = false) - { - var server = SecretAdmin.Program.Server; - if (server == null) return; - var date = - serverLog ? server.StartedTime : server.RoundStartedTime == DateTime.MinValue ? server.StartedTime : server.RoundStartedTime; - using var sw = File.AppendText(Path.Combine(serverLog ? Paths.ServerLogsFolder : Paths.ProgramLogsFolder, - $"{server.Config.Port}-{new DateTimeOffset(date.ToUniversalTime()).ToUnixTimeMilliseconds()}.txt")); - if (newLine) - sw.WriteLine(message); - else - sw.Write(message); - } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Console/Logger.cs b/SecretAdmin/Features/Console/Logger.cs new file mode 100644 index 0000000..8eaddea --- /dev/null +++ b/SecretAdmin/Features/Console/Logger.cs @@ -0,0 +1,27 @@ +using System; +using System.IO; +using SecretAdmin.Features.Server; + +namespace SecretAdmin.Features.Console +{ + public class Logger + { + private readonly string _path; + + public Logger(string path) + { + _path = path; + } + + public void AppendLog(string message, bool newLine = false) + { + using (var stream = File.AppendText(_path)) + { + if (newLine) + stream.WriteLine(message); + else + stream.Write(message); + } + } + } +} \ No newline at end of file diff --git a/SecretAdmin/Features/Program/Config/ConfigManager.cs b/SecretAdmin/Features/Program/Config/ConfigManager.cs index 0af95b7..cc1d707 100644 --- a/SecretAdmin/Features/Program/Config/ConfigManager.cs +++ b/SecretAdmin/Features/Program/Config/ConfigManager.cs @@ -12,7 +12,7 @@ public class ConfigManager public void LoadConfig() { - if(File.Exists(Paths.ProgramConfig)) + if(!File.Exists(Paths.ProgramConfig)) SaveConfig(new MainConfig()); SecretAdminConfig = _deserializer.Deserialize(File.ReadAllText(Paths.ProgramConfig)); diff --git a/SecretAdmin/Features/Program/Config/MainConfig.cs b/SecretAdmin/Features/Program/Config/MainConfig.cs index 9989d52..6e0686b 100644 --- a/SecretAdmin/Features/Program/Config/MainConfig.cs +++ b/SecretAdmin/Features/Program/Config/MainConfig.cs @@ -4,9 +4,10 @@ public class MainConfig { public bool AutoUpdater { get; set; } = true; public bool RestartOnCrash { get; set; } = true; + public int ArchiveLogsDays { get; set; } = 1; public bool ManualStart { get; set; } = true; public bool SafeShutdown { get; set; } = true; public bool RestartWithLowMemory { get; set; } = true; - public int MaxMemory { get; set; } = 2048; + public int MaxDefaultMemory { get; set; } = 2048; } } \ No newline at end of file diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index 416c64a..d584750 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -7,10 +7,11 @@ namespace SecretAdmin.Features.Program { public class ProgramIntroduction { - public static bool FirstTime => !Directory.Exists("SecretAdmin"); + public static bool FirstTime => !File.Exists(Paths.ProgramConfig); public static void ShowIntroduction() { + Log.Intro(); Log.WriteLine(""); Log.Alert("Hi, welcome to SecretAdmin!"); Log.Alert("It seems like your first time using it, so we have to configure some things before!"); diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 12324fd..d54aa1d 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -1,13 +1,9 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Threading; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program.Config; using SecretAdmin.Features.Server.Enums; -using static System.String; namespace SecretAdmin.Features.Server { @@ -15,57 +11,49 @@ public class ScpServer { public SocketServer Socket { get; private set; } public ServerConfig Config { get; } - public DateTime StartedTime; - public DateTime RoundStartedTime = DateTime.MinValue; + public ServerStatus Status; - public int Rounds; + public DateTime StartedTime; //TODO: . + public int Rounds; //TODO: . private Process _serverProcess; + private Logger _logger; + private Logger _outputLogger; public ScpServer(ServerConfig config) => Config = config; public void Start() { - StartedTime = DateTime.Now; - var fileName = "SCPSL.x86_64"; - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - fileName = "SCPSL.exe"; - - if (!File.Exists(fileName)) + if (!Utils.GetExecutable(out var fileName)) { - Log.Alert("\nExecutable not found, make sure this file is on the same folder as LocalAdmin."); - System.Console.ReadLine(); + System.Console.ReadKey(); Environment.Exit(-1); + return; } + _logger = new Logger(Utils.GetLogsName(Config.Port)); + _outputLogger = new Logger(Utils.GetOutputLogsName(Config.Port)); + _serverProcess?.Dispose(); Socket = new SocketServer(this); var gameArgs = new List { "-batchmode", "-nographics", "-silent-crashes", "-nodedicateddelete", $"-id{Process.GetCurrentProcess().Id}", $"-console{Socket.Port}", $"-port{Config.Port}" }; - var startInfo = new ProcessStartInfo(fileName, Join(' ', gameArgs)) { CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; + var startInfo = new ProcessStartInfo(fileName, string.Join(' ', gameArgs)) { CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; - System.Console.WriteLine(); + Log.WriteLine(""); Log.Alert($"Starting server on port {Config.Port}."); - System.Console.WriteLine(); + Log.WriteLine(""); _serverProcess = Process.Start(startInfo); _serverProcess!.Exited += OnExited; - _serverProcess.ErrorDataReceived += (sender, args) => - { - if(IsNullOrEmpty(args.Data)) return; - Log.AppendLog("[STDERR] " + args.Data, true, true); - }; - - _serverProcess.OutputDataReceived += (sender, args) => - { - if(IsNullOrEmpty(args.Data)) return; - Log.AppendLog("[STDOUT] " + args.Data, true, true); - }; _serverProcess.EnableRaisingEvents = true; + _serverProcess.ErrorDataReceived += (s, args) => AddOutputLog(args.Data, "[STDERR]"); + _serverProcess.OutputDataReceived += (s, args) => AddOutputLog(args.Data, "[STDOUT]"); _serverProcess.BeginErrorReadLine(); _serverProcess.BeginOutputReadLine(); Status = ServerStatus.Online; + StartedTime = DateTime.Now; Rounds = 0; } @@ -94,7 +82,7 @@ private void OnExited(object o, EventArgs e) ░░░░░░░░░ ░░░░░ ░░░░░░░░ ░░░░░░ ░░░░ ░░░░░ ░░░ ", ConsoleColor.DarkYellow, false); - //if (SecretAdmin.Program.ConfigManager.SecretAdminConfig.RestartOnCrash) + //if (ConfigManager.SecretAdminConfig.RestartOnCrash) //{ Restart(); //} @@ -128,5 +116,21 @@ public void ForceRestart() Status = ServerStatus.Restarting; Restart(); } + + public void AddLog(string message, string title = null) + { + if(string.IsNullOrEmpty(message)) + return; + + _logger.AppendLog(title == null ? message : $"{title} {message}", true); + } + + public void AddOutputLog(string message, string title = null) + { + if(string.IsNullOrEmpty(message)) + return; + + _outputLogger.AppendLog(title == null ? message : $"{title} {message}", true); + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/SilentCrashHandler.cs b/SecretAdmin/Features/Server/SilentCrashHandler.cs index 7a336d4..c46c3c4 100644 --- a/SecretAdmin/Features/Server/SilentCrashHandler.cs +++ b/SecretAdmin/Features/Server/SilentCrashHandler.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; using SecretAdmin.Features.Console; -using SecretAdmin.Features.Server.Enums; using Main = SecretAdmin.Program; namespace SecretAdmin.Features.Server diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 178d99d..bfdd273 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -1,10 +1,7 @@ using System; -using System.Diagnostics; -using System.Globalization; using System.Net; -using System.Net.Sockets; using System.Text; -using System.Threading; +using System.Net.Sockets; using System.Threading.Tasks; using SecretAdmin.Features.Console; using SecretAdmin.Features.Server.Enums; @@ -74,7 +71,10 @@ public async void ListenRequests() var message = Encoding.GetString(messageBuffer, 0, length); if (HandleSecretAdminEvents(message)) + { + _server.AddLog(message, $"[{DateTime.Now:T}]"); Log.HandleMessage(message, codeType); + } } } @@ -114,15 +114,17 @@ public void HandleAction(byte action) { case OutputCodes.RoundRestart: Log.Raw("Waiting for players.", ConsoleColor.DarkCyan); - _server.RoundStartedTime = DateTime.Now; + _server.AddLog("Waiting for players."); break; case OutputCodes.IdleEnter: Log.Raw("Server entered idle mode.", ConsoleColor.DarkYellow); + _server.AddLog("Server entered idle mode."); break; case OutputCodes.IdleExit: Log.Raw("Server exited idle mode.", ConsoleColor.DarkYellow); + _server.AddLog("Server exited idle mode."); break; case OutputCodes.ExitActionReset: @@ -142,7 +144,7 @@ public void HandleAction(byte action) break; default: - Log.Alert($"Received unknown output code ({action}) ({(OutputCodes)action}), is SecretAdmin up to date?"); + Log.Alert($"Received unknown output code ({(OutputCodes)action}), is SecretAdmin up to date?"); break; } } diff --git a/SecretAdmin/Features/Server/Utils.cs b/SecretAdmin/Features/Server/Utils.cs new file mode 100644 index 0000000..70c1571 --- /dev/null +++ b/SecretAdmin/Features/Server/Utils.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using SecretAdmin.Features.Console; +using SecretAdmin.Features.Program; +using static SecretAdmin.Program; + +namespace SecretAdmin.Features.Server +{ + public class Utils + { + public static bool GetExecutable(out string executable) + { + executable = "SCPSL.x86_64"; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + executable = @"C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL.exe"; + + if (File.Exists(executable)) + return true; + + Log.Alert("\nExecutable not found, make sure this file is on the same folder as LocalAdmin."); + return false; + } + + public static string GetLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy hh.mm}]-{port}.log"); + public static string GetOutputLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy hh.mm}]-{port}-output.log"); + + public static void ArchiveServerLogs(DateTime date) + { + List filesToArchive = new(); + + foreach (var fileName in Directory.GetFiles(Paths.ServerLogsFolder)) + { + var reg = new Regex(@"\[(.*?)\]"); + var match = reg.Match(fileName); + + if (match.Success && DateTime.Parse(match.Groups[1].Value[..10]) <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays)) + { + filesToArchive.Add(fileName); + } + } + + // TODO: archive the files + } + } +} \ No newline at end of file diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 1c29f46..5b1eeaf 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -17,29 +17,29 @@ class Program public static ScpServer Server { get; private set; } public static CommandHandler CommandHandler { get; private set; } public static ConfigManager ConfigManager { get; private set; } - + public static Logger ProgramLogger { get; private set; } + static void Main(string[] args) { Console.Title = $"SecretAdmin [v{Version}]"; AppDomain.CurrentDomain.ProcessExit += OnExit; - Log.Intro(); - Console.ReadKey(); + Paths.Load(); - //ConfigManager = new ConfigManager(); + ConfigManager = new ConfigManager(); if (ProgramIntroduction.FirstTime) ProgramIntroduction.ShowIntroduction(); - Paths.Load(); + ConfigManager.LoadConfig(); + ProgramLogger = new Logger(Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM.dd.yyyy-hh.mm.ss}.log")); - //ConfigManager.LoadConfig(); - - CommandHandler = new CommandHandler(); + Log.Intro(); Server = new ScpServer(new ServerConfig()); Server.Start(); + CommandHandler = new CommandHandler(); InputManager.Start(); } @@ -48,7 +48,7 @@ private static void OnExit(object obj, EventArgs ev) Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("\nExit Detected. Killing game process."); - //if(ConfigManager.SecretAdminConfig.SafeShutdown) + if (ConfigManager.SecretAdminConfig.SafeShutdown) Server?.Kill(); Console.ForegroundColor = ConsoleColor.Cyan; From ffad5d6798a47cc3fd8b113a24858f8dace3927b Mon Sep 17 00:00:00 2001 From: Jesus Date: Thu, 11 Nov 2021 18:49:55 +0100 Subject: [PATCH 18/30] debug --- SecretAdmin/Features/Server/Utils.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SecretAdmin/Features/Server/Utils.cs b/SecretAdmin/Features/Server/Utils.cs index 70c1571..e52ae00 100644 --- a/SecretAdmin/Features/Server/Utils.cs +++ b/SecretAdmin/Features/Server/Utils.cs @@ -15,7 +15,11 @@ public static bool GetExecutable(out string executable) { executable = "SCPSL.x86_64"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - executable = @"C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL.exe"; + executable = @"SCPSL.exe"; + +#if DEBUG + executable = @"C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL.exe"; +#endif if (File.Exists(executable)) return true; From b96bd14552e27a45091a6085f8a63347907a3bd6 Mon Sep 17 00:00:00 2001 From: Jesus Date: Thu, 11 Nov 2021 19:23:16 +0100 Subject: [PATCH 19/30] ExiledInstaller modifications --- .../Features/Program/ExiledInstaller.cs | 42 +++++++------------ .../Features/Program/ProgramIntroduction.cs | 25 ++++++----- .../Server/Commands/CommandHandler.cs | 7 ++++ 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/SecretAdmin/Features/Program/ExiledInstaller.cs b/SecretAdmin/Features/Program/ExiledInstaller.cs index 0be4cda..3f5439f 100644 --- a/SecretAdmin/Features/Program/ExiledInstaller.cs +++ b/SecretAdmin/Features/Program/ExiledInstaller.cs @@ -3,6 +3,7 @@ using System.Net; using System.Runtime.InteropServices; using SecretAdmin.Features.Console; +using SecretAdmin.Features.Server; namespace SecretAdmin.Features.Program { @@ -12,53 +13,42 @@ public static void InstallExiled() { string platformSpecificString = null; + platformSpecificString = "Linux"; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { platformSpecificString = "Win.exe"; - } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - platformSpecificString = "Linux"; - } - if (platformSpecificString == null) - { - Log.Alert("Platform does not seem to be supported by EXILED! You will need to manually install it."); - return; - } - Log.Alert("Downloading EXILED..."); + using (var client = new WebClient()) - { - client.DownloadFile( - $"https://github.com/Exiled-Team/EXILED/releases/latest/download/Exiled.Installer-{platformSpecificString}", - $"Exiled.Installer-{platformSpecificString}"); - } - + client.DownloadFile($"https://github.com/Exiled-Team/EXILED/releases/latest/download/Exiled.Installer-{platformSpecificString}", $"Exiled.Installer-{platformSpecificString}"); + Log.Alert("Running installer..."); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { Log.Alert("Marking installer as executable..."); - using (Process p = new Process()) - { - p.StartInfo.FileName = "/bin/bash"; - p.StartInfo.Arguments = "-c \" chmod +x ./Exiled.Installer-Linux\" "; - p.StartInfo.CreateNoWindow = true; + + using var p = new Process(); + + p.StartInfo.FileName = "/bin/bash"; + p.StartInfo.Arguments = "-c \" chmod +x ./Exiled.Installer-Linux\" "; + p.StartInfo.CreateNoWindow = true; - p.Start(); - p.WaitForExit(); - } + p.Start(); + p.WaitForExit(); } using (Process p = new Process()) { p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; - p.StartInfo.FileName = $@"{Directory.GetCurrentDirectory()}/Exiled.Installer-{platformSpecificString}"; + p.StartInfo.FileName = $"Exiled.Installer-{platformSpecificString}"; p.Start(); p.WaitForExit(); } + Log.Alert("Done! Exiled was installed correctly."); } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index 4b8e58e..7f436e4 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -21,27 +21,30 @@ public static void ShowIntroduction() // Program Options var cfg = new MainConfig(); - - Log.Alert("Do you want to enable the auto updater? (Y) yes (y) / no (n)"); - var au = System.Console.ReadLine()?.ToLower(); - if (au != null && (au[0] == 'y' || au[0] == 'n')) - cfg.AutoUpdater = au[0] == 'y'; + + cfg.AutoUpdater = GetOption("Do you want to enable the auto updater?"); Paths.Load(); SecretAdmin.Program.ConfigManager.SaveConfig(cfg); // Server Options - - Log.Alert("Do you want to auto-install EXILED? (y/n)"); - var ai = System.Console.ReadLine()?.ToLower(); - if (ai != null && (ai[0] == 'y' || ai[0] == 'n')) - ExiledInstaller.InstallExiled(); - + Log.Alert("Ok, thats all! Time to enjoy the server :)"); System.Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine("Press any key to continue."); System.Console.ReadKey(); Directory.CreateDirectory("SecretAdmin"); } + + private static bool GetOption(string msg) + { + START: + Log.Alert($"{msg} yes (y) / no (n)"); + var opt = System.Console.ReadLine()?.ToLower(); + if (!string.IsNullOrWhiteSpace(opt) && (opt[0] == 'y' || opt[0] == 'n')) + return opt[0] == 'y'; + Log.Alert("An error occurred parsing the input, please try again!"); + goto START; + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/Commands/CommandHandler.cs b/SecretAdmin/Features/Server/Commands/CommandHandler.cs index e63b58f..3aa2492 100644 --- a/SecretAdmin/Features/Server/Commands/CommandHandler.cs +++ b/SecretAdmin/Features/Server/Commands/CommandHandler.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Reflection; using SecretAdmin.Features.Console; +using SecretAdmin.Features.Program; using SecretAdmin.Features.Server.Enums; namespace SecretAdmin.Features.Server.Commands @@ -16,6 +17,12 @@ private void ShowRamUsage() Log.Alert($"RAM USAGE: (X)MB"); // TODO: calculate this } + [ConsoleCommand("exiled")] + private void ExiledInstall() + { + ExiledInstaller.InstallExiled(); + } + [ConsoleCommand("Quit")] private void QuitCommand() { From fe8e6570b8bfc83b0f97ad79cec0b318c0ff6cfc Mon Sep 17 00:00:00 2001 From: Jesus Date: Fri, 12 Nov 2021 18:09:14 +0100 Subject: [PATCH 20/30] bomb v2 (program configs done and more) --- SecretAdmin/Features/Console/Log.cs | 6 ++++-- SecretAdmin/Features/Console/Logger.cs | 17 +++++++-------- SecretAdmin/Features/Program/AutoUpdater.cs | 5 ++++- .../Features/Program/Config/ConfigManager.cs | 5 ++--- .../Features/Program/Config/MainConfig.cs | 2 +- .../Features/Program/ExiledInstaller.cs | 8 ++----- SecretAdmin/Features/Program/InputManager.cs | 3 +-- .../Features/Program/ProgramIntroduction.cs | 4 +++- SecretAdmin/Features/Server/ScpServer.cs | 19 +++++++---------- SecretAdmin/Features/Server/SocketServer.cs | 21 ++++++++++--------- SecretAdmin/Features/Server/Utils.cs | 18 ++++------------ SecretAdmin/Program.cs | 10 +++++++-- 12 files changed, 54 insertions(+), 64 deletions(-) diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index f11852d..6080262 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -1,6 +1,4 @@ using System; -using System.Drawing; -using System.IO; using System.Text.RegularExpressions; using SConsole = System.Console; using static SecretAdmin.Program; @@ -25,6 +23,10 @@ public static void Intro() Write($"Secret Admin - Version v{SecretAdmin.Program.Version}"); WriteLine(" by Jesus-QC", ConsoleColor.Blue); WriteLine("Released under MIT License Copyright © Jesus-QC 2021", ConsoleColor.Red); + + if (!ConfigManager.SecretAdminConfig.ManualStart) + return; + WriteLine("Press any key to continue.", ConsoleColor.Green); SConsole.ReadKey(); } diff --git a/SecretAdmin/Features/Console/Logger.cs b/SecretAdmin/Features/Console/Logger.cs index 8eaddea..f3910f6 100644 --- a/SecretAdmin/Features/Console/Logger.cs +++ b/SecretAdmin/Features/Console/Logger.cs @@ -1,6 +1,4 @@ -using System; -using System.IO; -using SecretAdmin.Features.Server; +using System.IO; namespace SecretAdmin.Features.Console { @@ -15,13 +13,12 @@ public Logger(string path) public void AppendLog(string message, bool newLine = false) { - using (var stream = File.AppendText(_path)) - { - if (newLine) - stream.WriteLine(message); - else - stream.Write(message); - } + using var stream = File.AppendText(_path); + + if (newLine) + stream.WriteLine(message); + else + stream.Write(message); } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Program/AutoUpdater.cs b/SecretAdmin/Features/Program/AutoUpdater.cs index 9893516..29d985b 100644 --- a/SecretAdmin/Features/Program/AutoUpdater.cs +++ b/SecretAdmin/Features/Program/AutoUpdater.cs @@ -2,6 +2,9 @@ { public class AutoUpdater { - + public void CheckForUpdates() + { + // todo: this + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Program/Config/ConfigManager.cs b/SecretAdmin/Features/Program/Config/ConfigManager.cs index cc1d707..ce33610 100644 --- a/SecretAdmin/Features/Program/Config/ConfigManager.cs +++ b/SecretAdmin/Features/Program/Config/ConfigManager.cs @@ -5,11 +5,10 @@ namespace SecretAdmin.Features.Program.Config { public class ConfigManager { - public MainConfig SecretAdminConfig { get; private set; } - + public MainConfig SecretAdminConfig { get; private set; } = new (); private readonly Serializer _serializer = new (); private readonly Deserializer _deserializer = new (); - + public void LoadConfig() { if(!File.Exists(Paths.ProgramConfig)) diff --git a/SecretAdmin/Features/Program/Config/MainConfig.cs b/SecretAdmin/Features/Program/Config/MainConfig.cs index 6e0686b..213a864 100644 --- a/SecretAdmin/Features/Program/Config/MainConfig.cs +++ b/SecretAdmin/Features/Program/Config/MainConfig.cs @@ -5,7 +5,7 @@ public class MainConfig public bool AutoUpdater { get; set; } = true; public bool RestartOnCrash { get; set; } = true; public int ArchiveLogsDays { get; set; } = 1; - public bool ManualStart { get; set; } = true; + public bool ManualStart { get; set; } = false; public bool SafeShutdown { get; set; } = true; public bool RestartWithLowMemory { get; set; } = true; public int MaxDefaultMemory { get; set; } = 2048; diff --git a/SecretAdmin/Features/Program/ExiledInstaller.cs b/SecretAdmin/Features/Program/ExiledInstaller.cs index 3f5439f..cd45254 100644 --- a/SecretAdmin/Features/Program/ExiledInstaller.cs +++ b/SecretAdmin/Features/Program/ExiledInstaller.cs @@ -1,9 +1,7 @@ using System.Diagnostics; -using System.IO; using System.Net; using System.Runtime.InteropServices; using SecretAdmin.Features.Console; -using SecretAdmin.Features.Server; namespace SecretAdmin.Features.Program { @@ -11,9 +9,7 @@ public class ExiledInstaller { public static void InstallExiled() { - string platformSpecificString = null; - - platformSpecificString = "Linux"; + var platformSpecificString = "Linux"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) platformSpecificString = "Win.exe"; @@ -47,7 +43,7 @@ public static void InstallExiled() p.Start(); p.WaitForExit(); } - + Log.Alert("Done! Exiled was installed correctly."); } } diff --git a/SecretAdmin/Features/Program/InputManager.cs b/SecretAdmin/Features/Program/InputManager.cs index b92f9a5..e9e9954 100644 --- a/SecretAdmin/Features/Program/InputManager.cs +++ b/SecretAdmin/Features/Program/InputManager.cs @@ -1,5 +1,4 @@ -using System; -using SecretAdmin.Features.Console; +using SecretAdmin.Features.Console; namespace SecretAdmin.Features.Program { diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index 7f436e4..7fe3b6d 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -12,7 +12,7 @@ public class ProgramIntroduction public static void ShowIntroduction() { Log.Intro(); - Log.WriteLine(""); + Log.WriteLine(); Log.Alert("Hi, welcome to SecretAdmin!"); Log.Alert("It seems like your first time using it, so we have to configure some things before!"); Log.WriteLine("Press any key to continue.", ConsoleColor.Green); @@ -29,6 +29,8 @@ public static void ShowIntroduction() // Server Options + // Start the server + Log.Alert("Ok, thats all! Time to enjoy the server :)"); System.Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine("Press any key to continue."); diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index d54aa1d..e5170c9 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -40,15 +40,15 @@ public void Start() var gameArgs = new List { "-batchmode", "-nographics", "-silent-crashes", "-nodedicateddelete", $"-id{Process.GetCurrentProcess().Id}", $"-console{Socket.Port}", $"-port{Config.Port}" }; var startInfo = new ProcessStartInfo(fileName, string.Join(' ', gameArgs)) { CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; - Log.WriteLine(""); + Log.WriteLine(); Log.Alert($"Starting server on port {Config.Port}."); - Log.WriteLine(""); + Log.WriteLine(); _serverProcess = Process.Start(startInfo); _serverProcess!.Exited += OnExited; _serverProcess.EnableRaisingEvents = true; - _serverProcess.ErrorDataReceived += (s, args) => AddOutputLog(args.Data, "[STDERR]"); - _serverProcess.OutputDataReceived += (s, args) => AddOutputLog(args.Data, "[STDOUT]"); + _serverProcess.ErrorDataReceived += (_, args) => AddOutputLog(args.Data, "[STDERR]"); + _serverProcess.OutputDataReceived += (_, args) => AddOutputLog(args.Data, "[STDOUT]"); _serverProcess.BeginErrorReadLine(); _serverProcess.BeginOutputReadLine(); @@ -82,15 +82,10 @@ private void OnExited(object o, EventArgs e) ░░░░░░░░░ ░░░░░ ░░░░░░░░ ░░░░░░ ░░░░ ░░░░░ ░░░ ", ConsoleColor.DarkYellow, false); - //if (ConfigManager.SecretAdminConfig.RestartOnCrash) - //{ + if (SecretAdmin.Program.ConfigManager.SecretAdminConfig.RestartOnCrash) Restart(); - //} - //else - //{ - // Log.Raw("Server crashed, press any key to close SecretAdmin."); - //System.Console.ReadKey(); - //} + else + Log.Raw("Server crashed, press any key to close SecretAdmin."); System.Console.ReadKey(); return; default: diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index bfdd273..8a15edc 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -151,18 +151,19 @@ public void HandleAction(byte action) private bool HandleSecretAdminEvents(string message) { - switch (message) + if (message == "Command saping does not exist!") { - case "Command saping does not exist!": - _crashHandler.OnReceivePing(); - return false; + _crashHandler.OnReceivePing(); + return false; + } + + if (message.StartsWith("Round finished!") || message.StartsWith("Round restart forced.")) + { + _server.Rounds++; - /*case "the round is about to restart! please wait": - System.Console.WriteLine("a"); - _server.Rounds++; - if (_server.Config.RoundsToRestart >= _server.Rounds) - _server.ForceRestart(); - return true;*/ + if (_server.Config.RoundsToRestart >= _server.Rounds && _server.Status == ServerStatus.Online) + _server.ForceRestart(); + return true; } return true; diff --git a/SecretAdmin/Features/Server/Utils.cs b/SecretAdmin/Features/Server/Utils.cs index e52ae00..9cc3f5f 100644 --- a/SecretAdmin/Features/Server/Utils.cs +++ b/SecretAdmin/Features/Server/Utils.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using SecretAdmin.Features.Console; @@ -28,24 +29,13 @@ public static bool GetExecutable(out string executable) return false; } - public static string GetLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy hh.mm}]-{port}.log"); - public static string GetOutputLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy hh.mm}]-{port}-output.log"); + public static string GetLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy HH.mm}]-{port}.log"); + public static string GetOutputLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy HH.mm}]-{port}-output.log"); public static void ArchiveServerLogs(DateTime date) { - List filesToArchive = new(); + var filesToArchive = (from fileName in Directory.GetFiles(Paths.ServerLogsFolder) let reg = new Regex(@"\[(.*?)\]") let match = reg.Match(fileName) where match.Success && DateTime.Parse(match.Groups[1].Value[..10]) <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays) select fileName).ToList(); - foreach (var fileName in Directory.GetFiles(Paths.ServerLogsFolder)) - { - var reg = new Regex(@"\[(.*?)\]"); - var match = reg.Match(fileName); - - if (match.Success && DateTime.Parse(match.Groups[1].Value[..10]) <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays)) - { - filesToArchive.Add(fileName); - } - } - // TODO: archive the files } } diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 5b1eeaf..8f9693e 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -18,12 +18,14 @@ class Program public static CommandHandler CommandHandler { get; private set; } public static ConfigManager ConfigManager { get; private set; } public static Logger ProgramLogger { get; private set; } + public static AutoUpdater AutoUpdater { get; private set; } static void Main(string[] args) { - Console.Title = $"SecretAdmin [v{Version}]"; AppDomain.CurrentDomain.ProcessExit += OnExit; + Console.Title = $"SecretAdmin [v{Version}]"; + Paths.Load(); ConfigManager = new ConfigManager(); @@ -33,13 +35,17 @@ static void Main(string[] args) ConfigManager.LoadConfig(); ProgramLogger = new Logger(Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM.dd.yyyy-hh.mm.ss}.log")); + + AutoUpdater = new AutoUpdater(); + if(ConfigManager.SecretAdminConfig.AutoUpdater) + AutoUpdater.CheckForUpdates(); Log.Intro(); Server = new ScpServer(new ServerConfig()); Server.Start(); - CommandHandler = new CommandHandler(); + CommandHandler = new (); InputManager.Start(); } From 2320537cf224d054d6413b73801f22df3b37f55a Mon Sep 17 00:00:00 2001 From: Jesus Date: Fri, 12 Nov 2021 21:55:12 +0100 Subject: [PATCH 21/30] archive logs and some static thingies --- SecretAdmin/Features/Console/Log.cs | 2 +- SecretAdmin/Features/Program/AutoUpdater.cs | 4 +- .../Features/Program/ExiledInstaller.cs | 2 +- SecretAdmin/Features/Program/InputManager.cs | 2 +- SecretAdmin/Features/Program/Paths.cs | 2 +- .../Features/Program/ProgramIntroduction.cs | 2 +- SecretAdmin/Features/Server/ScpServer.cs | 1 + SecretAdmin/Features/Server/Utils.cs | 37 +++++++++++++++++-- SecretAdmin/Program.cs | 9 ++--- SecretAdmin/SecretAdmin.csproj | 4 ++ 10 files changed, 49 insertions(+), 16 deletions(-) diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index 6080262..e9c5c21 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -5,7 +5,7 @@ namespace SecretAdmin.Features.Console { - public class Log + public static class Log { private static readonly Regex FrameworksRegex = new (@"\[(DEBUG|INFO|WARN|ERROR)\] (\[.*?\]) (.*)", RegexOptions.Compiled | RegexOptions.Singleline); diff --git a/SecretAdmin/Features/Program/AutoUpdater.cs b/SecretAdmin/Features/Program/AutoUpdater.cs index 29d985b..7438b6f 100644 --- a/SecretAdmin/Features/Program/AutoUpdater.cs +++ b/SecretAdmin/Features/Program/AutoUpdater.cs @@ -1,8 +1,8 @@ namespace SecretAdmin.Features.Program { - public class AutoUpdater + public static class AutoUpdater { - public void CheckForUpdates() + public static void CheckForUpdates() { // todo: this } diff --git a/SecretAdmin/Features/Program/ExiledInstaller.cs b/SecretAdmin/Features/Program/ExiledInstaller.cs index cd45254..1a5539d 100644 --- a/SecretAdmin/Features/Program/ExiledInstaller.cs +++ b/SecretAdmin/Features/Program/ExiledInstaller.cs @@ -5,7 +5,7 @@ namespace SecretAdmin.Features.Program { - public class ExiledInstaller + public static class ExiledInstaller { public static void InstallExiled() { diff --git a/SecretAdmin/Features/Program/InputManager.cs b/SecretAdmin/Features/Program/InputManager.cs index e9e9954..95c775d 100644 --- a/SecretAdmin/Features/Program/InputManager.cs +++ b/SecretAdmin/Features/Program/InputManager.cs @@ -2,7 +2,7 @@ namespace SecretAdmin.Features.Program { - public class InputManager + public static class InputManager { public static void Start() { diff --git a/SecretAdmin/Features/Program/Paths.cs b/SecretAdmin/Features/Program/Paths.cs index 41e18ca..26949c4 100644 --- a/SecretAdmin/Features/Program/Paths.cs +++ b/SecretAdmin/Features/Program/Paths.cs @@ -2,7 +2,7 @@ namespace SecretAdmin.Features.Program { - public class Paths + public static class Paths { public static string MainFolder { get; private set; } public static string LogsFolder { get; private set; } diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index 7fe3b6d..bbba2fb 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -5,7 +5,7 @@ namespace SecretAdmin.Features.Program { - public class ProgramIntroduction + public static class ProgramIntroduction { public static bool FirstTime => !File.Exists(Paths.ProgramConfig); diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index e5170c9..d9f531b 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -31,6 +31,7 @@ public void Start() return; } + Utils.ArchiveServerLogs(); _logger = new Logger(Utils.GetLogsName(Config.Port)); _outputLogger = new Logger(Utils.GetOutputLogsName(Config.Port)); diff --git a/SecretAdmin/Features/Server/Utils.cs b/SecretAdmin/Features/Server/Utils.cs index 9cc3f5f..72c9fcb 100644 --- a/SecretAdmin/Features/Server/Utils.cs +++ b/SecretAdmin/Features/Server/Utils.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Linq; using System.Runtime.InteropServices; +using System.Text; using System.Text.RegularExpressions; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; @@ -10,7 +12,7 @@ namespace SecretAdmin.Features.Server { - public class Utils + public static class Utils { public static bool GetExecutable(out string executable) { @@ -32,11 +34,38 @@ public static bool GetExecutable(out string executable) public static string GetLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy HH.mm}]-{port}.log"); public static string GetOutputLogsName(uint port) => Path.Combine(Paths.ServerLogsFolder, $"[{DateTime.Now:MM-dd-yyyy HH.mm}]-{port}-output.log"); - public static void ArchiveServerLogs(DateTime date) + public static void ArchiveServerLogs() { - var filesToArchive = (from fileName in Directory.GetFiles(Paths.ServerLogsFolder) let reg = new Regex(@"\[(.*?)\]") let match = reg.Match(fileName) where match.Success && DateTime.Parse(match.Groups[1].Value[..10]) <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays) select fileName).ToList(); + var filesToArchive = (from fileName in Directory.GetFiles(Paths.ServerLogsFolder) let reg = new Regex(@"\[(.*?)\]") let match = reg.Match(fileName) where match.Success && match.Groups[1].Value.Length > 10 && DateTime.TryParse(match.Groups[1].Value[..10], out var d) && d <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays) select fileName).ToList(); + var zipName = Path.Combine(Paths.ServerLogsFolder, $"{DateTime.Now:MM-dd-yyyy}-archive.zip"); + + if(!File.Exists(zipName)) + File.WriteAllText(zipName, ""); + + using var archive = ZipFile.Open(zipName, ZipArchiveMode.Update); + + foreach (var file in filesToArchive) + { + archive.CreateEntryFromFile(file, new FileInfo(file).Name); + File.Delete(file); + } + } + + public static void ArchiveControlLogs() + { + var filesToArchive = (from fileName in Directory.GetFiles(Paths.ProgramLogsFolder) where DateTime.TryParse(fileName.Replace(".log", ""), out var d) && d <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays) select fileName).ToList(); + var zipName = Path.Combine(Paths.ServerLogsFolder, $"{DateTime.Now:MM-dd-yyyy}-archive.zip"); + + if(!File.Exists(zipName)) + File.WriteAllText(zipName, ""); + + using var archive = ZipFile.Open(zipName, ZipArchiveMode.Update); - // TODO: archive the files + foreach (var file in filesToArchive) + { + archive.CreateEntryFromFile(file, new FileInfo(file).Name); + File.Delete(file); + } } } } \ No newline at end of file diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 8f9693e..0d01104 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -18,8 +18,7 @@ class Program public static CommandHandler CommandHandler { get; private set; } public static ConfigManager ConfigManager { get; private set; } public static Logger ProgramLogger { get; private set; } - public static AutoUpdater AutoUpdater { get; private set; } - + static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += OnExit; @@ -35,8 +34,8 @@ static void Main(string[] args) ConfigManager.LoadConfig(); ProgramLogger = new Logger(Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM.dd.yyyy-hh.mm.ss}.log")); - - AutoUpdater = new AutoUpdater(); + Utils.ArchiveControlLogs(); + if(ConfigManager.SecretAdminConfig.AutoUpdater) AutoUpdater.CheckForUpdates(); @@ -45,7 +44,7 @@ static void Main(string[] args) Server = new ScpServer(new ServerConfig()); Server.Start(); - CommandHandler = new (); + CommandHandler = new CommandHandler(); InputManager.Start(); } diff --git a/SecretAdmin/SecretAdmin.csproj b/SecretAdmin/SecretAdmin.csproj index 47dbb93..b02ab32 100644 --- a/SecretAdmin/SecretAdmin.csproj +++ b/SecretAdmin/SecretAdmin.csproj @@ -14,4 +14,8 @@ + + + + From 463ec51ceffd1cb0d497aa9224aa664e437acf15 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 13 Nov 2021 13:06:13 +0100 Subject: [PATCH 22/30] third bomb, server configs and args --- .../Features/Program/ArgumentsManager.cs | 36 ++++++++++++++++-- .../Features/Program/Config/ConfigManager.cs | 21 +++++++++- .../Features/Program/ProgramIntroduction.cs | 38 +++++++++++++++++-- SecretAdmin/Program.cs | 11 +++--- 4 files changed, 93 insertions(+), 13 deletions(-) diff --git a/SecretAdmin/Features/Program/ArgumentsManager.cs b/SecretAdmin/Features/Program/ArgumentsManager.cs index c95e2c5..9d79883 100644 --- a/SecretAdmin/Features/Program/ArgumentsManager.cs +++ b/SecretAdmin/Features/Program/ArgumentsManager.cs @@ -1,15 +1,43 @@ namespace SecretAdmin.Features.Program { - public class ArgumentsManager + public static class ArgumentsManager { // TODO: this /* * Arguments: * --reconfigure -r - * --config -c - * --logs -l - * --game-logs -gl + * --config -c * --no-logs -nl */ + + public static Args GetArgs(string[] args) + { + var ret = new Args(); + + for (int i = 0; i < args.Length; i++) + { + switch (args[i]) + { + case "--reconfigure" or "-r": + ret.Reconfigure = true; + break; + case "--config" or "-c" when args.Length > i + 1: + ret.Config = args[i + 1]; + break; + case "--no-logs" or "-nl": + ret.Logs = false; + break; + } + } + + return ret; + } + + public class Args + { + public bool Reconfigure = false; + public string Config = "default.yml"; + public bool Logs = true; + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Program/Config/ConfigManager.cs b/SecretAdmin/Features/Program/Config/ConfigManager.cs index ce33610..5152587 100644 --- a/SecretAdmin/Features/Program/Config/ConfigManager.cs +++ b/SecretAdmin/Features/Program/Config/ConfigManager.cs @@ -13,7 +13,7 @@ public void LoadConfig() { if(!File.Exists(Paths.ProgramConfig)) SaveConfig(new MainConfig()); - + SecretAdminConfig = _deserializer.Deserialize(File.ReadAllText(Paths.ProgramConfig)); } @@ -22,5 +22,24 @@ public void SaveConfig(MainConfig config) File.WriteAllText(Paths.ProgramConfig, _serializer.Serialize(config)); LoadConfig(); } + + public void SaveServerConfig(ServerConfig config) + { + File.WriteAllText(Path.Combine(Paths.ServerConfigsFolder, "default.yml"), _serializer.Serialize(config)); + File.WriteAllText(Path.Combine(Paths.ServerConfigsFolder, "7777.yml"), _serializer.Serialize(config)); + } + + public ServerConfig GetServerConfig(string name) + { + var def = Path.Combine(Paths.ServerConfigsFolder, "default.yml"); + + if(!File.Exists(def)) + SaveServerConfig(new ServerConfig()); + + if (name != null && File.Exists(Path.Combine(Paths.ServerConfigsFolder, name))) + return _deserializer.Deserialize(File.ReadAllText(Path.Combine(Paths.ServerConfigsFolder, name))); + + return _deserializer.Deserialize(File.ReadAllText(def)); + } } } \ No newline at end of file diff --git a/SecretAdmin/Features/Program/ProgramIntroduction.cs b/SecretAdmin/Features/Program/ProgramIntroduction.cs index bbba2fb..e78b0fc 100644 --- a/SecretAdmin/Features/Program/ProgramIntroduction.cs +++ b/SecretAdmin/Features/Program/ProgramIntroduction.cs @@ -20,15 +20,34 @@ public static void ShowIntroduction() // Program Options - var cfg = new MainConfig(); - - cfg.AutoUpdater = GetOption("Do you want to enable the auto updater?"); + var cfg = new MainConfig + { + AutoUpdater = GetOption("Do you want to enable the auto updater?"), + ManualStart = GetOption("Do you want to manually have to enter a key to start the server?"), + SafeShutdown = GetOption("Do you want to safe shutdown the game processes?"), + ArchiveLogsDays = GetOption("In how many days the logs should be archived?", "1"), + RestartOnCrash = GetOption("Should the server automatically restart itself when it crashes?"), + RestartWithLowMemory = GetOption("Should the server restart itself when it has low memory?"), + MaxDefaultMemory = GetOption("Max memory the server can use, in MB.", "2048") + }; Paths.Load(); SecretAdmin.Program.ConfigManager.SaveConfig(cfg); + + Log.WriteLine(); + Log.Raw("That were all the program configs! You can edit them always in /SecretAdmin/config.yml.", ConsoleColor.Cyan); + Log.Alert("Time to edit the default server configs."); // Server Options + var srvConfig = new ServerConfig() + { + Port = (uint)GetOption("Which should be the default server port?", "7777"), + RoundsToRestart = GetOption("In how many rounds the server should restart itself. -1 disable, 0 every round", "-1") + }; + + SecretAdmin.Program.ConfigManager.SaveServerConfig(srvConfig); + // Start the server Log.Alert("Ok, thats all! Time to enjoy the server :)"); @@ -48,5 +67,18 @@ private static bool GetOption(string msg) Log.Alert("An error occurred parsing the input, please try again!"); goto START; } + + private static int GetOption(string msg, string def) + { + START: + Log.Alert($"{msg} introduce a number. (default = {def})"); + var opt = System.Console.ReadLine(); + if (string.IsNullOrWhiteSpace(opt)) + return int.Parse(def); + if (int.TryParse(opt, out var z)) + return z; + Log.Alert("An error occurred parsing the input, please try again!"); + goto START; + } } } \ No newline at end of file diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 0d01104..db59e99 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -22,18 +22,19 @@ class Program static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += OnExit; - Console.Title = $"SecretAdmin [v{Version}]"; - Paths.Load(); + var arguments = ArgumentsManager.GetArgs(args); + Paths.Load(); ConfigManager = new ConfigManager(); - if (ProgramIntroduction.FirstTime) + if (ProgramIntroduction.FirstTime || arguments.Reconfigure) ProgramIntroduction.ShowIntroduction(); ConfigManager.LoadConfig(); - ProgramLogger = new Logger(Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM.dd.yyyy-hh.mm.ss}.log")); + if(arguments.Logs) + ProgramLogger = new Logger(Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM.dd.yyyy-hh.mm.ss}.log")); Utils.ArchiveControlLogs(); if(ConfigManager.SecretAdminConfig.AutoUpdater) @@ -41,7 +42,7 @@ static void Main(string[] args) Log.Intro(); - Server = new ScpServer(new ServerConfig()); + Server = new ScpServer(ConfigManager.GetServerConfig(arguments.Config)); Server.Start(); CommandHandler = new CommandHandler(); From 2e117d58cb2b3a11ebfc56da6a3a06a05149d5f2 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 13 Nov 2021 17:06:50 +0100 Subject: [PATCH 23/30] modules and more --- SecretAdmin/API/Features/IModule.cs | 13 ++++ SecretAdmin/API/Features/Module.cs | 27 ++++++++ SecretAdmin/API/ModuleManager.cs | 71 ++++++++++++++++++++ SecretAdmin/Features/Console/Log.cs | 11 +-- SecretAdmin/Features/Console/Logger.cs | 2 +- SecretAdmin/Features/Program/InputManager.cs | 7 +- SecretAdmin/Features/Program/Paths.cs | 6 ++ SecretAdmin/Program.cs | 10 +-- SecretAdmin/SecretAdmin.csproj | 2 +- 9 files changed, 136 insertions(+), 13 deletions(-) create mode 100644 SecretAdmin/API/Features/IModule.cs create mode 100644 SecretAdmin/API/Features/Module.cs create mode 100644 SecretAdmin/API/ModuleManager.cs diff --git a/SecretAdmin/API/Features/IModule.cs b/SecretAdmin/API/Features/IModule.cs new file mode 100644 index 0000000..696acdf --- /dev/null +++ b/SecretAdmin/API/Features/IModule.cs @@ -0,0 +1,13 @@ +using System; + +namespace SecretAdmin.API.Features +{ + public interface IModule + { + string Name { get; set; } + string Author { get; set; } + Version Version { get; set; } + + void OnEnabled(); + } +} \ No newline at end of file diff --git a/SecretAdmin/API/Features/Module.cs b/SecretAdmin/API/Features/Module.cs new file mode 100644 index 0000000..af7a73d --- /dev/null +++ b/SecretAdmin/API/Features/Module.cs @@ -0,0 +1,27 @@ +using System; +using System.Reflection; +using SecretAdmin.Features.Console; + +namespace SecretAdmin.API.Features +{ + public abstract class Module : IModule + { + protected Module() + { + Assembly = Assembly.GetCallingAssembly(); + Name ??= Assembly.GetName().Name; + Author ??= "Unknown"; + Version ??= Assembly.GetName().Version; + } + + private Assembly Assembly { get; } + public virtual string Name { get; set; } + public virtual string Author { get; set; } + public virtual Version Version { get; set; } + + public virtual void OnEnabled() + { + Log.Raw($"The module {Name} [{Version}] by {Author} was enabled.", ConsoleColor.DarkMagenta); + } + } +} \ No newline at end of file diff --git a/SecretAdmin/API/ModuleManager.cs b/SecretAdmin/API/ModuleManager.cs new file mode 100644 index 0000000..75ef0a5 --- /dev/null +++ b/SecretAdmin/API/ModuleManager.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using SecretAdmin.API.Features; +using SecretAdmin.Features.Console; +using SecretAdmin.Features.Program; +using Module = SecretAdmin.API.Features.Module; + +namespace SecretAdmin.API +{ + public static class ModuleManager + { + public static List Modules = new (); + + public static void LoadAll() + { + Log.Raw("Loading modules dependencies!", ConsoleColor.DarkCyan); + + var startTime = DateTime.Now; + + foreach (var file in Directory.GetFiles(Paths.ModulesDependenciesFolder, "*.dll")) + { + try + { + var assembly = Assembly.Load(File.ReadAllBytes(file)); + Log.Raw($"Dependency {assembly.GetName().Name} ({assembly.GetName().Version}) has been loaded!"); + } + catch (Exception e) + { + Log.Raw($"Couldn't load the dependency in the path {file}\n{e}", ConsoleColor.Red); + throw; + } + } + + Log.Raw($"Dependencies loaded in {(DateTime.Now - startTime).TotalMilliseconds}ms", ConsoleColor.Cyan); + Log.Raw("Loading modules!", ConsoleColor.DarkCyan); + + startTime = DateTime.Now; + + foreach (var file in Directory.GetFiles(Paths.ModulesFolder, "*.dll")) + { + var assembly = Assembly.Load(File.ReadAllBytes(file)); + + try + { + foreach (var type in assembly.GetTypes()) + { + if(type.IsAbstract || type.IsInterface || type.BaseType != typeof(Module)) + continue; + + var constructor = type.GetConstructor(Type.EmptyTypes); + if (constructor == null) + continue; + + var module = constructor.Invoke(null) as IModule; + module?.OnEnabled(); + + Modules.Add(module); + } + } + catch (Exception e) + { + Log.Raw(e, ConsoleColor.Red); + } + } + + Log.Raw($"Modules loaded in {(DateTime.Now - startTime).TotalMilliseconds}ms", ConsoleColor.Cyan); + } + } +} \ No newline at end of file diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index e9c5c21..baf3fc1 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -23,7 +23,8 @@ public static void Intro() Write($"Secret Admin - Version v{SecretAdmin.Program.Version}"); WriteLine(" by Jesus-QC", ConsoleColor.Blue); WriteLine("Released under MIT License Copyright © Jesus-QC 2021", ConsoleColor.Red); - + WriteLine(); + if (!ConfigManager.SecretAdminConfig.ManualStart) return; @@ -38,7 +39,7 @@ public static void Input(string message, string title = "SERVER") Raw(message, ConsoleColor.Magenta, false); } - public static void Alert(string message, bool showTimeStamp = true) + public static void Alert(object message, bool showTimeStamp = true) { if (showTimeStamp) Write($"[{DateTime.Now:T}] ", ConsoleColor.DarkRed); @@ -50,7 +51,7 @@ public static void Alert(string message, bool showTimeStamp = true) // Alerts - public static void Raw(string message, ConsoleColor color = ConsoleColor.White, bool showTimeStamp = true) => WriteLine(showTimeStamp ? $"[{DateTime.Now:T}] {message}" : message, color); + public static void Raw(object message, ConsoleColor color = ConsoleColor.White, bool showTimeStamp = true) => WriteLine(showTimeStamp ? $"[{DateTime.Now:T}] {message}" : message, color); private static void Info(string title, string message) { @@ -84,14 +85,14 @@ private static void Warn(string title, string message) WriteLine(message, ConsoleColor.Yellow); } - public static void WriteLine(string message = "", ConsoleColor color = ConsoleColor.White) + public static void WriteLine(object message = null, ConsoleColor color = ConsoleColor.White) { SConsole.ForegroundColor = color; SConsole.WriteLine(message); ProgramLogger?.AppendLog(message, true); } - public static void Write(string message = "", ConsoleColor color = ConsoleColor.White) + public static void Write(object message = null, ConsoleColor color = ConsoleColor.White) { SConsole.ForegroundColor = color; SConsole.Write(message); diff --git a/SecretAdmin/Features/Console/Logger.cs b/SecretAdmin/Features/Console/Logger.cs index f3910f6..832b80b 100644 --- a/SecretAdmin/Features/Console/Logger.cs +++ b/SecretAdmin/Features/Console/Logger.cs @@ -11,7 +11,7 @@ public Logger(string path) _path = path; } - public void AppendLog(string message, bool newLine = false) + public void AppendLog(object message, bool newLine = false) { using var stream = File.AppendText(_path); diff --git a/SecretAdmin/Features/Program/InputManager.cs b/SecretAdmin/Features/Program/InputManager.cs index 95c775d..56170ea 100644 --- a/SecretAdmin/Features/Program/InputManager.cs +++ b/SecretAdmin/Features/Program/InputManager.cs @@ -1,11 +1,16 @@ using SecretAdmin.Features.Console; +using SecretAdmin.Features.Server.Commands; namespace SecretAdmin.Features.Program { public static class InputManager { + private static CommandHandler _handler; + public static void Start() { + _handler = new CommandHandler(); + while (true) { var input = System.Console.ReadLine(); @@ -17,7 +22,7 @@ public static void Start() Log.DeletePrevConsoleLine(); - if(!SecretAdmin.Program.CommandHandler.SendCommand(input)) + if(!_handler.SendCommand(input)) ManageInput(input); } } diff --git a/SecretAdmin/Features/Program/Paths.cs b/SecretAdmin/Features/Program/Paths.cs index 26949c4..865b6e3 100644 --- a/SecretAdmin/Features/Program/Paths.cs +++ b/SecretAdmin/Features/Program/Paths.cs @@ -10,6 +10,8 @@ public static class Paths public static string ProgramLogsFolder { get; private set; } public static string ServerConfigsFolder { get; private set; } public static string ProgramConfig { get; private set; } + public static string ModulesFolder { get; private set; } + public static string ModulesDependenciesFolder { get; private set; } public static void Load() { @@ -19,6 +21,8 @@ public static void Load() ProgramLogsFolder = Path.Combine(LogsFolder, "SecretAdmin"); ServerConfigsFolder = Path.Combine(MainFolder, "Configs"); ProgramConfig = Path.Combine(MainFolder, "config.yml"); + ModulesFolder = Path.Combine(MainFolder, "Modules"); + ModulesDependenciesFolder = Path.Combine(ModulesFolder, "Dependencies"); CreateIfNotExists(); } @@ -29,6 +33,8 @@ public static void CreateIfNotExists() Directory.CreateDirectory(ServerLogsFolder); Directory.CreateDirectory(ProgramLogsFolder); Directory.CreateDirectory(ServerConfigsFolder); + Directory.CreateDirectory(ModulesFolder); + Directory.CreateDirectory(ModulesDependenciesFolder); } } } \ No newline at end of file diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index db59e99..f86f380 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -2,6 +2,7 @@ using System.Drawing; using System.IO; using System.Threading.Tasks; +using SecretAdmin.API; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; using SecretAdmin.Features.Program.Config; @@ -15,7 +16,6 @@ class Program { public static Version Version { get; } = new (0, 0, 0,1); public static ScpServer Server { get; private set; } - public static CommandHandler CommandHandler { get; private set; } public static ConfigManager ConfigManager { get; private set; } public static Logger ProgramLogger { get; private set; } @@ -28,11 +28,10 @@ static void Main(string[] args) Paths.Load(); ConfigManager = new ConfigManager(); - if (ProgramIntroduction.FirstTime || arguments.Reconfigure) ProgramIntroduction.ShowIntroduction(); - ConfigManager.LoadConfig(); + if(arguments.Logs) ProgramLogger = new Logger(Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM.dd.yyyy-hh.mm.ss}.log")); Utils.ArchiveControlLogs(); @@ -42,10 +41,11 @@ static void Main(string[] args) Log.Intro(); + ModuleManager.LoadAll(); + Server = new ScpServer(ConfigManager.GetServerConfig(arguments.Config)); Server.Start(); - - CommandHandler = new CommandHandler(); + InputManager.Start(); } diff --git a/SecretAdmin/SecretAdmin.csproj b/SecretAdmin/SecretAdmin.csproj index b02ab32..cdd741e 100644 --- a/SecretAdmin/SecretAdmin.csproj +++ b/SecretAdmin/SecretAdmin.csproj @@ -16,6 +16,6 @@ - + From c816726b05fd69675ec03a13bcf0ced330f22237 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 13 Nov 2021 17:27:54 +0100 Subject: [PATCH 24/30] dependencies --- SecretAdmin/API/ModuleManager.cs | 8 ++++++-- SecretAdmin/Features/Console/Log.cs | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/SecretAdmin/API/ModuleManager.cs b/SecretAdmin/API/ModuleManager.cs index 75ef0a5..ceeaa50 100644 --- a/SecretAdmin/API/ModuleManager.cs +++ b/SecretAdmin/API/ModuleManager.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Reflection; +using System.Runtime.Loader; +using System.Text; using SecretAdmin.API.Features; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; @@ -12,9 +14,11 @@ namespace SecretAdmin.API public static class ModuleManager { public static List Modules = new (); - + public static List Assemblies = new (); + public static void LoadAll() { + Log.WriteLine(); Log.Raw("Loading modules dependencies!", ConsoleColor.DarkCyan); var startTime = DateTime.Now; @@ -23,7 +27,7 @@ public static void LoadAll() { try { - var assembly = Assembly.Load(File.ReadAllBytes(file)); + var assembly = Assembly.UnsafeLoadFrom(file); Log.Raw($"Dependency {assembly.GetName().Name} ({assembly.GetName().Version}) has been loaded!"); } catch (Exception e) diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index baf3fc1..c1d56c5 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -23,8 +23,7 @@ public static void Intro() Write($"Secret Admin - Version v{SecretAdmin.Program.Version}"); WriteLine(" by Jesus-QC", ConsoleColor.Blue); WriteLine("Released under MIT License Copyright © Jesus-QC 2021", ConsoleColor.Red); - WriteLine(); - + if (!ConfigManager.SecretAdminConfig.ManualStart) return; From 06796febc541f1f2085094c1eb08b0b2bddfc3fe Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 13 Nov 2021 18:58:35 +0100 Subject: [PATCH 25/30] =?UTF-8?q?EVENTS=20BOMB=20=F0=9F=92=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventArgs/ReceivedActionEventArgs.cs | 16 ++++++++ .../EventArgs/ReceivedMessageEventArgs.cs | 16 ++++++++ SecretAdmin/API/Events/Handlers/Server.cs | 14 +++++++ SecretAdmin/API/Events/Utils.cs | 7 ++++ SecretAdmin/API/Features/IModule.cs | 1 + SecretAdmin/API/Features/Module.cs | 7 ++++ SecretAdmin/API/ModuleManager.cs | 4 +- SecretAdmin/Features/Console/Log.cs | 10 ++++- SecretAdmin/Features/Program/InputManager.cs | 6 +-- .../Server/Commands/CommandHandler.cs | 38 +++++++++++++++++-- SecretAdmin/Features/Server/SocketServer.cs | 10 ++++- SecretAdmin/Program.cs | 4 +- SecretAdmin/SecretAdmin.csproj | 4 -- 13 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 SecretAdmin/API/Events/EventArgs/ReceivedActionEventArgs.cs create mode 100644 SecretAdmin/API/Events/EventArgs/ReceivedMessageEventArgs.cs create mode 100644 SecretAdmin/API/Events/Handlers/Server.cs create mode 100644 SecretAdmin/API/Events/Utils.cs diff --git a/SecretAdmin/API/Events/EventArgs/ReceivedActionEventArgs.cs b/SecretAdmin/API/Events/EventArgs/ReceivedActionEventArgs.cs new file mode 100644 index 0000000..f647f18 --- /dev/null +++ b/SecretAdmin/API/Events/EventArgs/ReceivedActionEventArgs.cs @@ -0,0 +1,16 @@ +using SecretAdmin.Features.Server.Enums; + +namespace SecretAdmin.API.Events.EventArgs +{ + public class ReceivedActionEventArgs : System.EventArgs + { + public ReceivedActionEventArgs(byte actionCode) + { + OutputCode = (OutputCodes)actionCode; + IsEnabled = true; + } + + public OutputCodes OutputCode { get; set; } + public bool IsEnabled { get; set; } + } +} \ No newline at end of file diff --git a/SecretAdmin/API/Events/EventArgs/ReceivedMessageEventArgs.cs b/SecretAdmin/API/Events/EventArgs/ReceivedMessageEventArgs.cs new file mode 100644 index 0000000..4a36f69 --- /dev/null +++ b/SecretAdmin/API/Events/EventArgs/ReceivedMessageEventArgs.cs @@ -0,0 +1,16 @@ +namespace SecretAdmin.API.Events.EventArgs +{ + public class ReceivedMessageEventArgs : System.EventArgs + { + public ReceivedMessageEventArgs(string message, byte code) + { + Message = message; + Code = code; + IsAllowed = !string.IsNullOrWhiteSpace(message); + } + + public string Message { get; set; } + public byte Code { get; set; } + public bool IsAllowed { get; set; } + } +} \ No newline at end of file diff --git a/SecretAdmin/API/Events/Handlers/Server.cs b/SecretAdmin/API/Events/Handlers/Server.cs new file mode 100644 index 0000000..bce06f3 --- /dev/null +++ b/SecretAdmin/API/Events/Handlers/Server.cs @@ -0,0 +1,14 @@ +using System; +using SecretAdmin.API.Events.EventArgs; + +namespace SecretAdmin.API.Events.Handlers +{ + public static class Server + { + public static event Utils.CustomEventHandler ReceivedMessage; + public static event Utils.CustomEventHandler ReceivedAction; + + public static void OnReceivedMessage(ReceivedMessageEventArgs ev) => ReceivedMessage?.Invoke(ev); + public static void OnReceivedAction(ReceivedActionEventArgs ev) => ReceivedAction?.Invoke(ev); + } +} \ No newline at end of file diff --git a/SecretAdmin/API/Events/Utils.cs b/SecretAdmin/API/Events/Utils.cs new file mode 100644 index 0000000..d844b60 --- /dev/null +++ b/SecretAdmin/API/Events/Utils.cs @@ -0,0 +1,7 @@ +namespace SecretAdmin.API.Events +{ + public static class Utils + { + public delegate void CustomEventHandler(T ev) where T : System.EventArgs; + } +} \ No newline at end of file diff --git a/SecretAdmin/API/Features/IModule.cs b/SecretAdmin/API/Features/IModule.cs index 696acdf..08f9da5 100644 --- a/SecretAdmin/API/Features/IModule.cs +++ b/SecretAdmin/API/Features/IModule.cs @@ -9,5 +9,6 @@ public interface IModule Version Version { get; set; } void OnEnabled(); + void OnRegisteringCommands(); } } \ No newline at end of file diff --git a/SecretAdmin/API/Features/Module.cs b/SecretAdmin/API/Features/Module.cs index af7a73d..aefb479 100644 --- a/SecretAdmin/API/Features/Module.cs +++ b/SecretAdmin/API/Features/Module.cs @@ -1,6 +1,8 @@ using System; using System.Reflection; using SecretAdmin.Features.Console; +using SecretAdmin.Features.Program; +using SecretAdmin.Features.Server.Commands; namespace SecretAdmin.API.Features { @@ -23,5 +25,10 @@ public virtual void OnEnabled() { Log.Raw($"The module {Name} [{Version}] by {Author} was enabled.", ConsoleColor.DarkMagenta); } + + public virtual void OnRegisteringCommands() + { + Program.CommandHandler.RegisterCommands(Assembly); + } } } \ No newline at end of file diff --git a/SecretAdmin/API/ModuleManager.cs b/SecretAdmin/API/ModuleManager.cs index ceeaa50..c5458a4 100644 --- a/SecretAdmin/API/ModuleManager.cs +++ b/SecretAdmin/API/ModuleManager.cs @@ -14,7 +14,6 @@ namespace SecretAdmin.API public static class ModuleManager { public static List Modules = new (); - public static List Assemblies = new (); public static void LoadAll() { @@ -59,7 +58,8 @@ public static void LoadAll() var module = constructor.Invoke(null) as IModule; module?.OnEnabled(); - + module?.OnRegisteringCommands(); + Modules.Add(module); } } diff --git a/SecretAdmin/Features/Console/Log.cs b/SecretAdmin/Features/Console/Log.cs index c1d56c5..e26fdfe 100644 --- a/SecretAdmin/Features/Console/Log.cs +++ b/SecretAdmin/Features/Console/Log.cs @@ -1,7 +1,9 @@ using System; using System.Text.RegularExpressions; +using SecretAdmin.API.Events.EventArgs; using SConsole = System.Console; using static SecretAdmin.Program; +using SEvents = SecretAdmin.API.Events.Handlers.Server; namespace SecretAdmin.Features.Console { @@ -100,7 +102,13 @@ public static void Write(object message = null, ConsoleColor color = ConsoleColo public static void HandleMessage(string message, byte code) { - if(message == null) + var ev = new ReceivedMessageEventArgs(message, code); + SEvents.OnReceivedMessage(ev); + + message = ev.Message; + code = ev.Code; + + if(!ev.IsAllowed|| string.IsNullOrWhiteSpace(message)) return; var match = FrameworksRegex.Match(message); diff --git a/SecretAdmin/Features/Program/InputManager.cs b/SecretAdmin/Features/Program/InputManager.cs index 56170ea..dc03a29 100644 --- a/SecretAdmin/Features/Program/InputManager.cs +++ b/SecretAdmin/Features/Program/InputManager.cs @@ -5,12 +5,8 @@ namespace SecretAdmin.Features.Program { public static class InputManager { - private static CommandHandler _handler; - public static void Start() { - _handler = new CommandHandler(); - while (true) { var input = System.Console.ReadLine(); @@ -22,7 +18,7 @@ public static void Start() Log.DeletePrevConsoleLine(); - if(!_handler.SendCommand(input)) + if(!SecretAdmin.Program.CommandHandler.SendCommand(input)) ManageInput(input); } } diff --git a/SecretAdmin/Features/Server/Commands/CommandHandler.cs b/SecretAdmin/Features/Server/Commands/CommandHandler.cs index 3aa2492..226b4e0 100644 --- a/SecretAdmin/Features/Server/Commands/CommandHandler.cs +++ b/SecretAdmin/Features/Server/Commands/CommandHandler.cs @@ -1,6 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; +using SecretAdmin.API; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; using SecretAdmin.Features.Server.Enums; @@ -39,9 +42,8 @@ private void ExitCommand() public CommandHandler() { var ti = typeof(CommandHandler).GetTypeInfo(); - var methods = ti.DeclaredMethods; - foreach (var method in methods) + foreach (var method in ti.DeclaredMethods) { var attributes = method.GetCustomAttributes(); @@ -50,6 +52,36 @@ public CommandHandler() } } + public void RegisterCommands(Assembly assembly) + { + foreach (var type in assembly.GetTypes()) + { + foreach (var method in type.GetTypeInfo().DeclaredMethods) + { + var attributes = method.GetCustomAttributes(); + + if (attributes.FirstOrDefault() is not ConsoleCommandAttribute query) + continue; + + if (!method.IsStatic) + { + Log.Raw($"[Warn] The command {query.Name} couldn't be registered due to not being static.", ConsoleColor.DarkYellow); + continue; + } + + var cmd = query.Name.ToLower(); + + if (_commands.ContainsKey(cmd)) + { + Log.Raw($"[Error] The command \"{query.Name}\" already exists inside the module {_commands[cmd].Module.Assembly.GetName().Name}.", ConsoleColor.Red); + continue; + } + + _commands.Add(cmd, method); + } + } + } + public bool SendCommand(string name) { name = name.ToLower(); diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 8a15edc..676436b 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -3,8 +3,10 @@ using System.Text; using System.Net.Sockets; using System.Threading.Tasks; +using SecretAdmin.API.Events.EventArgs; using SecretAdmin.Features.Console; using SecretAdmin.Features.Server.Enums; +using SEvents = SecretAdmin.API.Events.Handlers.Server; namespace SecretAdmin.Features.Server { @@ -110,7 +112,13 @@ public void SendMessage(string message) public void HandleAction(byte action) { - switch ((OutputCodes)action) + var ev = new ReceivedActionEventArgs(action); + SEvents.OnReceivedAction(ev); + + if(!ev.IsEnabled) + return; + + switch (ev.OutputCode) { case OutputCodes.RoundRestart: Log.Raw("Waiting for players.", ConsoleColor.DarkCyan); diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index f86f380..5429032 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -18,6 +18,7 @@ class Program public static ScpServer Server { get; private set; } public static ConfigManager ConfigManager { get; private set; } public static Logger ProgramLogger { get; private set; } + public static CommandHandler CommandHandler { get; private set; } static void Main(string[] args) { @@ -40,7 +41,8 @@ static void Main(string[] args) AutoUpdater.CheckForUpdates(); Log.Intro(); - + + CommandHandler = new CommandHandler(); ModuleManager.LoadAll(); Server = new ScpServer(ConfigManager.GetServerConfig(arguments.Config)); diff --git a/SecretAdmin/SecretAdmin.csproj b/SecretAdmin/SecretAdmin.csproj index cdd741e..47dbb93 100644 --- a/SecretAdmin/SecretAdmin.csproj +++ b/SecretAdmin/SecretAdmin.csproj @@ -14,8 +14,4 @@ - - - - From d61decc757ef27b54a06e280e1766b9dbb901969 Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 13 Nov 2021 19:00:27 +0100 Subject: [PATCH 26/30] clearing references --- SecretAdmin/API/Events/Handlers/Server.cs | 3 +-- SecretAdmin/API/Features/Module.cs | 2 -- SecretAdmin/API/ModuleManager.cs | 2 -- SecretAdmin/Features/Program/InputManager.cs | 1 - SecretAdmin/Features/Server/Commands/CommandHandler.cs | 2 -- SecretAdmin/Features/Server/Utils.cs | 2 -- SecretAdmin/Program.cs | 3 --- 7 files changed, 1 insertion(+), 14 deletions(-) diff --git a/SecretAdmin/API/Events/Handlers/Server.cs b/SecretAdmin/API/Events/Handlers/Server.cs index bce06f3..afdf08b 100644 --- a/SecretAdmin/API/Events/Handlers/Server.cs +++ b/SecretAdmin/API/Events/Handlers/Server.cs @@ -1,5 +1,4 @@ -using System; -using SecretAdmin.API.Events.EventArgs; +using SecretAdmin.API.Events.EventArgs; namespace SecretAdmin.API.Events.Handlers { diff --git a/SecretAdmin/API/Features/Module.cs b/SecretAdmin/API/Features/Module.cs index aefb479..72d92eb 100644 --- a/SecretAdmin/API/Features/Module.cs +++ b/SecretAdmin/API/Features/Module.cs @@ -1,8 +1,6 @@ using System; using System.Reflection; using SecretAdmin.Features.Console; -using SecretAdmin.Features.Program; -using SecretAdmin.Features.Server.Commands; namespace SecretAdmin.API.Features { diff --git a/SecretAdmin/API/ModuleManager.cs b/SecretAdmin/API/ModuleManager.cs index c5458a4..704145e 100644 --- a/SecretAdmin/API/ModuleManager.cs +++ b/SecretAdmin/API/ModuleManager.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Reflection; -using System.Runtime.Loader; -using System.Text; using SecretAdmin.API.Features; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; diff --git a/SecretAdmin/Features/Program/InputManager.cs b/SecretAdmin/Features/Program/InputManager.cs index dc03a29..95c775d 100644 --- a/SecretAdmin/Features/Program/InputManager.cs +++ b/SecretAdmin/Features/Program/InputManager.cs @@ -1,5 +1,4 @@ using SecretAdmin.Features.Console; -using SecretAdmin.Features.Server.Commands; namespace SecretAdmin.Features.Program { diff --git a/SecretAdmin/Features/Server/Commands/CommandHandler.cs b/SecretAdmin/Features/Server/Commands/CommandHandler.cs index 226b4e0..caee0c9 100644 --- a/SecretAdmin/Features/Server/Commands/CommandHandler.cs +++ b/SecretAdmin/Features/Server/Commands/CommandHandler.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Reflection; -using SecretAdmin.API; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; using SecretAdmin.Features.Server.Enums; diff --git a/SecretAdmin/Features/Server/Utils.cs b/SecretAdmin/Features/Server/Utils.cs index 72c9fcb..0bd416b 100644 --- a/SecretAdmin/Features/Server/Utils.cs +++ b/SecretAdmin/Features/Server/Utils.cs @@ -1,10 +1,8 @@ using System; -using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Runtime.InteropServices; -using System.Text; using System.Text.RegularExpressions; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 5429032..181202d 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -1,14 +1,11 @@ using System; -using System.Drawing; using System.IO; -using System.Threading.Tasks; using SecretAdmin.API; using SecretAdmin.Features.Console; using SecretAdmin.Features.Program; using SecretAdmin.Features.Program.Config; using SecretAdmin.Features.Server; using SecretAdmin.Features.Server.Commands; -using SecretAdmin.Features.Server.Enums; namespace SecretAdmin { From 8e5942a80feec5407005f2a848f1b10cd0e72dfa Mon Sep 17 00:00:00 2001 From: Jesus Date: Sat, 13 Nov 2021 19:30:50 +0100 Subject: [PATCH 27/30] added 3 events --- SecretAdmin/API/Events/Handlers/Server.cs | 6 ++++++ SecretAdmin/API/Events/Utils.cs | 1 + SecretAdmin/Features/Server/ScpServer.cs | 2 ++ SecretAdmin/Features/Server/SocketServer.cs | 2 ++ 4 files changed, 11 insertions(+) diff --git a/SecretAdmin/API/Events/Handlers/Server.cs b/SecretAdmin/API/Events/Handlers/Server.cs index afdf08b..71fd956 100644 --- a/SecretAdmin/API/Events/Handlers/Server.cs +++ b/SecretAdmin/API/Events/Handlers/Server.cs @@ -6,8 +6,14 @@ public static class Server { public static event Utils.CustomEventHandler ReceivedMessage; public static event Utils.CustomEventHandler ReceivedAction; + public static event Utils.CustomEventHandler Restarted; + public static event Utils.CustomEventHandler RestartedRound; + public static event Utils.CustomEventHandler RestartingRound; public static void OnReceivedMessage(ReceivedMessageEventArgs ev) => ReceivedMessage?.Invoke(ev); public static void OnReceivedAction(ReceivedActionEventArgs ev) => ReceivedAction?.Invoke(ev); + public static void OnRestarted() => Restarted?.Invoke(); + public static void OnRestartedRound() => RestartedRound?.Invoke(); + public static void OnRestartingRound() => RestartingRound?.Invoke(); } } \ No newline at end of file diff --git a/SecretAdmin/API/Events/Utils.cs b/SecretAdmin/API/Events/Utils.cs index d844b60..b72ee76 100644 --- a/SecretAdmin/API/Events/Utils.cs +++ b/SecretAdmin/API/Events/Utils.cs @@ -3,5 +3,6 @@ public static class Utils { public delegate void CustomEventHandler(T ev) where T : System.EventArgs; + public delegate void CustomEventHandler(); } } \ No newline at end of file diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index d9f531b..11858d5 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -4,6 +4,7 @@ using SecretAdmin.Features.Console; using SecretAdmin.Features.Program.Config; using SecretAdmin.Features.Server.Enums; +using SEvents = SecretAdmin.API.Events.Handlers.Server; namespace SecretAdmin.Features.Server { @@ -103,6 +104,7 @@ public void Kill() public void Restart() { + SEvents.OnRestarted(); Kill(); Start(); } diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index 676436b..f3d9333 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -121,6 +121,7 @@ public void HandleAction(byte action) switch (ev.OutputCode) { case OutputCodes.RoundRestart: + SEvents.OnRestartedRound(); Log.Raw("Waiting for players.", ConsoleColor.DarkCyan); _server.AddLog("Waiting for players."); break; @@ -167,6 +168,7 @@ private bool HandleSecretAdminEvents(string message) if (message.StartsWith("Round finished!") || message.StartsWith("Round restart forced.")) { + SEvents.OnRestartingRound(); _server.Rounds++; if (_server.Config.RoundsToRestart >= _server.Rounds && _server.Status == ServerStatus.Online) From 25484e2d4727b3440b1a2f5111a8be586215953a Mon Sep 17 00:00:00 2001 From: Jesus Date: Sun, 14 Nov 2021 14:03:24 +0100 Subject: [PATCH 28/30] fixed logs and more --- .../Server/Commands/CommandHandler.cs | 3 +- SecretAdmin/Features/Server/MemoryManager.cs | 53 +++++++++++++++++++ SecretAdmin/Features/Server/ScpServer.cs | 8 ++- SecretAdmin/Features/Server/Utils.cs | 20 +++++-- SecretAdmin/Program.cs | 4 +- 5 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 SecretAdmin/Features/Server/MemoryManager.cs diff --git a/SecretAdmin/Features/Server/Commands/CommandHandler.cs b/SecretAdmin/Features/Server/Commands/CommandHandler.cs index caee0c9..63503c4 100644 --- a/SecretAdmin/Features/Server/Commands/CommandHandler.cs +++ b/SecretAdmin/Features/Server/Commands/CommandHandler.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Reflection; using SecretAdmin.Features.Console; @@ -15,7 +16,7 @@ public class CommandHandler [ConsoleCommand("Ram")] private void ShowRamUsage() { - Log.Alert($"RAM USAGE: (X)MB"); // TODO: calculate this + Log.Alert($"RAM USAGE: {SecretAdmin.Program.Server.MemoryManager.GetMemory()}MB"); // TODO: calculate this } [ConsoleCommand("exiled")] diff --git a/SecretAdmin/Features/Server/MemoryManager.cs b/SecretAdmin/Features/Server/MemoryManager.cs new file mode 100644 index 0000000..6592e64 --- /dev/null +++ b/SecretAdmin/Features/Server/MemoryManager.cs @@ -0,0 +1,53 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using SecretAdmin.Features.Console; +using SecretAdmin.Features.Server.Enums; +using static SecretAdmin.Program; + +namespace SecretAdmin.Features.Server +{ + public class MemoryManager : IDisposable + { + private Process _process; + private bool _killed; + + public MemoryManager(Process process) => _process = process; + + public void Start() + { + _killed = false; + //Task.Run(CheckUse); + } + + /*private async void CheckUse() + { + await Task.Delay(5000); + while (!_killed) + { + if(SecretAdmin.Program.Server.Status != ServerStatus.Online) + return; + + var mem = GetMemory(); + + if (mem > ConfigManager.SecretAdminConfig.MaxDefaultMemory) + { + Log.Raw($"LOW MEMORY. USING {mem}MB / {ConfigManager.SecretAdminConfig.MaxDefaultMemory}"); + await Task.Delay(2500); + if(ConfigManager.SecretAdminConfig.RestartWithLowMemory) + SecretAdmin.Program.Server.ForceRestart(); + } + + await Task.Delay(5000); + } + }*/ + + public long GetMemory() + { + _process.Refresh(); + return _process.WorkingSet64 / 1048576; + } + + public void Dispose() => _killed = true; + } +} \ No newline at end of file diff --git a/SecretAdmin/Features/Server/ScpServer.cs b/SecretAdmin/Features/Server/ScpServer.cs index 11858d5..4138715 100644 --- a/SecretAdmin/Features/Server/ScpServer.cs +++ b/SecretAdmin/Features/Server/ScpServer.cs @@ -10,9 +10,10 @@ namespace SecretAdmin.Features.Server { public class ScpServer { + public MemoryManager MemoryManager { get; private set; } public SocketServer Socket { get; private set; } public ServerConfig Config { get; } - + public ServerStatus Status; public DateTime StartedTime; //TODO: . public int Rounds; //TODO: . @@ -57,6 +58,9 @@ public void Start() Status = ServerStatus.Online; StartedTime = DateTime.Now; Rounds = 0; + + MemoryManager = new MemoryManager(_serverProcess); + MemoryManager.Start(); } private void OnExited(object o, EventArgs e) @@ -97,6 +101,8 @@ private void OnExited(object o, EventArgs e) public void Kill() { + MemoryManager.Dispose(); + MemoryManager = null; Socket?.Dispose(); Socket = null; _serverProcess?.Kill(); diff --git a/SecretAdmin/Features/Server/Utils.cs b/SecretAdmin/Features/Server/Utils.cs index 0bd416b..c0328ff 100644 --- a/SecretAdmin/Features/Server/Utils.cs +++ b/SecretAdmin/Features/Server/Utils.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; @@ -34,9 +36,9 @@ public static bool GetExecutable(out string executable) public static void ArchiveServerLogs() { - var filesToArchive = (from fileName in Directory.GetFiles(Paths.ServerLogsFolder) let reg = new Regex(@"\[(.*?)\]") let match = reg.Match(fileName) where match.Success && match.Groups[1].Value.Length > 10 && DateTime.TryParse(match.Groups[1].Value[..10], out var d) && d <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays) select fileName).ToList(); - var zipName = Path.Combine(Paths.ServerLogsFolder, $"{DateTime.Now:MM-dd-yyyy}-archive.zip"); - + var filesToArchive = (from fileName in Directory.GetFiles(Paths.ServerLogsFolder, "*.log") let reg = new Regex(@"\[(.*?)\]") let match = reg.Match(fileName) where match.Success && match.Groups[1].Value.Length > 15 && DateTime.TryParseExact(match.Groups[1].Value[..16], "MM-dd-yyyy HH.mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out var d) && d <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays) select fileName).ToList(); + var zipName = Path.Combine(Paths.ServerLogsFolder, $"{DateTime.Today.AddDays(-1):MM-dd-yyyy}-archive.zip"); + if(!File.Exists(zipName)) File.WriteAllText(zipName, ""); @@ -51,8 +53,16 @@ public static void ArchiveServerLogs() public static void ArchiveControlLogs() { - var filesToArchive = (from fileName in Directory.GetFiles(Paths.ProgramLogsFolder) where DateTime.TryParse(fileName.Replace(".log", ""), out var d) && d <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays) select fileName).ToList(); - var zipName = Path.Combine(Paths.ServerLogsFolder, $"{DateTime.Now:MM-dd-yyyy}-archive.zip"); + var filesToArchive = new List(); + foreach (var fileName in Directory.GetFiles(Paths.ProgramLogsFolder, "*.log")) + { + if (DateTime.TryParseExact(Path.GetFileName(fileName).Replace(".log", ""), "MM.dd.yyyy-hh.mm.ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out var d) && d <= DateTime.Today.AddDays(-ConfigManager.SecretAdminConfig.ArchiveLogsDays)) + filesToArchive.Add(fileName); + } + + var zipName = Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM-dd-yyyy}-archive.zip"); + + Log.Raw(filesToArchive.Count); if(!File.Exists(zipName)) File.WriteAllText(zipName, ""); diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 181202d..9fd3563 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -32,12 +32,12 @@ static void Main(string[] args) if(arguments.Logs) ProgramLogger = new Logger(Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM.dd.yyyy-hh.mm.ss}.log")); - Utils.ArchiveControlLogs(); - + if(ConfigManager.SecretAdminConfig.AutoUpdater) AutoUpdater.CheckForUpdates(); Log.Intro(); + Utils.ArchiveControlLogs(); CommandHandler = new CommandHandler(); ModuleManager.LoadAll(); From 57db011ec54dd6e6894ce53af9e9220c63191765 Mon Sep 17 00:00:00 2001 From: xRoier Date: Sun, 14 Nov 2021 19:57:34 +0100 Subject: [PATCH 29/30] Adding OnDisabled() in modules. --- SecretAdmin/API/Features/IModule.cs | 1 + SecretAdmin/API/Features/Module.cs | 5 +++++ SecretAdmin/Program.cs | 5 ++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/SecretAdmin/API/Features/IModule.cs b/SecretAdmin/API/Features/IModule.cs index 08f9da5..a7ed982 100644 --- a/SecretAdmin/API/Features/IModule.cs +++ b/SecretAdmin/API/Features/IModule.cs @@ -9,6 +9,7 @@ public interface IModule Version Version { get; set; } void OnEnabled(); + void OnDisabled(); void OnRegisteringCommands(); } } \ No newline at end of file diff --git a/SecretAdmin/API/Features/Module.cs b/SecretAdmin/API/Features/Module.cs index 72d92eb..8042f5e 100644 --- a/SecretAdmin/API/Features/Module.cs +++ b/SecretAdmin/API/Features/Module.cs @@ -24,6 +24,11 @@ public virtual void OnEnabled() Log.Raw($"The module {Name} [{Version}] by {Author} was enabled.", ConsoleColor.DarkMagenta); } + public virtual void OnDisabled() + { + Log.Raw($"The module {Name} [{Version}] by {Author} was disabled.", ConsoleColor.DarkMagenta); + } + public virtual void OnRegisteringCommands() { Program.CommandHandler.RegisterCommands(Assembly); diff --git a/SecretAdmin/Program.cs b/SecretAdmin/Program.cs index 9fd3563..336d6c4 100644 --- a/SecretAdmin/Program.cs +++ b/SecretAdmin/Program.cs @@ -55,7 +55,10 @@ private static void OnExit(object obj, EventArgs ev) if (ConfigManager.SecretAdminConfig.SafeShutdown) Server?.Kill(); - + + foreach (var module in ModuleManager.Modules) + module.OnDisabled(); + Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Everything seems good to go! Bye :)"); } From 78ba8dbaa956eaf275cace2ce4935f0ebf6776e8 Mon Sep 17 00:00:00 2001 From: Jesus Date: Wed, 17 Nov 2021 20:32:48 +0100 Subject: [PATCH 30/30] ram utils? --- SecretAdmin/Features/Server/MemoryManager.cs | 12 ++++++++---- SecretAdmin/Features/Server/SocketServer.cs | 2 +- SecretAdmin/Features/Server/Utils.cs | 4 +--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/SecretAdmin/Features/Server/MemoryManager.cs b/SecretAdmin/Features/Server/MemoryManager.cs index 6592e64..8ae839d 100644 --- a/SecretAdmin/Features/Server/MemoryManager.cs +++ b/SecretAdmin/Features/Server/MemoryManager.cs @@ -17,10 +17,10 @@ public class MemoryManager : IDisposable public void Start() { _killed = false; - //Task.Run(CheckUse); + Task.Run(CheckUse); } - /*private async void CheckUse() + private async void CheckUse() { await Task.Delay(5000); while (!_killed) @@ -34,13 +34,17 @@ public void Start() { Log.Raw($"LOW MEMORY. USING {mem}MB / {ConfigManager.SecretAdminConfig.MaxDefaultMemory}"); await Task.Delay(2500); - if(ConfigManager.SecretAdminConfig.RestartWithLowMemory) + + if (ConfigManager.SecretAdminConfig.RestartWithLowMemory) + { SecretAdmin.Program.Server.ForceRestart(); + return; + } } await Task.Delay(5000); } - }*/ + } public long GetMemory() { diff --git a/SecretAdmin/Features/Server/SocketServer.cs b/SecretAdmin/Features/Server/SocketServer.cs index f3d9333..31ea783 100644 --- a/SecretAdmin/Features/Server/SocketServer.cs +++ b/SecretAdmin/Features/Server/SocketServer.cs @@ -82,7 +82,7 @@ public async void ListenRequests() public void Dispose() { - _crashHandler.Dispose(); + _crashHandler?.Dispose(); _client?.Close(); _listener?.Stop(); } diff --git a/SecretAdmin/Features/Server/Utils.cs b/SecretAdmin/Features/Server/Utils.cs index c0328ff..d82f0ac 100644 --- a/SecretAdmin/Features/Server/Utils.cs +++ b/SecretAdmin/Features/Server/Utils.cs @@ -61,9 +61,7 @@ public static void ArchiveControlLogs() } var zipName = Path.Combine(Paths.ProgramLogsFolder, $"{DateTime.Now:MM-dd-yyyy}-archive.zip"); - - Log.Raw(filesToArchive.Count); - + if(!File.Exists(zipName)) File.WriteAllText(zipName, "");