From 68336df8686a1061c98493709a9dff87f142f5a4 Mon Sep 17 00:00:00 2001 From: That-One-Nerd Date: Mon, 10 Apr 2023 13:27:55 -0400 Subject: [PATCH 1/9] Made some basic start to the config stuff. More will come later. --- SrcMod/Shell/GlobalUsings.cs | 4 ++- SrcMod/Shell/ObjectModels/ShellConfig.cs | 46 ++++++++++++++++++++++++ SrcMod/Shell/Shell.cs | 13 ++++--- SrcMod/Shell/Shell.csproj | 2 ++ SrcMod/Shell/Tools.cs | 14 ++++++-- 5 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 SrcMod/Shell/ObjectModels/ShellConfig.cs diff --git a/SrcMod/Shell/GlobalUsings.cs b/SrcMod/Shell/GlobalUsings.cs index a26ef43..8ae847e 100644 --- a/SrcMod/Shell/GlobalUsings.cs +++ b/SrcMod/Shell/GlobalUsings.cs @@ -1,12 +1,14 @@ global using Nerd_STF.Mathematics; +global using Newtonsoft.Json; global using SharpCompress.Archives.Rar; global using SharpCompress.Archives.SevenZip; global using SharpCompress.Readers; -global using SrcMod.Shell; global using SrcMod.Shell.Interop; global using SrcMod.Shell.Modules.ObjectModels; +global using SrcMod.Shell.ObjectModels; global using System; global using System.Collections.Generic; +global using System.ComponentModel; global using System.Diagnostics; global using System.Formats.Tar; global using System.IO; diff --git a/SrcMod/Shell/ObjectModels/ShellConfig.cs b/SrcMod/Shell/ObjectModels/ShellConfig.cs new file mode 100644 index 0000000..d347d11 --- /dev/null +++ b/SrcMod/Shell/ObjectModels/ShellConfig.cs @@ -0,0 +1,46 @@ +namespace SrcMod.Shell.ObjectModels; + +public class ShellConfig +{ + public const string FilePath = "config.json"; + + public static ShellConfig Defaults => new() + { + SteamDirectories = new[] + { + "Temp" + } + }; + public static ShellConfig LoadedConfig => p_data ?? Defaults; + + private static ShellConfig? p_data; + + public string[] SteamDirectories; + + public static void LoadConfig(string basePath) + { + string fullPath = Path.Combine(basePath, FilePath); + + if (!File.Exists(fullPath)) + { + p_data = null; + return; + } + StreamReader reader = new(fullPath); + JsonTextReader jsonReader = new(reader); + p_data = Serializer.Deserialize(jsonReader); + jsonReader.Close(); + reader.Close(); + } + + public static void SaveConfig(string basePath) + { + string fullPath = Path.Combine(basePath, FilePath); + + StreamWriter writer = new(fullPath); + JsonTextWriter jsonWriter = new(writer); + Serializer.Serialize(jsonWriter, p_data); + jsonWriter.Close(); + writer.Close(); + } +} diff --git a/SrcMod/Shell/Shell.cs b/SrcMod/Shell/Shell.cs index 3a90b88..634ab0a 100644 --- a/SrcMod/Shell/Shell.cs +++ b/SrcMod/Shell/Shell.cs @@ -1,12 +1,10 @@ -using System.ComponentModel; - -namespace SrcMod.Shell; +namespace SrcMod.Shell; public class Shell { public const string Author = "That_One_Nerd"; public const string Name = "SrcMod"; - public const string Version = "Alpha 0.3.2"; + public const string Version = "Alpha 0.3.3"; public readonly string? ShellDirectory; @@ -50,6 +48,10 @@ public class Shell WorkingDirectory = Directory.GetCurrentDirectory(); + // Load config. + if (ShellDirectory is null) Write("[WARNING] Could not load config from shell location. Defaults will be used."); + else ShellConfig.LoadConfig(ShellDirectory); + // Load modules and commands. List possibleAsms = new() { @@ -250,6 +252,9 @@ public class Shell activeCommand.Dispose(); activeCommand = null; } + + if (ShellDirectory is null) Write("[WARNING] Could not save config to shell location. Any changes will be ignored."); + else ShellConfig.SaveConfig(ShellDirectory); return; } } diff --git a/SrcMod/Shell/Shell.csproj b/SrcMod/Shell/Shell.csproj index d662f45..253835f 100644 --- a/SrcMod/Shell/Shell.csproj +++ b/SrcMod/Shell/Shell.csproj @@ -13,6 +13,7 @@ false Logo.ico true + true @@ -31,6 +32,7 @@ + diff --git a/SrcMod/Shell/Tools.cs b/SrcMod/Shell/Tools.cs index 3fea015..9de1e0f 100644 --- a/SrcMod/Shell/Tools.cs +++ b/SrcMod/Shell/Tools.cs @@ -1,9 +1,9 @@ -using System.Text; - -namespace SrcMod.Shell; +namespace SrcMod.Shell; public static class Tools { + public static JsonSerializer Serializer { get; private set; } + private static int loadingPosition = -1; private static int lastLoadingBufferSize = 0; private static int lastLoadingValue = -1; @@ -12,6 +12,14 @@ public static class Tools public static bool LoadingBarEnabled { get; private set; } + static Tools() + { + Serializer = JsonSerializer.Create(new() + { + Formatting = Formatting.Indented + }); + } + public static void DisplayWithPages(IEnumerable lines, ConsoleColor? color = null) { int written = 0; From b2bc9fa7eee90d08ad5db5f1d4c3439a13ad01de Mon Sep 17 00:00:00 2001 From: That-One-Nerd Date: Mon, 10 Apr 2023 18:46:40 -0400 Subject: [PATCH 2/9] New config system. Tracks changes instead of the whole thing. --- SrcMod/Shell/ObjectModels/Config.cs | 76 ++++++++++++++++++++++ SrcMod/Shell/ObjectModels/ConfigChanges.cs | 8 +++ SrcMod/Shell/ObjectModels/ShellConfig.cs | 46 ------------- SrcMod/Shell/Shell.cs | 4 +- 4 files changed, 86 insertions(+), 48 deletions(-) create mode 100644 SrcMod/Shell/ObjectModels/Config.cs create mode 100644 SrcMod/Shell/ObjectModels/ConfigChanges.cs delete mode 100644 SrcMod/Shell/ObjectModels/ShellConfig.cs diff --git a/SrcMod/Shell/ObjectModels/Config.cs b/SrcMod/Shell/ObjectModels/Config.cs new file mode 100644 index 0000000..87b5ed8 --- /dev/null +++ b/SrcMod/Shell/ObjectModels/Config.cs @@ -0,0 +1,76 @@ +namespace SrcMod.Shell.ObjectModels; + +public struct Config +{ + public const string FilePath = "config.json"; + + public static readonly Config Defaults; + + public static Config LoadedConfig + { + get => p_applied; + set + { + p_applied = value; + p_changes = p_applied.GetChanges(Defaults); + } + } + + private static Config p_applied; + private static ConfigChanges? p_changes; + + static Config() + { + Defaults = new(); + } + + public string[] SteamDirectories; + + public Config ApplyChanges(ConfigChanges changes) => this with + { + SteamDirectories = changes.SteamDirectories ?? SteamDirectories + }; + public ConfigChanges GetChanges(Config? baseConfig = null) + { + Config reference = baseConfig ?? Defaults; + return new() + { + SteamDirectories = reference.SteamDirectories == SteamDirectories ? null : SteamDirectories + }; + } + + public static void LoadConfig(string basePath) + { + string fullPath = Path.Combine(basePath, FilePath); + + if (!File.Exists(fullPath)) + { + p_applied = Defaults; + p_changes = null; + return; + } + StreamReader reader = new(fullPath); + JsonTextReader jsonReader = new(reader); + p_changes = Serializer.Deserialize(jsonReader); + jsonReader.Close(); + reader.Close(); + + p_applied = p_changes is null ? Defaults : Defaults.ApplyChanges(p_changes.Value); + } + public static void SaveConfig(string basePath) + { + string fullPath = Path.Combine(basePath, FilePath); + + if (p_changes is null || !p_changes.Value.HasChange) + { + if (File.Exists(fullPath)) File.Delete(fullPath); + return; + } + + StreamWriter writer = new(fullPath); + JsonTextWriter jsonWriter = new(writer); + Serializer.Serialize(jsonWriter, p_changes); + jsonWriter.Close(); + writer.Close(); + } +} diff --git a/SrcMod/Shell/ObjectModels/ConfigChanges.cs b/SrcMod/Shell/ObjectModels/ConfigChanges.cs new file mode 100644 index 0000000..909e662 --- /dev/null +++ b/SrcMod/Shell/ObjectModels/ConfigChanges.cs @@ -0,0 +1,8 @@ +namespace SrcMod.Shell.ObjectModels; + +public record struct ConfigChanges +{ + public bool HasChange => SteamDirectories is not null; + + public string[]? SteamDirectories; +} diff --git a/SrcMod/Shell/ObjectModels/ShellConfig.cs b/SrcMod/Shell/ObjectModels/ShellConfig.cs deleted file mode 100644 index d347d11..0000000 --- a/SrcMod/Shell/ObjectModels/ShellConfig.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace SrcMod.Shell.ObjectModels; - -public class ShellConfig -{ - public const string FilePath = "config.json"; - - public static ShellConfig Defaults => new() - { - SteamDirectories = new[] - { - "Temp" - } - }; - public static ShellConfig LoadedConfig => p_data ?? Defaults; - - private static ShellConfig? p_data; - - public string[] SteamDirectories; - - public static void LoadConfig(string basePath) - { - string fullPath = Path.Combine(basePath, FilePath); - - if (!File.Exists(fullPath)) - { - p_data = null; - return; - } - StreamReader reader = new(fullPath); - JsonTextReader jsonReader = new(reader); - p_data = Serializer.Deserialize(jsonReader); - jsonReader.Close(); - reader.Close(); - } - - public static void SaveConfig(string basePath) - { - string fullPath = Path.Combine(basePath, FilePath); - - StreamWriter writer = new(fullPath); - JsonTextWriter jsonWriter = new(writer); - Serializer.Serialize(jsonWriter, p_data); - jsonWriter.Close(); - writer.Close(); - } -} diff --git a/SrcMod/Shell/Shell.cs b/SrcMod/Shell/Shell.cs index 634ab0a..78acb5a 100644 --- a/SrcMod/Shell/Shell.cs +++ b/SrcMod/Shell/Shell.cs @@ -50,7 +50,7 @@ public class Shell // Load config. if (ShellDirectory is null) Write("[WARNING] Could not load config from shell location. Defaults will be used."); - else ShellConfig.LoadConfig(ShellDirectory); + else Config.LoadConfig(ShellDirectory); // Load modules and commands. List possibleAsms = new() @@ -254,7 +254,7 @@ public class Shell } if (ShellDirectory is null) Write("[WARNING] Could not save config to shell location. Any changes will be ignored."); - else ShellConfig.SaveConfig(ShellDirectory); + else Config.SaveConfig(ShellDirectory); return; } } From 0c07c9cfe59858cbc0696a14b72fdaff058f80be Mon Sep 17 00:00:00 2001 From: That-One-Nerd Date: Mon, 10 Apr 2023 19:23:46 -0400 Subject: [PATCH 3/9] Some tiny stuff. More tomorrow --- SrcMod/Shell/Modules/ConfigModule.cs | 11 ++++++++ SrcMod/Shell/ObjectModels/AskMode.cs | 8 ++++++ SrcMod/Shell/ObjectModels/Config.cs | 9 ++++--- SrcMod/Shell/ObjectModels/ConfigChanges.cs | 6 +++-- SrcMod/Shell/Tools.cs | 31 ++++++++++++++++++++-- 5 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 SrcMod/Shell/Modules/ConfigModule.cs create mode 100644 SrcMod/Shell/ObjectModels/AskMode.cs diff --git a/SrcMod/Shell/Modules/ConfigModule.cs b/SrcMod/Shell/Modules/ConfigModule.cs new file mode 100644 index 0000000..4399b6e --- /dev/null +++ b/SrcMod/Shell/Modules/ConfigModule.cs @@ -0,0 +1,11 @@ +namespace SrcMod.Shell.Modules; + +[Module("config")] +public static class ConfigModule +{ + [Command("display")] + public static void DisplayConfig() + { + // TODO + } +} diff --git a/SrcMod/Shell/ObjectModels/AskMode.cs b/SrcMod/Shell/ObjectModels/AskMode.cs new file mode 100644 index 0000000..e425960 --- /dev/null +++ b/SrcMod/Shell/ObjectModels/AskMode.cs @@ -0,0 +1,8 @@ +namespace SrcMod.Shell.ObjectModels; + +public enum AskMode : sbyte +{ + Never = -1, + Ask = 0, + Always = 1 +} diff --git a/SrcMod/Shell/ObjectModels/Config.cs b/SrcMod/Shell/ObjectModels/Config.cs index 87b5ed8..5a8ad60 100644 --- a/SrcMod/Shell/ObjectModels/Config.cs +++ b/SrcMod/Shell/ObjectModels/Config.cs @@ -24,18 +24,21 @@ public struct Config Defaults = new(); } - public string[] SteamDirectories; + public string[] GameDirectories; + public AskMode RunUnsafeCommands; public Config ApplyChanges(ConfigChanges changes) => this with { - SteamDirectories = changes.SteamDirectories ?? SteamDirectories + GameDirectories = changes.GameDirectories ?? GameDirectories, + RunUnsafeCommands = changes.RunUnsafeCommands ?? RunUnsafeCommands }; public ConfigChanges GetChanges(Config? baseConfig = null) { Config reference = baseConfig ?? Defaults; return new() { - SteamDirectories = reference.SteamDirectories == SteamDirectories ? null : SteamDirectories + GameDirectories = reference.GameDirectories == GameDirectories ? null : GameDirectories, + RunUnsafeCommands = reference.RunUnsafeCommands == RunUnsafeCommands ? null : RunUnsafeCommands }; } diff --git a/SrcMod/Shell/ObjectModels/ConfigChanges.cs b/SrcMod/Shell/ObjectModels/ConfigChanges.cs index 909e662..8328796 100644 --- a/SrcMod/Shell/ObjectModels/ConfigChanges.cs +++ b/SrcMod/Shell/ObjectModels/ConfigChanges.cs @@ -2,7 +2,9 @@ public record struct ConfigChanges { - public bool HasChange => SteamDirectories is not null; + [JsonIgnore] + public bool HasChange => GameDirectories is not null || RunUnsafeCommands is not null; - public string[]? SteamDirectories; + public string[]? GameDirectories; + public AskMode? RunUnsafeCommands; } diff --git a/SrcMod/Shell/Tools.cs b/SrcMod/Shell/Tools.cs index 9de1e0f..8772ef8 100644 --- a/SrcMod/Shell/Tools.cs +++ b/SrcMod/Shell/Tools.cs @@ -1,4 +1,6 @@ -namespace SrcMod.Shell; +using System.Numerics; + +namespace SrcMod.Shell; public static class Tools { @@ -16,7 +18,8 @@ public static class Tools { Serializer = JsonSerializer.Create(new() { - Formatting = Formatting.Indented + Formatting = Formatting.Indented, + NullValueHandling = NullValueHandling.Ignore }); } @@ -165,6 +168,30 @@ public static class Tools } } + public static void WriteAutoColor(object? message, bool newLine = true) + { + ConsoleColor? col = null; + if (message is null) col = ConsoleColor.DarkGray; + else if (message is bool typeBool) + { + if (typeBool) col = ConsoleColor.Green; + else col = ConsoleColor.Red; + } + else if (message is sbyte || message is byte || message is short || message is ushort || + message is int || message is uint || message is long || message is ulong || + message is float || message is double || message is decimal) col = ConsoleColor.DarkGreen; + else if (message is char) col = ConsoleColor.DarkYellow; + else if (message is AskMode typeAskMode) col = typeAskMode switch + { + AskMode.Never => ConsoleColor.Red, + AskMode.Ask => ConsoleColor.DarkGray, + AskMode.Always => ConsoleColor.Green, + _ => null + }; + + Write(message, col, newLine); + } + public static bool ValidateUnsafe() { Write("You are about to execute an unsafe command.\nProceed? > ", ConsoleColor.DarkYellow, false); From 3742b4a230f68918d706dba06bfc3578f4e5eb7d Mon Sep 17 00:00:00 2001 From: That_One_Nerd Date: Mon, 17 Apr 2023 17:58:28 -0400 Subject: [PATCH 4/9] Some config display changes. WIP --- SrcMod/Shell/Modules/ConfigModule.cs | 63 +++++++++++++++++++++++++++- SrcMod/Shell/ObjectModels/Config.cs | 19 +++++++-- SrcMod/Shell/Tools.cs | 24 ----------- 3 files changed, 76 insertions(+), 30 deletions(-) diff --git a/SrcMod/Shell/Modules/ConfigModule.cs b/SrcMod/Shell/Modules/ConfigModule.cs index 4399b6e..426fb77 100644 --- a/SrcMod/Shell/Modules/ConfigModule.cs +++ b/SrcMod/Shell/Modules/ConfigModule.cs @@ -4,8 +4,67 @@ public static class ConfigModule { [Command("display")] - public static void DisplayConfig() + public static void DisplayConfig(ConfigDisplayMode mode = ConfigDisplayMode.Color) { - // TODO + switch (mode) + { + case ConfigDisplayMode.Raw: + DisplayConfigRaw(); + break; + + case ConfigDisplayMode.Color: + DisplayConfigColor(); + break; + } + } + + private static void DisplayConfigColor() + { + Config config = Config.LoadedConfig; + List dirs = config.GameDirectories is null ? new() : new(config.GameDirectories); + dirs.Add("config"); + config.GameDirectories = dirs.ToArray(); + Config.LoadedConfig = config; + + Write("Steam Game Directories: ", null, false); + if (config.GameDirectories is null || config.GameDirectories.Length <= 0) Write("None", ConsoleColor.DarkGray); + else + { + Write("[", ConsoleColor.DarkGray); + for (int i = 0; i < config.GameDirectories.Length; i++) + { + Write(" \"", ConsoleColor.DarkGray, false); + Write(config.GameDirectories[i], ConsoleColor.White, false); + if (i < config.GameDirectories.Length - 1) Write("\",", ConsoleColor.DarkGray); + else Write("\"", ConsoleColor.DarkGray); + } + Write("]", ConsoleColor.DarkGray); + } + } + private static void DisplayConfigRaw() + { + MemoryStream ms = new(); + StreamWriter writer = new(ms, leaveOpen: true); + JsonTextWriter jsonWriter = new(writer); + + Serializer.Serialize(jsonWriter, Config.LoadedConfig); + + jsonWriter.Close(); + writer.Close(); + ms.Position = 0; + + StreamReader reader = new(ms); + string msg = reader.ReadToEnd(); + + Write(msg); + + reader.Close(); + ms.Close(); + } + + public enum ConfigDisplayMode + { + Raw, + Color } } diff --git a/SrcMod/Shell/ObjectModels/Config.cs b/SrcMod/Shell/ObjectModels/Config.cs index 5a8ad60..e76ce48 100644 --- a/SrcMod/Shell/ObjectModels/Config.cs +++ b/SrcMod/Shell/ObjectModels/Config.cs @@ -21,7 +21,15 @@ public struct Config static Config() { - Defaults = new(); + Defaults = new() + { + GameDirectories = new[] + { + "testing 1", + "testing 2" + }, + RunUnsafeCommands = AskMode.Ask + }; } public string[] GameDirectories; @@ -29,17 +37,20 @@ public struct Config public Config ApplyChanges(ConfigChanges changes) => this with { - GameDirectories = changes.GameDirectories ?? GameDirectories, + GameDirectories = GameDirectories.Union(changes.GameDirectories ?? Array.Empty()).ToArray(), RunUnsafeCommands = changes.RunUnsafeCommands ?? RunUnsafeCommands }; public ConfigChanges GetChanges(Config? baseConfig = null) { Config reference = baseConfig ?? Defaults; - return new() + ConfigChanges changes = new() { - GameDirectories = reference.GameDirectories == GameDirectories ? null : GameDirectories, + GameDirectories = reference.GameDirectories == GameDirectories ? null : + GameDirectories.Where(x => !reference.GameDirectories.Contains(x)).ToArray(), RunUnsafeCommands = reference.RunUnsafeCommands == RunUnsafeCommands ? null : RunUnsafeCommands }; + + return changes; } public static void LoadConfig(string basePath) diff --git a/SrcMod/Shell/Tools.cs b/SrcMod/Shell/Tools.cs index 8772ef8..713ffea 100644 --- a/SrcMod/Shell/Tools.cs +++ b/SrcMod/Shell/Tools.cs @@ -168,30 +168,6 @@ public static class Tools } } - public static void WriteAutoColor(object? message, bool newLine = true) - { - ConsoleColor? col = null; - if (message is null) col = ConsoleColor.DarkGray; - else if (message is bool typeBool) - { - if (typeBool) col = ConsoleColor.Green; - else col = ConsoleColor.Red; - } - else if (message is sbyte || message is byte || message is short || message is ushort || - message is int || message is uint || message is long || message is ulong || - message is float || message is double || message is decimal) col = ConsoleColor.DarkGreen; - else if (message is char) col = ConsoleColor.DarkYellow; - else if (message is AskMode typeAskMode) col = typeAskMode switch - { - AskMode.Never => ConsoleColor.Red, - AskMode.Ask => ConsoleColor.DarkGray, - AskMode.Always => ConsoleColor.Green, - _ => null - }; - - Write(message, col, newLine); - } - public static bool ValidateUnsafe() { Write("You are about to execute an unsafe command.\nProceed? > ", ConsoleColor.DarkYellow, false); From 4d342ae9585d89e92ed1e6752e972bd4f6210ed3 Mon Sep 17 00:00:00 2001 From: That_One_Nerd Date: Mon, 17 Apr 2023 19:11:33 -0400 Subject: [PATCH 5/9] Added some config stuff. Next is modifying the config. --- SrcMod/Shell/Modules/ConfigModule.cs | 15 ++++++++--- SrcMod/Shell/Tools.cs | 37 ++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/SrcMod/Shell/Modules/ConfigModule.cs b/SrcMod/Shell/Modules/ConfigModule.cs index 426fb77..392d4cb 100644 --- a/SrcMod/Shell/Modules/ConfigModule.cs +++ b/SrcMod/Shell/Modules/ConfigModule.cs @@ -21,10 +21,6 @@ public static class ConfigModule private static void DisplayConfigColor() { Config config = Config.LoadedConfig; - List dirs = config.GameDirectories is null ? new() : new(config.GameDirectories); - dirs.Add("config"); - config.GameDirectories = dirs.ToArray(); - Config.LoadedConfig = config; Write("Steam Game Directories: ", null, false); if (config.GameDirectories is null || config.GameDirectories.Length <= 0) Write("None", ConsoleColor.DarkGray); @@ -40,9 +36,20 @@ public static class ConfigModule } Write("]", ConsoleColor.DarkGray); } + + Write("Run Unsafe Commands: ", null, false); + ConsoleColor color = config.RunUnsafeCommands switch + { + AskMode.Never => ConsoleColor.Red, + AskMode.Always => ConsoleColor.Green, + AskMode.Ask or _ => ConsoleColor.DarkGray + }; + Write(config.RunUnsafeCommands, color); } private static void DisplayConfigRaw() { + // This is definitely a bit inefficient, but shouldn't be too much of an issue. + MemoryStream ms = new(); StreamWriter writer = new(ms, leaveOpen: true); JsonTextWriter jsonWriter = new(writer); diff --git a/SrcMod/Shell/Tools.cs b/SrcMod/Shell/Tools.cs index 713ffea..e9ff45b 100644 --- a/SrcMod/Shell/Tools.cs +++ b/SrcMod/Shell/Tools.cs @@ -170,15 +170,36 @@ public static class Tools public static bool ValidateUnsafe() { - Write("You are about to execute an unsafe command.\nProceed? > ", ConsoleColor.DarkYellow, false); + switch (Config.LoadedConfig.RunUnsafeCommands) + { + case AskMode.Always: + Write("[INFO] The shell has been configured to always run unsafe commands. " + + "This can be changed in the config.", ConsoleColor.DarkGray); + return true; - Console.ForegroundColor = ConsoleColor.Yellow; - Console.CursorVisible = true; - string result = Console.ReadLine()!.Trim().ToLower(); - Console.CursorVisible = false; - Console.ResetColor(); + case AskMode.Never: + Write("[ERROR] The shell has been configured to never run unsafe commands. " + + "This can be changed in the config.", ConsoleColor.Red); + return false; - return result == "y" || result == "yes" || result == "t" || - result == "true" || result == "p" || result == "proceed"; + case AskMode.Ask or _: + Write("You are about to execute an unsafe command.\nProceed? > ", ConsoleColor.DarkYellow, false); + Int2 start = (Console.CursorLeft, Console.CursorTop); + Write("\nTip: You can disable this dialog in the config.", ConsoleColor.DarkGray); + int finish = Console.CursorTop; + + Console.SetCursorPosition(start.x, start.y); + + Console.ForegroundColor = ConsoleColor.Yellow; + Console.CursorVisible = true; + string result = Console.ReadLine()!.Trim().ToLower(); + Console.CursorVisible = false; + Console.ResetColor(); + + Console.SetCursorPosition(0, finish); + + return result == "y" || result == "yes" || result == "t" || + result == "true" || result == "p" || result == "proceed"; + } } } From 8bfd8c142c3105b523bc07b3fc33baa7079f50f8 Mon Sep 17 00:00:00 2001 From: That-One-Nerd Date: Mon, 17 Apr 2023 19:38:31 -0400 Subject: [PATCH 6/9] Quick update, added some more config display options. --- SrcMod/Shell/Modules/ConfigModule.cs | 76 +++++++++++++++++----------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/SrcMod/Shell/Modules/ConfigModule.cs b/SrcMod/Shell/Modules/ConfigModule.cs index 392d4cb..a206493 100644 --- a/SrcMod/Shell/Modules/ConfigModule.cs +++ b/SrcMod/Shell/Modules/ConfigModule.cs @@ -4,7 +4,7 @@ public static class ConfigModule { [Command("display")] - public static void DisplayConfig(ConfigDisplayMode mode = ConfigDisplayMode.Color) + public static void DisplayConfig(ConfigDisplayMode mode = ConfigDisplayMode.All) { switch (mode) { @@ -12,39 +12,24 @@ public static class ConfigModule DisplayConfigRaw(); break; - case ConfigDisplayMode.Color: - DisplayConfigColor(); + case ConfigDisplayMode.All: + DisplayConfigAll(); + break; + + case ConfigDisplayMode.GameDirectories: + DisplayConfigGameDirectories(); + break; + + case ConfigDisplayMode.RunUnsafeCommands: + DisplayConfigUnsafeCommands(); break; } } - private static void DisplayConfigColor() + private static void DisplayConfigAll() { - Config config = Config.LoadedConfig; - - Write("Steam Game Directories: ", null, false); - if (config.GameDirectories is null || config.GameDirectories.Length <= 0) Write("None", ConsoleColor.DarkGray); - else - { - Write("[", ConsoleColor.DarkGray); - for (int i = 0; i < config.GameDirectories.Length; i++) - { - Write(" \"", ConsoleColor.DarkGray, false); - Write(config.GameDirectories[i], ConsoleColor.White, false); - if (i < config.GameDirectories.Length - 1) Write("\",", ConsoleColor.DarkGray); - else Write("\"", ConsoleColor.DarkGray); - } - Write("]", ConsoleColor.DarkGray); - } - - Write("Run Unsafe Commands: ", null, false); - ConsoleColor color = config.RunUnsafeCommands switch - { - AskMode.Never => ConsoleColor.Red, - AskMode.Always => ConsoleColor.Green, - AskMode.Ask or _ => ConsoleColor.DarkGray - }; - Write(config.RunUnsafeCommands, color); + DisplayConfigGameDirectories(); + DisplayConfigUnsafeCommands(); } private static void DisplayConfigRaw() { @@ -68,10 +53,41 @@ public static class ConfigModule reader.Close(); ms.Close(); } + private static void DisplayConfigGameDirectories() + { + Write("Steam Game Directories: ", null, false); + if (Config.LoadedConfig.GameDirectories is null || Config.LoadedConfig.GameDirectories.Length <= 0) + Write("None", ConsoleColor.DarkGray); + else + { + Write("[", ConsoleColor.DarkGray); + for (int i = 0; i < Config.LoadedConfig.GameDirectories.Length; i++) + { + Write(" \"", ConsoleColor.DarkGray, false); + Write(Config.LoadedConfig.GameDirectories[i], ConsoleColor.White, false); + if (i < Config.LoadedConfig.GameDirectories.Length - 1) Write("\",", ConsoleColor.DarkGray); + else Write("\"", ConsoleColor.DarkGray); + } + Write("]", ConsoleColor.DarkGray); + } + } + private static void DisplayConfigUnsafeCommands() + { + Write("Run Unsafe Commands: ", null, false); + ConsoleColor color = Config.LoadedConfig.RunUnsafeCommands switch + { + AskMode.Never => ConsoleColor.Red, + AskMode.Always => ConsoleColor.Green, + AskMode.Ask or _ => ConsoleColor.DarkGray + }; + Write(Config.LoadedConfig.RunUnsafeCommands, color); + } public enum ConfigDisplayMode { Raw, - Color + All, + GameDirectories, + RunUnsafeCommands } } From ec15e78564717d854f738d0811377359686b67cc Mon Sep 17 00:00:00 2001 From: That-One-Nerd Date: Mon, 17 Apr 2023 20:12:52 -0400 Subject: [PATCH 7/9] Added some config modifier commands. Definitely not very automated, stuff to do later. --- SrcMod/Shell/Modules/ConfigModule.cs | 101 +++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/SrcMod/Shell/Modules/ConfigModule.cs b/SrcMod/Shell/Modules/ConfigModule.cs index a206493..58e88a0 100644 --- a/SrcMod/Shell/Modules/ConfigModule.cs +++ b/SrcMod/Shell/Modules/ConfigModule.cs @@ -4,6 +4,7 @@ public static class ConfigModule { [Command("display")] + [Command("list")] public static void DisplayConfig(ConfigDisplayMode mode = ConfigDisplayMode.All) { switch (mode) @@ -26,6 +27,106 @@ public static class ConfigModule } } + [Command("add")] + [Command("append")] + public static void AppendConfigVariable(string name, string value) + { + Config config = Config.LoadedConfig; + + switch (name.Trim().ToLower()) + { + case "gamedirectories": + config.GameDirectories = config.GameDirectories.Append(value).ToArray(); + break; + + case "rununsafecommands": + throw new($"The config variable \"{name}\" is a single variable and cannot be appended to."); + + default: throw new($"Unknown config variable \"{name}\""); + } + + Config.LoadedConfig = config; + } + + [Command("delete")] + [Command("remove")] + public static void RemoveConfigVariable(string name, string value) + { + Config config = Config.LoadedConfig; + + switch (name.Trim().ToLower()) + { + case "gamedirectories": + config.GameDirectories = config.GameDirectories + .Where(x => x.Trim().ToLower() != value.Trim().ToLower()) + .ToArray(); + break; + + case "rununsafecommands": + throw new($"The config variable \"{name}\" is a single variable and cannot be appended to."); + + default: throw new($"Unknown config variable \"{name}\""); + } + + Config.LoadedConfig = config; + } + + [Command("reset")] + public static void ResetConfig(string name = "all") + { + Config config = Config.LoadedConfig; + + switch (name.Trim().ToLower()) + { + case "gamedirectories": + config.GameDirectories = Config.Defaults.GameDirectories; + break; + + case "rununsafecommands": + config.RunUnsafeCommands = Config.Defaults.RunUnsafeCommands; + break; + + case "all": + config = Config.Defaults; + break; + + default: throw new($"Unknown config variable \"{name}\""); + } + + Config.LoadedConfig = config; + } + + [Command("set")] + public static void SetConfigVariable(string name, string value) + { + Config config = Config.LoadedConfig; + + switch (name.Trim().ToLower()) + { + case "gamedirectories": + throw new($"The config variable \"{name}\" is a list and must be added or removed to."); + + case "rununsafecommands": + if (int.TryParse(value, out int intRes)) + { + AskMode mode = (AskMode)intRes; + if (!Enum.IsDefined(mode)) throw new($"(AskMode){value} is not a valid AskMode."); + config.RunUnsafeCommands = mode; + } + else if (Enum.TryParse(value, true, out AskMode modeRes)) + { + if (!Enum.IsDefined(modeRes)) throw new($"\"{value}\" is not a valid AskMode."); + config.RunUnsafeCommands = modeRes; + } + else throw new($"\"{value}\" is not a valid AskMode."); + break; + + default: throw new($"Unknown config variable \"{name}\""); + } + + Config.LoadedConfig = config; + } + private static void DisplayConfigAll() { DisplayConfigGameDirectories(); From fd4162aa32b56328806c6267bfe2408a06cfaf66 Mon Sep 17 00:00:00 2001 From: That_One_Nerd Date: Tue, 18 Apr 2023 08:52:04 -0400 Subject: [PATCH 8/9] How on earth did I miss this? --- SrcMod/Shell/Tools.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/SrcMod/Shell/Tools.cs b/SrcMod/Shell/Tools.cs index 3747dc6..cebd629 100644 --- a/SrcMod/Shell/Tools.cs +++ b/SrcMod/Shell/Tools.cs @@ -4,17 +4,8 @@ namespace SrcMod.Shell; internal static class Tools { -<<<<<<< HEAD public static JsonSerializer Serializer { get; private set; } - private static int loadingPosition = -1; - private static int lastLoadingBufferSize = 0; - private static int lastLoadingValue = -1; - private static float loadingBarValue = 0; - private static ConsoleColor loadingBarColor = Console.ForegroundColor; - - public static bool LoadingBarEnabled { get; private set; } - static Tools() { Serializer = JsonSerializer.Create(new() @@ -24,8 +15,6 @@ internal static class Tools }); } -======= ->>>>>>> origin/shell-systems public static void DisplayWithPages(IEnumerable lines, ConsoleColor? color = null) { int written = 0; From 25c6d152a2ead697d37ab913ebc072c155a72d5a Mon Sep 17 00:00:00 2001 From: That_One_Nerd Date: Tue, 18 Apr 2023 08:57:45 -0400 Subject: [PATCH 9/9] Removed some test stuff. --- SrcMod/Shell/ObjectModels/Config.cs | 6 +----- SrcMod/Shell/Tools.cs | 4 +--- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/SrcMod/Shell/ObjectModels/Config.cs b/SrcMod/Shell/ObjectModels/Config.cs index e76ce48..a14e6df 100644 --- a/SrcMod/Shell/ObjectModels/Config.cs +++ b/SrcMod/Shell/ObjectModels/Config.cs @@ -23,11 +23,7 @@ public struct Config { Defaults = new() { - GameDirectories = new[] - { - "testing 1", - "testing 2" - }, + GameDirectories = Array.Empty(), RunUnsafeCommands = AskMode.Ask }; } diff --git a/SrcMod/Shell/Tools.cs b/SrcMod/Shell/Tools.cs index cebd629..c90265d 100644 --- a/SrcMod/Shell/Tools.cs +++ b/SrcMod/Shell/Tools.cs @@ -1,6 +1,4 @@ -using System.Numerics; - -namespace SrcMod.Shell; +namespace SrcMod.Shell; internal static class Tools {