diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 58b2771..7cc60a0 100644 Binary files a/BUILDS/net6.0/PluginManager.dll and b/BUILDS/net6.0/PluginManager.dll differ diff --git a/DiscordBot/Discord/Commands/Settings.cs b/DiscordBot/Discord/Commands/Settings.cs index aaea6a5..a432c96 100644 --- a/DiscordBot/Discord/Commands/Settings.cs +++ b/DiscordBot/Discord/Commands/Settings.cs @@ -7,6 +7,7 @@ using Discord; using Discord.Commands; using Discord.WebSocket; using DiscordBot.Discord.Core; +using PluginManager; using PluginManager.Interfaces; using PluginManager.Others; using PluginManager.Others.Permissions; @@ -58,10 +59,9 @@ namespace DiscordBot.Discord.Commands var channel = message.Channel; try { - - string content = message.Content; - string[] data = content.Split(' '); - string keyword = data[1]; + string content = message.Content; + string[] data = content.Split(' '); + string keyword = data[1]; if (keyword.ToLower() == "help") { await channel.SendMessageAsync("set token [new value] -- set the value of the new token (require restart)"); @@ -78,7 +78,8 @@ namespace DiscordBot.Discord.Commands await channel.SendMessageAsync("Invalid token !"); return; } - Functions.WriteToSettings("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", data[2], '\t'); + + Config.SetValue("token", data[2]); break; case "prefix": if (data.Length != 3) @@ -86,7 +87,8 @@ namespace DiscordBot.Discord.Commands await channel.SendMessageAsync("Invalid token !"); return; } - Functions.WriteToSettings("./Data/Resources/DiscordBotCore.data", "BOT_PREFIX", data[2], '\t'); + + Config.SetValue("token", data[2]); break; default: return; @@ -94,8 +96,9 @@ namespace DiscordBot.Discord.Commands await channel.SendMessageAsync("Restart required ..."); } - catch + catch (Exception ex) { + Console.WriteLine(ex.Message); await channel.SendMessageAsync("Unknown usage to this command !\nUsage: " + Usage); } diff --git a/DiscordBot/Discord/Core/Boot.cs b/DiscordBot/Discord/Core/Boot.cs index b7a56b1..14f30c8 100644 --- a/DiscordBot/Discord/Core/Boot.cs +++ b/DiscordBot/Discord/Core/Boot.cs @@ -113,7 +113,7 @@ namespace DiscordBot.Discord.Core { while (true) { - Config.SaveDictionary(); + Config.SaveConfig(); Thread.Sleep(10000); } } diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index ad8ef96..f31fda2 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -28,18 +28,16 @@ namespace DiscordBot Directory.CreateDirectory("./Data/Languages"); Directory.CreateDirectory("./Data/Plugins/Commands"); Directory.CreateDirectory("./Data/Plugins/Events"); - if (File.Exists(Functions.dataFolder + "var.dat")) - Config.LoadDictionary(); - else if (Config.GetValue("token") == null || Config.GetValue("token")?.Length != 70) + Config.LoadConfig().Wait(); + if (!Config.ContainsKey("token") || Config.GetValue("token") == null || Config.GetValue("token")?.Length != 70) { - Dictionary d = new Dictionary(); while (true) { Console.WriteLine("Please insert your token"); Console.Write("Token = "); string token = Console.ReadLine(); if (token?.Length == 59 || token?.Length == 70) - d.Add("token", token); + Config.AddValueToVariables("token", token, true); else { Console.WriteLine("Invalid token"); @@ -53,13 +51,12 @@ namespace DiscordBot if (prefix == ' ' || char.IsDigit(prefix)) continue; - d.Add("prefix", prefix.ToString()); + Config.AddValueToVariables("prefix", prefix.ToString(), false); break; } - Config.AppendToDictionary(d); - d.Clear(); + Config.SaveConfig(); } HandleInput(args).Wait(); @@ -84,7 +81,7 @@ namespace DiscordBot if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp"); if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs"); if (listLanguagAtStartup) consoleCommandsHandler.HandleCommand("listlang"); - Config.SaveDictionary(); + Config.SaveConfig(); while (true) { Console.ForegroundColor = ConsoleColor.White; diff --git a/EVE_LevelingSystem/Level.cs b/EVE_LevelingSystem/Level.cs index e4d6376..dd8329f 100644 --- a/EVE_LevelingSystem/Level.cs +++ b/EVE_LevelingSystem/Level.cs @@ -16,8 +16,8 @@ namespace EVE_LevelingSystem public async void Start(DiscordSocketClient client) { Directory.CreateDirectory("./Data/Resources/LevelingSystem"); - Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem"); - Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt"); + Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem", true); + Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt", true); if (!File.Exists(Config.GetValue("LevelingSystemSettingsFile"))) { diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 5cbcee5..dee04ae 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -1,86 +1,76 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; using PluginManager.Others; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; namespace PluginManager { + internal class AppConfig + { + public Dictionary ApplicationVariables { get; set; } + public List ProtectedKeyWords { get; set; } + } + public static class Config { - private static readonly Dictionary ApplicationVariables = new(); - private static readonly List ConstantTokens = new() { "token" }; + private static AppConfig appConfig = null; - public static void AppendToDictionary(Dictionary dictionary) + public static bool AddValueToVariables(string key, string value, bool isReadOnly) { - foreach (var kvp in dictionary) ApplicationVariables.TryAdd(kvp.Key, kvp.Value); - } - - public static bool AddValueToVariables(string key, string value, bool constant) - { - bool req = AddValueToVariables(key, value); - if (constant) ConstantTokens.Add(key); - - return req; - } - - public static bool AddValueToVariables(string key, string value) - { - if (ApplicationVariables.ContainsKey(key)) - { - return false; - } - - ApplicationVariables.Add(key, value); + if (appConfig.ApplicationVariables.ContainsKey(key)) return false; + appConfig.ApplicationVariables.Add(key, value); + if (isReadOnly) appConfig.ProtectedKeyWords.Add(key); + SaveConfig(); return true; } public static string? GetValue(string key) { - if (!ApplicationVariables.ContainsKey(key)) - { - if (key != "token") Console.WriteLine("The key is not present in the dictionary"); - return null; - } - - return ApplicationVariables[key]; + if (!appConfig.ApplicationVariables.ContainsKey(key)) return null; + return appConfig.ApplicationVariables[key]; } public static bool SetValue(string key, string value) { - if (!ApplicationVariables.ContainsKey(key)) return false; - if (ConstantTokens.Contains(key)) return false; - ApplicationVariables[key] = value; + if (!appConfig.ApplicationVariables.ContainsKey(key)) return false; + if (appConfig.ProtectedKeyWords.Contains(key)) return false; + appConfig.ApplicationVariables[key] = value; + SaveConfig(); return true; } public static bool RemoveKey(string key) { - if (ConstantTokens.Contains(key)) return false; - - - ApplicationVariables.Remove(key); + appConfig.ApplicationVariables.Remove(key); + appConfig.ProtectedKeyWords.Remove(key); return true; } - public static async void SaveDictionary() + public static async void SaveConfig() { string path = Functions.dataFolder + "var.dat"; - await Functions.SaveToJsonFile(path, ApplicationVariables); + await Functions.SaveToJsonFile(path, appConfig); } - public static async void LoadDictionary() + public static async Task LoadConfig() { string path = Functions.dataFolder + "var.dat"; - var d = await Functions.ConvertFromJson>(path); - ApplicationVariables.Clear(); - AppendToDictionary(d); + if (File.Exists(path)) + { + appConfig = await Functions.ConvertFromJson(path); + Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords.Count} readonly variables."); + //Console.WriteLine($"Loaded {appConfig.ApplicationVariables.Count} application variables !"); + } + else + appConfig = new() { ApplicationVariables = new Dictionary(), ProtectedKeyWords = new List() }; } - public static string GetKey(string value) => ApplicationVariables.Keys.FirstOrDefault(x => ApplicationVariables[x] == value); - public static bool ContainsValue(string value) => ApplicationVariables.ContainsValue(value); - public static bool ContainsKey(string key) => ApplicationVariables.ContainsKey(key); + public static string? GetKey(string value) => appConfig.ApplicationVariables.Keys.FirstOrDefault(x => appConfig.ApplicationVariables[x] == value); + public static bool ContainsValue(string value) => appConfig.ApplicationVariables.ContainsValue(value); + public static bool ContainsKey(string key) => appConfig.ApplicationVariables.ContainsKey(key); + + public static Dictionary GetAllVariables() => new Dictionary(appConfig.ApplicationVariables); } } diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 95841b8..b6109a8 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -203,12 +203,12 @@ namespace PluginManager.Items if (args.Length < 3) return; string in1 = args[1]; if (!Config.ContainsKey(in1)) - Config.AddValueToVariables(in1, Functions.MergeStrings(args, 2)); + Config.AddValueToVariables(in1, Functions.MergeStrings(args, 2), false); else Config.SetValue(in1, Functions.MergeStrings(args, 2)); Console.WriteLine($"Updated config file with the following command: {in1} => {Config.GetValue(in1)}"); - Config.SaveDictionary(); + Config.SaveConfig(); } ); @@ -216,7 +216,20 @@ namespace PluginManager.Items { if (args.Length < 2) return; Config.RemoveKey(args[1]); - Config.SaveDictionary(); + Config.SaveConfig(); + } + ); + + AddCommand("vars", "Display all variables", () => + { + var d = Config.GetAllVariables(); + List data = new List(); + data.Add(new string[] { "-", "-" }); + data.Add(new string[] { "Key", "Value" }); + data.Add(new string[] { "-", "-" }); + foreach (var kvp in d) data.Add(new string[] { kvp.Key, kvp.Value }); + data.Add(new string[] { "-", "-" }); + Console_Utilities.FormatAndAlignTable(data); } ); @@ -224,7 +237,7 @@ namespace PluginManager.Items { await client.StopAsync(); await client.DisposeAsync(); - Config.SaveDictionary(); + Config.SaveConfig(); Environment.Exit(0); } ); diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index cf710d8..0b8ba5c 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -71,9 +71,9 @@ namespace PluginManager.Others /// The List of arrays of strings that represent the rows. public static void FormatAndAlignTable(List data) { - char tableLine = '-'; + char tableLine = '-'; char tableCross = '+'; - char tableWall = '|'; + char tableWall = '|'; int[] len = new int[data[0].Length]; foreach (var line in data) diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 5f6fb5f..0baf0c1 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -97,31 +97,6 @@ namespace PluginManager.Others File.AppendAllText(errPath, ErrMessage + " \n"); } - /// - /// Write to settings file - /// - /// The settings file path - /// The Key value of the setting - /// The new value of the settings - /// The separator between the key and the value - public static void WriteToSettings(string file, string Code, string newValue, char separator) - { - - string[] lines = File.ReadAllLines(file); - File.Delete(file); - bool ok = false; - foreach (var line in lines) - if (line.StartsWith(Code)) - { - File.AppendAllText(file, Code + separator + newValue + "\n"); - ok = true; - } - else - File.AppendAllText(file, line + "\n"); - - if (!ok) File.AppendAllText(file, Code + separator + newValue + "\n"); - } - /// /// Merge one array of strings into one string /// @@ -161,29 +136,6 @@ namespace PluginManager.Others return command.Arguments; } - - /// - /// Write setting - /// - /// The full path to the setting - /// The new Value - public static void WriteToSettingsFast(string SettingName, string NewValue) - { - - string path = dataFolder; // Resources/ - - string[] args = SettingName.Split('.'); - - int len = args.Length; - if (len < 2) return; - for (int i = 0; i < len - 2; i++) path += args[i] + "/"; - path += args[len - 2] + ".txt"; - - - WriteToSettings(path, args[len - 1].Replace('_', ' '), NewValue, '='); - - } - /// /// Copy one Stream to another /// @@ -253,6 +205,11 @@ namespace PluginManager.Others } + /// + /// Convert Bytes to highest measurement unit possible + /// + /// The amount of bytes + /// public static (double, string) ConvertBytes(long bytes) { if (bytes < 1024) return (bytes, "B"); @@ -262,12 +219,25 @@ namespace PluginManager.Others } + /// + /// Save to JSON file + /// + /// The class type + /// The file path + /// The values + /// public static async Task SaveToJsonFile(string file, T Data) { - string jsonText = JsonSerializer.Serialize(Data, typeof(T), new JsonSerializerOptions() { WriteIndented = true }); + string jsonText = JsonSerializer.Serialize(Data, typeof(T), new JsonSerializerOptions { WriteIndented = true }); await File.WriteAllTextAsync(file, jsonText); } + /// + /// Convert json text or file to some kind of data + /// + /// The data type + /// The file or json text + /// public static async Task ConvertFromJson(string input) { Stream text;