diff --git a/DiscordBot/Discord/Commands/Help.cs b/DiscordBot/Discord/Commands/Help.cs index 0944c6a..2b562f1 100644 --- a/DiscordBot/Discord/Commands/Help.cs +++ b/DiscordBot/Discord/Commands/Help.cs @@ -1,10 +1,6 @@ using System.Collections.Generic; -using System.Linq; - using Discord; using Discord.Commands; -using Discord.WebSocket; - using PluginManager; using PluginManager.Interfaces; using PluginManager.Loaders; @@ -62,16 +58,14 @@ internal class Help : DBCommand var embedBuilder = new EmbedBuilder(); - var adminCommands = ""; + var adminCommands = ""; var normalCommands = ""; foreach (var cmd in PluginLoader.Commands!) - { if (cmd.requireAdmin) adminCommands += cmd.Command + " "; else normalCommands += cmd.Command + " "; - } embedBuilder.AddField("Admin Commands", adminCommands); embedBuilder.AddField("Normal Commands", normalCommands); @@ -81,7 +75,8 @@ internal class Help : DBCommand private EmbedBuilder GenerateHelpCommand(string command) { var embedBuilder = new EmbedBuilder(); - var cmd = PluginLoader.Commands!.Find(p => p.Command == command || (p.Aliases is not null && p.Aliases.Contains(command))); + var cmd = PluginLoader.Commands!.Find(p => p.Command == command || + (p.Aliases is not null && p.Aliases.Contains(command))); if (cmd == null) return null; embedBuilder.AddField("Usage", Config.GetValue("prefix") + cmd.Usage); @@ -92,4 +87,4 @@ internal class Help : DBCommand return embedBuilder; } -} +} \ No newline at end of file diff --git a/DiscordBot/Discord/Commands/Restart.cs b/DiscordBot/Discord/Commands/Restart.cs index 3d8d1aa..939346d 100644 --- a/DiscordBot/Discord/Commands/Restart.cs +++ b/DiscordBot/Discord/Commands/Restart.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using Discord.WebSocket; using PluginManager.Interfaces; using PluginManager.Others; -using PluginManager.Others.Permissions; using DiscordLibCommands = Discord.Commands; using DiscordLib = Discord; using OperatingSystem = PluginManager.Others.OperatingSystem; @@ -42,7 +40,7 @@ internal class Restart : DBCommand public async void ExecuteServer(DiscordLibCommands.SocketCommandContext context) { var args = Functions.GetArguments(context.Message); - var OS = Functions.GetOperatingSystem(); + var OS = Functions.GetOperatingSystem(); if (args.Count == 0) { switch (OS) @@ -99,4 +97,4 @@ internal class Restart : DBCommand break; } } -} +} \ No newline at end of file diff --git a/DiscordBot/Discord/Commands/Settings.cs b/DiscordBot/Discord/Commands/Settings.cs index c034702..5cd51de 100644 --- a/DiscordBot/Discord/Commands/Settings.cs +++ b/DiscordBot/Discord/Commands/Settings.cs @@ -1,10 +1,6 @@ using System; using System.Collections.Generic; - -using Discord; using Discord.Commands; -using Discord.WebSocket; - using PluginManager; using PluginManager.Interfaces; @@ -44,12 +40,14 @@ internal class Settings : DBCommand try { var content = context.Message.Content; - var data = content.Split(' '); + var data = content.Split(' '); var keyword = data[1]; if (keyword.ToLower() == "help") { - await channel.SendMessageAsync("set token [new value] -- set the value of the new token (require restart)"); - await channel.SendMessageAsync("set prefix [new value] -- set the value of the new preifx (require restart)"); + await channel.SendMessageAsync( + "set token [new value] -- set the value of the new token (require restart)"); + await channel.SendMessageAsync( + "set prefix [new value] -- set the value of the new preifx (require restart)"); return; } @@ -86,4 +84,4 @@ internal class Settings : DBCommand await channel.SendMessageAsync("Unknown usage to this command !\nUsage: " + Usage); } } -} +} \ No newline at end of file diff --git a/DiscordBot/Discord/Core/Boot.cs b/DiscordBot/Discord/Core/Boot.cs index 32d82b0..cf34811 100644 --- a/DiscordBot/Discord/Core/Boot.cs +++ b/DiscordBot/Discord/Core/Boot.cs @@ -1,13 +1,8 @@ using System; -using System.Threading; using System.Threading.Tasks; - using Discord; using Discord.Commands; using Discord.WebSocket; - -using PluginManager; - using static PluginManager.Others.Functions; namespace DiscordBot.Discord.Core; @@ -47,7 +42,7 @@ internal class Boot public Boot(string botToken, string botPrefix) { this.botPrefix = botPrefix; - this.botToken = botToken; + this.botToken = botToken; } @@ -63,9 +58,9 @@ internal class Boot /// Task public async Task Awake() { - DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true }; + var config = new DiscordSocketConfig { AlwaysDownloadUsers = true }; - client = new DiscordSocketClient(config); + client = new DiscordSocketClient(config); service = new CommandService(); CommonTasks(); @@ -84,9 +79,9 @@ internal class Boot { if (client == null) return; client.LoggedOut += Client_LoggedOut; - client.Log += Log; - client.LoggedIn += LoggedIn; - client.Ready += Ready; + client.Log += Log; + client.LoggedIn += LoggedIn; + client.Ready += Ready; } private Task Client_LoggedOut() @@ -99,7 +94,7 @@ internal class Boot private Task Ready() { Console.Title = "ONLINE"; - isReady = true; + isReady = true; return Task.CompletedTask; } @@ -141,5 +136,4 @@ internal class Boot return Task.CompletedTask; } - -} +} \ No newline at end of file diff --git a/DiscordBot/Discord/Core/CommandHandler.cs b/DiscordBot/Discord/Core/CommandHandler.cs index 3ba47c1..99e0e08 100644 --- a/DiscordBot/Discord/Core/CommandHandler.cs +++ b/DiscordBot/Discord/Core/CommandHandler.cs @@ -1,10 +1,9 @@ -using System.Linq; +using System; +using System.Linq; using System.Reflection; using System.Threading.Tasks; - using Discord.Commands; using Discord.WebSocket; - using PluginManager.Loaders; using PluginManager.Others; using PluginManager.Others.Permissions; @@ -13,9 +12,9 @@ namespace DiscordBot.Discord.Core; internal class CommandHandler { - private readonly string botPrefix; + private readonly string botPrefix; private readonly DiscordSocketClient client; - private readonly CommandService commandService; + private readonly CommandService commandService; /// /// Command handler constructor @@ -25,9 +24,9 @@ internal class CommandHandler /// The prefix to watch for public CommandHandler(DiscordSocketClient client, CommandService commandService, string botPrefix) { - this.client = client; + this.client = client; this.commandService = commandService; - this.botPrefix = botPrefix; + this.botPrefix = botPrefix; } /// @@ -75,9 +74,15 @@ internal class CommandHandler await commandService.ExecuteAsync(context, argPos, null); - var plugin = PluginLoader.Commands!.Where(p => p.Command == message.Content.Split(' ')[0].Substring(botPrefix.Length) || (p.Aliases is not null && p.Aliases.Contains(message.Content.Split(' ')[0].Substring(botPrefix.Length)))).FirstOrDefault(); + var plugin = PluginLoader.Commands! + .Where( + p => p.Command == message.Content.Split(' ')[0].Substring(botPrefix.Length) || + (p.Aliases is not null && + p.Aliases.Contains( + message.Content.Split(' ')[0].Substring(botPrefix.Length)))) + .FirstOrDefault(); - if (plugin is null) throw new System.Exception("Failed to run command. !"); + if (plugin is null) throw new Exception("Failed to run command. !"); if (plugin.requireAdmin && !context.Message.Author.isAdmin()) return; @@ -85,11 +90,10 @@ internal class CommandHandler if (context.Channel is SocketDMChannel) plugin.ExecuteDM(context); else plugin.ExecuteServer(context); - } - catch (System.Exception ex) + catch (Exception ex) { ex.WriteErrFile(); } } -} +} \ No newline at end of file diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 6b0d43a..03b973e 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -7,7 +7,6 @@ using PluginManager.Online.Helpers; using PluginManager.Others; using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; @@ -16,6 +15,8 @@ using System.Threading.Tasks; using Terminal.Gui; +using OperatingSystem = PluginManager.Others.OperatingSystem; + namespace DiscordBot; public class Program @@ -31,11 +32,14 @@ public class Program [Obsolete] public static void Main(string[] args) { - Console.WriteLine("Loading resources ..."); PreLoadComponents().Wait(); - if (!Config.ContainsKey("ServerID") || (!Config.ContainsKey("token") || Config.GetValue("token") == null || (Config.GetValue("token")?.Length != 70 && Config.GetValue("token")?.Length != 59)) || (!Config.ContainsKey("prefix") || Config.GetValue("prefix") == null || Config.GetValue("prefix")?.Length != 1) || (args.Length > 0 && args[0] == "/newconfig")) + if (!Config.ContainsKey("ServerID") || !Config.ContainsKey("token") || + Config.GetValue("token") == null || + (Config.GetValue("token")?.Length != 70 && Config.GetValue("token")?.Length != 59) || + !Config.ContainsKey("prefix") || Config.GetValue("prefix") == null || + Config.GetValue("prefix")?.Length != 1 || (args.Length > 0 && args[0] == "/newconfig")) { Application.Init(); var top = Application.Top; @@ -49,11 +53,13 @@ public class Program top.Add(win); - var labelInfo = new Label("Configuration file not found or invalid. Please fill the following fields to create a new configuration file.") - { - X = Pos.Center(), - Y = 2 - }; + var labelInfo = + new Label( + "Configuration file not found or invalid. Please fill the following fields to create a new configuration file.") + { + X = Pos.Center(), + Y = 2 + }; var labelToken = new Label("Please insert your token here: ") @@ -84,8 +90,7 @@ public class Program var labelServerid = new Label("Please insert your server id here (optional): ") { X = 5, - Y = 11, - + Y = 11 }; var textFiledServerID = new TextField("") { @@ -106,15 +111,11 @@ public class Program Y = 16 }; - Console.CancelKeyPress += (sender, e) => - { - top.Running = false; - - }; + Console.CancelKeyPress += (sender, e) => { top.Running = false; }; button.Clicked += () => { - string passMessage = ""; + var passMessage = ""; if (textFiledToken.Text.Length != 70 && textFiledToken.Text.Length != 59) passMessage += "Invalid token, "; if (textFiledPrefix.Text.ContainsAny("0123456789/\\ ") || textFiledPrefix.Text.Length != 1) @@ -124,37 +125,39 @@ public class Program if (passMessage != "") { - MessageBox.ErrorQuery("Discord Bot Settings", "Failed to pass check. Invalid information given:\n" + passMessage, "Retry"); + MessageBox.ErrorQuery("Discord Bot Settings", + "Failed to pass check. Invalid information given:\n" + passMessage, "Retry"); return; } - Config.AddValueToVariables("ServerID", ((string)textFiledServerID.Text), true); - Config.AddValueToVariables("token", ((string)textFiledToken.Text), true); - Config.AddValueToVariables("prefix", ((string)textFiledPrefix.Text), true); + Config.AddValueToVariables("ServerID", (string)textFiledServerID.Text, true); + Config.AddValueToVariables("token", (string)textFiledToken.Text, true); + Config.AddValueToVariables("prefix", (string)textFiledPrefix.Text, true); - MessageBox.Query("Discord Bot Settings", "Successfully saved config !\nJust start the bot :D", "Start :D"); + MessageBox.Query("Discord Bot Settings", "Successfully saved config !\nJust start the bot :D", + "Start :D"); top.Running = false; - - }; button2.Clicked += async () => { - List license = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/LICENSE.txt"); - string ProductLicense = "Seth Discord Bot\n\nDeveloped by Wizzy#9181\nThis application can be used and modified by anyone. Plugin development for this application is also free and supported"; - int r = MessageBox.Query("Discord Bot Settings", ProductLicense, "Close", "Read about libraries used"); + var license = + await ServerCom.ReadTextFromURL( + "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/LICENSE.txt"); + var ProductLicense = + "Seth Discord Bot\n\nDeveloped by Wizzy#9181\nThis application can be used and modified by anyone. Plugin development for this application is also free and supported"; + var r = MessageBox.Query("Discord Bot Settings", ProductLicense, "Close", "Read about libraries used"); if (r == 1) { - int i = 0; + var i = 0; while (i < license.Count) { - string print_message = license[i++] + "\n"; + var print_message = license[i++] + "\n"; for (; i < license.Count && !license[i].StartsWith("-----------"); i++) print_message += license[i] + "\n"; if (MessageBox.Query("Licenses", print_message, "Next", "Quit") == 1) break; } - } }; @@ -174,7 +177,6 @@ public class Program /// The discord booter used to start the application private static void NoGUI(Boot discordbooter) { - #if DEBUG Console.WriteLine(); ConsoleCommandsHandler.ExecuteCommad("lp").Wait(); @@ -186,14 +188,13 @@ public class Program while (true) { - var cmd = Console.ReadLine(); if (!consoleCommandsHandler.HandleCommand(cmd! #if DEBUG - , false + , false #endif - ) && cmd.Length > 0) + ) && cmd.Length > 0) Console.WriteLine("Failed to run command " + cmd); } } @@ -207,15 +208,19 @@ public class Program Console.Clear(); Console.ForegroundColor = ConsoleColor.DarkYellow; - List startupMessageList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage"); + var startupMessageList = + await ServerCom.ReadTextFromURL( + "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage"); foreach (var message in startupMessageList) Console.WriteLine(message); - Console.WriteLine($"Running on version: {Config.GetValue("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}"); + Console.WriteLine( + $"Running on version: {Config.GetValue("Version") ?? Assembly.GetExecutingAssembly().GetName().Version.ToString()}"); Console.WriteLine($"Git URL: {Config.GetValue("GitURL") ?? " Could not find Git URL"}"); - Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n"); + Console_Utilities.WriteColorText( + "&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n"); Console.ForegroundColor = ConsoleColor.White; if (Config.ContainsKey("LaunchMessage")) @@ -224,8 +229,9 @@ public class Program Config.RemoveKey("LaunchMessage"); } - Console_Utilities.WriteColorText("Please note that the bot saves a backup save file every time you are using the shudown command (&ysd&c)"); - Console.WriteLine($"============================ LOG ============================"); + Console_Utilities.WriteColorText( + "Please note that the bot saves a backup save file every time you are using the shudown command (&ysd&c)"); + Console.WriteLine("============================ LOG ============================"); try { @@ -235,11 +241,8 @@ public class Program if (!Directory.Exists("./Data/BetaTest")) Console.WriteLine("Failed to start in debug mode because the folder ./Data/BetaTest does not exist"); else - { token = File.ReadAllText("./Data/BetaTest/token.txt"); - - //Debug mode code... - } + //Debug mode code... #endif var prefix = Config.GetValue("prefix"); @@ -284,14 +287,13 @@ public class Program if (len > 0 && args[0] == "/remplug") { - - string plugName = Functions.MergeStrings(args, 1); + var plugName = args.MergeStrings(1); Console.WriteLine("Starting to remove " + plugName); await ConsoleCommandsHandler.ExecuteCommad("remplug " + plugName); loadPluginsOnStartup = true; } - Thread mainThread = new Thread(() => + var mainThread = new Thread(() => { try { @@ -302,20 +304,19 @@ public class Program if (ex.Message == "No process is on the other end of the pipe." || (uint)ex.HResult == 0x800700E9) { if (!Config.ContainsKey("LaunchMessage")) - Config.AddValueToVariables("LaunchMessage", "An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !", false); + Config.AddValueToVariables("LaunchMessage", + "An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !", + false); Functions.WriteErrFile(ex.ToString()); } } - - - }); mainThread.Start(); } private static async Task PreLoadComponents() { - Console_Utilities.ProgressBar main = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); + var main = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); main.Start(); Directory.CreateDirectory("./Data/Resources"); Directory.CreateDirectory("./Data/Plugins/Commands"); @@ -326,7 +327,9 @@ public class Program if (Config.GetValue("DeleteLogsAtStartup")) foreach (var file in Directory.GetFiles("./Output/Logs/")) File.Delete(file); - List OnlineDefaultKeys = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys"); + var OnlineDefaultKeys = + await ServerCom.ReadTextFromURL( + "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys"); Config.PluginConfig.Load(); @@ -338,11 +341,13 @@ public class Program foreach (var key in OnlineDefaultKeys) { if (key.Length <= 3 || !key.Contains(' ')) continue; - string[] s = key.Split(' '); + var s = key.Split(' '); try { if (Config.ContainsKey(s[0])) Config.SetValue(s[0], s[1]); - else Config.GetAndAddValueToVariable(s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase)); + else + Config.GetAndAddValueToVariable( + s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase)); } catch (Exception ex) { @@ -351,66 +356,72 @@ public class Program } - - - List onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData"); + var onlineSettingsList = + await ServerCom.ReadTextFromURL( + "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData"); main.Stop("Loaded online settings. Loading updates ..."); foreach (var key in onlineSettingsList) { if (key.Length <= 3 || !key.Contains(' ')) continue; - string[] s = key.Split(' '); + var s = key.Split(' '); switch (s[0]) { case "CurrentVersion": - string newVersion = s[1]; + var newVersion = s[1]; if (!newVersion.Equals(Config.GetValue("Version"))) { - - VersionString nVer = new VersionString(newVersion.Substring(2)); - VersionString cVer = new VersionString(Config.GetValue("Version").Substring(2)); + var nVer = new VersionString(newVersion.Substring(2)); + var cVer = new VersionString(Config.GetValue("Version").Substring(2)); if (cVer > nVer) { - Config.SetValue("Version", "1." + cVer.ToShortString() + " (Beta)"); + Config.SetValue("Version", "1." + cVer.ToShortString() + " (Beta)"); break; } - if (Functions.GetOperatingSystem() == PluginManager.Others.OperatingSystem.WINDOWS) + if (Functions.GetOperatingSystem() == OperatingSystem.WINDOWS) { - - string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0.zip"; - Process.Start(".\\Updater\\Updater.exe", $"{newVersion} {url} {Process.GetCurrentProcess().ProcessName}"); - + var url = + $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0.zip"; + Process.Start(".\\Updater\\Updater.exe", + $"{newVersion} {url} {Process.GetCurrentProcess().ProcessName}"); } else { - string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0_linux.zip"; + var url = + $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0_linux.zip"; Console.WriteLine("Downloading update ..."); await ServerCom.DownloadFileNoProgressAsync(url, "./update.zip"); - await File.WriteAllTextAsync("Install.sh", "#!/bin/bash\nunzip -qq update.zip -d ./\nrm update.zip\nchmod +x SethDiscordBot\n./DiscordBot"); + await File.WriteAllTextAsync("Install.sh", + "#!/bin/bash\nunzip -qq update.zip -d ./\nrm update.zip\nchmod +x SethDiscordBot\n./DiscordBot"); Process.Start("Install.sh").WaitForExit(); Environment.Exit(0); - } } break; case "UpdaterVersion": - string updaternewversion = s[1]; - if ((Config.UpdaterVersion != updaternewversion && Functions.GetOperatingSystem() == PluginManager.Others.OperatingSystem.WINDOWS) || !Directory.Exists("./Updater") || !File.Exists("./Updater/Updater.exe")) + var updaternewversion = s[1]; + if ((Config.UpdaterVersion != updaternewversion && + Functions.GetOperatingSystem() == OperatingSystem.WINDOWS) || !Directory.Exists("./Updater") || + !File.Exists("./Updater/Updater.exe")) { Console.Clear(); Console.WriteLine("Installing updater ...\nDo NOT close the bot during update !"); - Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); + var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); bar.Start(); - await ServerCom.DownloadFileNoProgressAsync("https://github.com/Wizzy69/installer/releases/download/release-1-discordbot/Updater.zip", "./Updater.zip"); - await Functions.ExtractArchive("./Updater.zip", "./", null, UnzipProgressType.PercentageFromTotalSize); + await ServerCom.DownloadFileNoProgressAsync( + "https://github.com/Wizzy69/installer/releases/download/release-1-discordbot/Updater.zip", + "./Updater.zip"); + await Functions.ExtractArchive("./Updater.zip", "./", null, + UnzipProgressType.PercentageFromTotalSize); Config.UpdaterVersion = updaternewversion; File.Delete("Updater.zip"); await Config.SaveConfig(SaveType.NORMAL); bar.Stop("Updater has been updated !"); Console.Clear(); } + break; } } @@ -420,4 +431,4 @@ public class Program await Config.SaveConfig(SaveType.NORMAL); Console.Clear(); } -} +} \ No newline at end of file diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index eef58ea..80f7dd0 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -1,256 +1,287 @@ -using PluginManager.Others; - -using System; +using System; using System.Collections.Generic; using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; +using PluginManager.Loaders; +using PluginManager.Others; -namespace PluginManager +namespace PluginManager; + +internal class AppConfig { - internal class AppConfig + public string? UpdaterVersion { get; set; } + public Dictionary? ApplicationVariables { get; init; } + public List? ProtectedKeyWords { get; init; } + public Dictionary? PluginVersions { get; init; } +} + +public static class Config +{ + private static AppConfig? appConfig { get; set; } + + public static string UpdaterVersion { - public string? UpdaterVersion { get; set; } - public Dictionary? ApplicationVariables { get; init; } - public List? ProtectedKeyWords { get; init; } - public Dictionary? PluginVersions { get; init; } + get => appConfig.UpdaterVersion; + set => appConfig.UpdaterVersion = value; } - public static class Config + public static string GetPluginVersion(string pluginName) { - public static class PluginConfig + return appConfig!.PluginVersions![pluginName]; + } + + public static void SetPluginVersion(string pluginName, string newVersion) + { + if (appConfig!.PluginVersions!.ContainsKey(pluginName)) + appConfig.PluginVersions[pluginName] = newVersion; + else appConfig.PluginVersions.Add(pluginName, newVersion); + + // SaveConfig(); + } + + public static void RemovePluginVersion(string pluginName) + { + appConfig!.PluginVersions!.Remove(pluginName); + } + + public static bool PluginVersionsContainsKey(string pluginName) + { + return appConfig!.PluginVersions!.ContainsKey(pluginName); + } + + public static void AddValueToVariables(string key, T value, bool isProtected) + { + if (value == null) + throw new Exception("The value cannot be null"); + if (appConfig!.ApplicationVariables!.ContainsKey(key)) + throw new Exception($"The key ({key}) already exists in the variables. Value {GetValue(key)}"); + + appConfig.ApplicationVariables.Add(key, value); + if (isProtected && key != "Version") + appConfig.ProtectedKeyWords!.Add(key); + + SaveConfig(SaveType.NORMAL); + } + + public static Type GetVariableType(string value) + { + if (int.TryParse(value, out var intValue)) + return typeof(int); + if (bool.TryParse(value, out var boolValue)) + return typeof(bool); + if (float.TryParse(value, out var floatValue)) + return typeof(float); + if (double.TryParse(value, out var doubleValue)) + return typeof(double); + if (uint.TryParse(value, out var uintValue)) + return typeof(uint); + if (long.TryParse(value, out var longValue)) + return typeof(long); + if (byte.TryParse(value, out var byteValue)) + return typeof(byte); + return typeof(string); + } + + public static void GetAndAddValueToVariable(string key, string value, bool isReadOnly) + { + if (ContainsKey(key)) + return; + if (int.TryParse(value, out var intValue)) + AddValueToVariables(key, intValue, isReadOnly); + else if (bool.TryParse(value, out var boolValue)) + AddValueToVariables(key, boolValue, isReadOnly); + else if (float.TryParse(value, out var floatValue)) + AddValueToVariables(key, floatValue, isReadOnly); + else if (double.TryParse(value, out var doubleValue)) + AddValueToVariables(key, doubleValue, isReadOnly); + else if (uint.TryParse(value, out var uintValue)) + AddValueToVariables(key, uintValue, isReadOnly); + else if (long.TryParse(value, out var longValue)) + AddValueToVariables(key, longValue, isReadOnly); + else if (byte.TryParse(value, out var byteValue)) + AddValueToVariables(key, byteValue, isReadOnly); + else + AddValueToVariables(key, value, isReadOnly); + } + + public static T? GetValue(string key) + { + if (!appConfig!.ApplicationVariables!.ContainsKey(key)) return default; + try { - public static readonly List> InstalledPlugins = new(); + var element = (JsonElement)appConfig.ApplicationVariables[key]; + return element.Deserialize(); + } + catch + { + return (T)appConfig.ApplicationVariables[key]; + } + } - public static void Load() - { - new Thread(LoadCommands).Start(); - new Thread(LoadEvents).Start(); - } + public static void SetValue(string key, T value) + { + if (value == null) + throw new Exception("Value is null"); + if (!appConfig!.ApplicationVariables!.ContainsKey(key)) + throw new Exception("Key does not exist in the config file"); + if (appConfig.ProtectedKeyWords!.Contains(key)) + throw new Exception("Key is protected"); - private static void LoadCommands() - { - string cmd_path = "./Data/Plugins/Commands/"; - string[] files = Directory.GetFiles(cmd_path, $"*.{Loaders.PluginLoader.pluginCMDExtension}", SearchOption.AllDirectories); - foreach (var file in files) - if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) - { - string PluginName = new FileInfo(file).Name; - string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginCMDExtension.Length); - InstalledPlugins.Add(new(name, PluginType.Command)); - } - } + appConfig.ApplicationVariables[key] = JsonSerializer.SerializeToElement(value); + SaveConfig(SaveType.NORMAL); + } - private static void LoadEvents() - { - string eve_path = "./Data/Plugins/Events/"; - string[] files = Directory.GetFiles(eve_path, $"*.{Loaders.PluginLoader.pluginEVEExtension}", SearchOption.AllDirectories); - foreach (var file in files) - if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) - if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) - { - string PluginName = new FileInfo(file).Name; - string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginEVEExtension.Length); - InstalledPlugins.Add(new(name, PluginType.Event)); - } - } + public static void RemoveKey(string key) + { + if (key == "Version" || key == "token" || key == "prefix") + throw new Exception("Key is protected"); + appConfig!.ApplicationVariables!.Remove(key); + appConfig.ProtectedKeyWords!.Remove(key); + SaveConfig(SaveType.NORMAL); + } - public static bool Contains(string pluginName) - { - foreach (var tuple in InstalledPlugins) - if (tuple.Item1 == pluginName) - return true; + public static bool IsReadOnly(string key) + { + return appConfig.ProtectedKeyWords.Contains(key); + } - return false; - } - - public static PluginType GetPluginType(string pluginName) - { - foreach (var tuple in InstalledPlugins) - if (tuple.Item1 == pluginName) - return tuple.Item2; - - - return PluginType.Unknown; - } + public static async Task SaveConfig(SaveType type) + { + if (type == SaveType.NORMAL) + { + var path = Functions.dataFolder + "config.json"; + await Functions.SaveToJsonFile(path, appConfig!); + return; } - private static AppConfig? appConfig { get; set; } - - public static string UpdaterVersion { get => appConfig.UpdaterVersion; set => appConfig.UpdaterVersion = value; } - - public static string GetPluginVersion(string pluginName) => appConfig!.PluginVersions![pluginName]; - public static void SetPluginVersion(string pluginName, string newVersion) + if (type == SaveType.BACKUP) { - if (appConfig!.PluginVersions!.ContainsKey(pluginName)) - appConfig.PluginVersions[pluginName] = newVersion; - else appConfig.PluginVersions.Add(pluginName, newVersion); - - // SaveConfig(); + var path = Functions.dataFolder + "config.json.bak"; + await Functions.SaveToJsonFile(path, appConfig!); } + } - public static void RemovePluginVersion(string pluginName) => appConfig!.PluginVersions!.Remove(pluginName); - public static bool PluginVersionsContainsKey(string pluginName) => appConfig!.PluginVersions!.ContainsKey(pluginName); - - public static void AddValueToVariables(string key, T value, bool isProtected) + public static async Task LoadConfig() + { + var path = Functions.dataFolder + "config.json"; + if (File.Exists(path)) { - if (value == null) - throw new Exception("The value cannot be null"); - if (appConfig!.ApplicationVariables!.ContainsKey(key)) - throw new Exception($"The key ({key}) already exists in the variables. Value {GetValue(key)}"); - - appConfig.ApplicationVariables.Add(key, value); - if (isProtected && key != "Version") - appConfig.ProtectedKeyWords!.Add(key); - - SaveConfig(SaveType.NORMAL); - } - - public static Type GetVariableType(string value) - { - if (int.TryParse(value, out var intValue)) - return typeof(int); - if (bool.TryParse(value, out var boolValue)) - return typeof(bool); - if (float.TryParse(value, out var floatValue)) - return typeof(float); - if (double.TryParse(value, out var doubleValue)) - return typeof(double); - if (uint.TryParse(value, out var uintValue)) - return typeof(uint); - if (long.TryParse(value, out var longValue)) - return typeof(long); - if (byte.TryParse(value, out var byteValue)) - return typeof(byte); - return typeof(string); - } - - public static void GetAndAddValueToVariable(string key, string value, bool isReadOnly) - { - if (Config.ContainsKey(key)) - return; - if (int.TryParse(value, out var intValue)) - Config.AddValueToVariables(key, intValue, isReadOnly); - else if (bool.TryParse(value, out var boolValue)) - Config.AddValueToVariables(key, boolValue, isReadOnly); - else if (float.TryParse(value, out var floatValue)) - Config.AddValueToVariables(key, floatValue, isReadOnly); - else if (double.TryParse(value, out var doubleValue)) - Config.AddValueToVariables(key, doubleValue, isReadOnly); - else if (uint.TryParse(value, out var uintValue)) - Config.AddValueToVariables(key, uintValue, isReadOnly); - else if (long.TryParse(value, out var longValue)) - Config.AddValueToVariables(key, longValue, isReadOnly); - else if (byte.TryParse(value, out var byteValue)) - Config.AddValueToVariables(key, byteValue, isReadOnly); - else - Config.AddValueToVariables(key, value, isReadOnly); - } - - public static T? GetValue(string key) - { - if (!appConfig!.ApplicationVariables!.ContainsKey(key)) return default; try { - JsonElement element = (JsonElement)appConfig.ApplicationVariables[key]; - return element.Deserialize(); + appConfig = await Functions.ConvertFromJson(path); } - catch + catch (Exception ex) { - return (T)appConfig.ApplicationVariables[key]; + File.Delete(path); + Console.WriteLine("An error occured while loading the settings. Importing from backup file..."); + path = Functions.dataFolder + "config.json.bak"; + appConfig = await Functions.ConvertFromJson(path); + Functions.WriteErrFile(ex.Message); } + + + Functions.WriteLogFile( + $"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables."); + return; } - public static void SetValue(string key, T value) + if (File.Exists(Functions.dataFolder + "config.json.bak")) { - if (value == null) - throw new Exception("Value is null"); - if (!appConfig!.ApplicationVariables!.ContainsKey(key)) - throw new Exception("Key does not exist in the config file"); - if (appConfig.ProtectedKeyWords!.Contains(key)) - throw new Exception("Key is protected"); - - appConfig.ApplicationVariables[key] = JsonSerializer.SerializeToElement(value); - SaveConfig(SaveType.NORMAL); - } - - public static void RemoveKey(string key) - { - if (key == "Version" || key == "token" || key == "prefix") - throw new Exception("Key is protected"); - appConfig!.ApplicationVariables!.Remove(key); - appConfig.ProtectedKeyWords!.Remove(key); - SaveConfig(SaveType.NORMAL); - } - - public static bool IsReadOnly(string key) - { - return appConfig.ProtectedKeyWords.Contains(key); - } - - public static async Task SaveConfig(SaveType type) - { - if (type == SaveType.NORMAL) + try { - string path = Functions.dataFolder + "config.json"; - await Functions.SaveToJsonFile(path, appConfig!); + Console.WriteLine("An error occured while loading the settings. Importing from backup file..."); + path = Functions.dataFolder + "config.json.bak"; + appConfig = await Functions.ConvertFromJson(path); + return; } - if (type == SaveType.BACKUP) + catch (Exception ex) { - string path = Functions.dataFolder + "config.json.bak"; - await Functions.SaveToJsonFile(path, appConfig!); - return; + Console.WriteLine(ex.Message); } - } - public static async Task LoadConfig() + appConfig = new AppConfig { - string path = Functions.dataFolder + "config.json"; - if (File.Exists(path)) - { - try - { - appConfig = await Functions.ConvertFromJson(path); - } - catch (Exception ex) - { - File.Delete(path); - Console.WriteLine("An error occured while loading the settings. Importing from backup file..."); - path = Functions.dataFolder + "config.json.bak"; - appConfig = await Functions.ConvertFromJson(path); - Functions.WriteErrFile(ex.Message); - } - - - Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables."); - return; - } - else if (File.Exists(Functions.dataFolder + "config.json.bak")) - { - try - { - - - Console.WriteLine("An error occured while loading the settings. Importing from backup file..."); - path = Functions.dataFolder + "config.json.bak"; - appConfig = await Functions.ConvertFromJson(path); - - return; - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - } - appConfig = new() { ApplicationVariables = new Dictionary(), ProtectedKeyWords = new List(), PluginVersions = new Dictionary(), UpdaterVersion = "-1" }; - } - - public static bool ContainsValue(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!); - public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key); - - public static IDictionary GetAllVariables() => appConfig.ApplicationVariables; + ApplicationVariables = new Dictionary(), ProtectedKeyWords = new List(), + PluginVersions = new Dictionary(), UpdaterVersion = "-1" + }; } -} + + public static bool ContainsValue(T value) + { + return appConfig!.ApplicationVariables!.ContainsValue(value!); + } + + public static bool ContainsKey(string key) + { + return appConfig!.ApplicationVariables!.ContainsKey(key); + } + + public static IDictionary GetAllVariables() + { + return appConfig.ApplicationVariables; + } + + public static class PluginConfig + { + public static readonly List> InstalledPlugins = new(); + + public static void Load() + { + new Thread(LoadCommands).Start(); + new Thread(LoadEvents).Start(); + } + + private static void LoadCommands() + { + var cmd_path = "./Data/Plugins/Commands/"; + var files = Directory.GetFiles(cmd_path, $"*.{PluginLoader.pluginCMDExtension}", + SearchOption.AllDirectories); + foreach (var file in files) + if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) + { + var PluginName = new FileInfo(file).Name; + var name = PluginName.Substring(0, PluginName.Length - 1 - PluginLoader.pluginCMDExtension.Length); + InstalledPlugins.Add(new Tuple(name, PluginType.Command)); + } + } + + private static void LoadEvents() + { + var eve_path = "./Data/Plugins/Events/"; + var files = Directory.GetFiles(eve_path, $"*.{PluginLoader.pluginEVEExtension}", + SearchOption.AllDirectories); + foreach (var file in files) + if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) + if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) + { + var PluginName = new FileInfo(file).Name; + var name = PluginName.Substring( + 0, PluginName.Length - 1 - PluginLoader.pluginEVEExtension.Length); + InstalledPlugins.Add(new Tuple(name, PluginType.Event)); + } + } + + public static bool Contains(string pluginName) + { + foreach (var tuple in InstalledPlugins) + if (tuple.Item1 == pluginName) + return true; + + return false; + } + + public static PluginType GetPluginType(string pluginName) + { + foreach (var tuple in InstalledPlugins) + if (tuple.Item1 == pluginName) + return tuple.Item2; + + + return PluginType.Unknown; + } + } +} \ No newline at end of file diff --git a/PluginManager/Interfaces/DBCommand.cs b/PluginManager/Interfaces/DBCommand.cs index 6082113..0d41210 100644 --- a/PluginManager/Interfaces/DBCommand.cs +++ b/PluginManager/Interfaces/DBCommand.cs @@ -1,7 +1,5 @@ using System.Collections.Generic; - using Discord.Commands; -using Discord.WebSocket; namespace PluginManager.Interfaces; @@ -38,11 +36,15 @@ public interface DBCommand /// The main body of the command. This is what is executed when user calls the command in Server /// /// The disocrd Context - void ExecuteServer(SocketCommandContext context) { } + void ExecuteServer(SocketCommandContext context) + { + } /// /// The main body of the command. This is what is executed when user calls the command in DM /// /// The disocrd Context - void ExecuteDM(SocketCommandContext context) { } -} + void ExecuteDM(SocketCommandContext context) + { + } +} \ No newline at end of file diff --git a/PluginManager/Interfaces/DBEvent.cs b/PluginManager/Interfaces/DBEvent.cs index eea8f6d..0ab89ab 100644 --- a/PluginManager/Interfaces/DBEvent.cs +++ b/PluginManager/Interfaces/DBEvent.cs @@ -19,4 +19,4 @@ public interface DBEvent /// /// The discord bot client void Start(DiscordSocketClient client); -} +} \ No newline at end of file diff --git a/PluginManager/Items/Command.cs b/PluginManager/Items/Command.cs index d6b4ded..822365b 100644 --- a/PluginManager/Items/Command.cs +++ b/PluginManager/Items/Command.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Threading.Tasks; using Discord.WebSocket; using PluginManager.Others; diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index e409d5f..9ba8807 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -3,7 +3,6 @@ using PluginManager.Interfaces; using PluginManager.Loaders; using PluginManager.Online; -using PluginManager.Online.Helpers; using PluginManager.Others; using System; @@ -15,19 +14,22 @@ using System.Net.Http; using System.Reflection; using System.Threading.Tasks; +using OperatingSystem = PluginManager.Others.OperatingSystem; namespace PluginManager.Items; public class ConsoleCommandsHandler { - private static readonly PluginsManager manager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt"); + private static readonly PluginsManager manager = + new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt"); + private static readonly List commandList = new(); + + + private static bool isDownloading; + private static bool pluginsLoaded; private readonly DiscordSocketClient? client; - - private static bool isDownloading = false; - private static bool pluginsLoaded = false; - public ConsoleCommandsHandler(DiscordSocketClient client) { this.client = client; @@ -37,7 +39,6 @@ public class ConsoleCommandsHandler private void InitializeBasicCommands() { - commandList.Clear(); AddCommand("help", "Show help", "help ", args => @@ -45,7 +46,7 @@ public class ConsoleCommandsHandler if (args.Length <= 1) { Console.WriteLine("Available commands:"); - List items = new List(); + var items = new List(); items.Add(new[] { "-", "-", "-" }); items.Add(new[] { "Command", "Description", "Usage" }); items.Add(new[] { " ", " ", "Argument type: [required]" }); @@ -53,7 +54,9 @@ public class ConsoleCommandsHandler foreach (var command in commandList) { - var pa = from p in command.Action.Method.GetParameters() where p.Name != null select p.ParameterType.FullName; + var pa = from p in command.Action.Method.GetParameters() + where p.Name != null + select p.ParameterType.FullName; items.Add(new[] { command.CommandName, command.Description, command.Usage }); } @@ -81,10 +84,9 @@ public class ConsoleCommandsHandler if (pluginsLoaded) return; var loader = new PluginLoader(client!); - ConsoleColor cc = Console.ForegroundColor; + var cc = Console.ForegroundColor; loader.onCMDLoad += (name, typeName, success, exception) => { - if (name == null || name.Length < 2) name = typeName; if (success) @@ -99,6 +101,7 @@ public class ConsoleCommandsHandler Console.WriteLine("[CMD] Failed to load command : " + name + " because " + exception!.Message); } + Console.ForegroundColor = cc; }; loader.onEVELoad += (name, typeName, success, exception) => @@ -116,13 +119,13 @@ public class ConsoleCommandsHandler Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[EVENT] Failed to load event : " + name + " because " + exception!.Message); } + Console.ForegroundColor = cc; }; loader.LoadPlugins(); Console.ForegroundColor = cc; pluginsLoaded = true; - } ); @@ -130,7 +133,6 @@ public class ConsoleCommandsHandler AddCommand("dwplug", "download plugin", "dwplug [name]", async args => { - isDownloading = true; if (args.Length == 1) { @@ -152,32 +154,36 @@ public class ConsoleCommandsHandler Console_Utilities.WriteColorText("Name is invalid"); return; } + isDownloading = false; - Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" + " Use &glistplugs &ccommand to display all available plugins !"); + Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" + + " Use &glistplugs &ccommand to display all available plugins !"); return; } string path; if (info[0] == "Command" || info[0] == "Event") - path = "./Data/Plugins/" + info[0] + "s/" + name + "." + (info[0] == "Command" ? PluginLoader.pluginCMDExtension : PluginLoader.pluginEVEExtension); + path = "./Data/Plugins/" + info[0] + "s/" + name + "." + (info[0] == "Command" + ? PluginLoader.pluginCMDExtension + : PluginLoader.pluginEVEExtension); else path = $"./{info[1].Split('/')[info[1].Split('/').Length - 1]}"; - if (Others.OperatingSystem.WINDOWS == Functions.GetOperatingSystem()) + if (OperatingSystem.WINDOWS == Functions.GetOperatingSystem()) { await ServerCom.DownloadFileAsync(info[1], path); } - else if (Others.OperatingSystem.LINUX == Functions.GetOperatingSystem()) + else if (OperatingSystem.LINUX == Functions.GetOperatingSystem()) { - Others.Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); + var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); bar.Start(); await ServerCom.DownloadFileNoProgressAsync(info[1], path); bar.Stop("Plugin Downloaded !"); } if (info[0] == "Event") - Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Event)); + Config.PluginConfig.InstalledPlugins.Add(new Tuple(name, PluginType.Event)); else if (info[0] == "Command") - Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Command)); + Config.PluginConfig.InstalledPlugins.Add(new Tuple(name, PluginType.Command)); Console.WriteLine("\n"); @@ -197,25 +203,31 @@ public class ConsoleCommandsHandler var split = line.Split(','); Console.WriteLine($"\nDownloading item: {split[1]}"); if (File.Exists("./" + split[1])) File.Delete("./" + split[1]); - if (Others.OperatingSystem.WINDOWS == Functions.GetOperatingSystem()) - await ServerCom.DownloadFileAsync(split[0], "./" + split[1]); - else if (Others.OperatingSystem.LINUX == Functions.GetOperatingSystem()) + if (OperatingSystem.WINDOWS == Functions.GetOperatingSystem()) { - Others.Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); + await ServerCom.DownloadFileAsync(split[0], "./" + split[1]); + } + else if (OperatingSystem.LINUX == Functions.GetOperatingSystem()) + { + var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); bar.Start(); await ServerCom.DownloadFileNoProgressAsync(split[0], "./" + split[1]); bar.Stop("Item downloaded !"); - } + Console.WriteLine(); if (split[0].EndsWith(".pak")) + { File.Move("./" + split[1], "./Data/PAKS/" + split[1], true); + } else if (split[0].EndsWith(".zip") || split[0].EndsWith(".pkg")) { Console.WriteLine($"Extracting {split[1]} ..."); - var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);// { Max = 100f, Color = ConsoleColor.Green }; + var bar = new Console_Utilities.ProgressBar( + ProgressBarType.NO_END); // { Max = 100f, Color = ConsoleColor.Green }; bar.Start(); - await Functions.ExtractArchive("./" + split[1], "./", null, UnzipProgressType.PercentageFromTotalSize); + await Functions.ExtractArchive("./" + split[1], "./", null, + UnzipProgressType.PercentageFromTotalSize); bar.Stop("Extracted"); Console.WriteLine("\n"); File.Delete("./" + split[1]); @@ -224,15 +236,14 @@ public class ConsoleCommandsHandler Console.WriteLine(); } - VersionString? ver = await Online.ServerCom.GetVersionOfPackageFromWeb(name); + + var ver = await ServerCom.GetVersionOfPackageFromWeb(name); if (ver is null) throw new Exception("Incorrect version"); - Config.SetPluginVersion(name, $"{ver.PackageVersionID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}"); + Config.SetPluginVersion( + name, $"{ver.PackageVersionID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}"); isDownloading = false; - - } - ); @@ -280,7 +291,7 @@ public class ConsoleCommandsHandler { if (client is null) return; - Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); + var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); bar.Start(); await Config.SaveConfig(SaveType.NORMAL); @@ -292,57 +303,52 @@ public class ConsoleCommandsHandler await Task.Delay(1000); Environment.Exit(0); - } ); - AddCommand("import", "Load an external command", "import [pluginName]", async (args) => + AddCommand("import", "Load an external command", "import [pluginName]", async args => { if (args.Length <= 1) return; try { - string pName = Functions.MergeStrings(args, 1); - HttpClient client = new HttpClient(); - string url = (await manager.GetPluginLinkByName(pName))[1]; + var pName = args.MergeStrings(1); + var client = new HttpClient(); + var url = (await manager.GetPluginLinkByName(pName))[1]; if (url is null) throw new Exception($"Invalid plugin name {pName}."); - Stream s = await client.GetStreamAsync(url); - MemoryStream str = new MemoryStream(); + var s = await client.GetStreamAsync(url); + var str = new MemoryStream(); await s.CopyToAsync(str); var asmb = Assembly.Load(str.ToArray()); var types = asmb.GetTypes(); foreach (var type in types) - { if (type.IsClass && typeof(DBEvent).IsAssignableFrom(type)) { - DBEvent instance = (DBEvent)Activator.CreateInstance(type); + var instance = (DBEvent)Activator.CreateInstance(type); instance.Start(this.client); Console.WriteLine($"[EVENT] Loaded external {type.FullName}!"); } else if (type.IsClass && typeof(DBCommand).IsAssignableFrom(type)) { - DBCommand instance = (DBCommand)Activator.CreateInstance(type); + var instance = (DBCommand)Activator.CreateInstance(type); Console.WriteLine($"[CMD] Instance: {type.FullName} loaded !"); } - } } catch (Exception ex) { Console.WriteLine(ex.Message); } - }); AddCommand("remplug", "Remove a plugin", "remplug [plugName]", async args => { - if (args.Length <= 1) return; isDownloading = true; - string plugName = Functions.MergeStrings(args, 1); + var plugName = args.MergeStrings(1); if (pluginsLoaded) { - if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS) + if (Functions.GetOperatingSystem() == OperatingSystem.WINDOWS) { Process.Start("DiscordBot.exe", $"/remplug {plugName}"); await Task.Delay(100); @@ -354,16 +360,18 @@ public class ConsoleCommandsHandler await Task.Delay(100); Environment.Exit(0); } + isDownloading = false; return; } - string location = "./Data/Plugins/"; + var location = "./Data/Plugins/"; location = Config.PluginConfig.GetPluginType(plugName) switch { - PluginType.Command => location + "Commands/" + plugName + "." + PluginLoader.pluginCMDExtension, + PluginType.Command => location + "Commands/" + plugName + "." + + PluginLoader.pluginCMDExtension, PluginType.Event => location + "Events/" + plugName + "." + PluginLoader.pluginEVEExtension, PluginType.Unknown => "./", _ => throw new NotImplementedException("Plugin type incorrect") @@ -379,11 +387,12 @@ public class ConsoleCommandsHandler if (Config.PluginConfig.Contains(plugName)) { var tuple = Config.PluginConfig.InstalledPlugins.Where(t => t.Item1 == plugName).FirstOrDefault(); - Console.WriteLine("Found: " + tuple.ToString()); + Console.WriteLine("Found: " + tuple); Config.PluginConfig.InstalledPlugins.Remove(tuple); Config.RemovePluginVersion(plugName); await Config.SaveConfig(SaveType.NORMAL); } + Console.WriteLine("Removed the plugin DLL. Checking for other files ..."); var info = await manager.GetPluginLinkByName(plugName); @@ -406,33 +415,35 @@ public class ConsoleCommandsHandler if (Directory.Exists(plugName)) Directory.Delete(plugName, true); } + isDownloading = false; Console.WriteLine(plugName + " has been successfully deleted !"); - }); AddCommand("reload", "Reload the bot with all plugins", () => { - if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS) + if (Functions.GetOperatingSystem() == OperatingSystem.WINDOWS) { - Process.Start("DiscordBot.exe", $"lp"); + Process.Start("DiscordBot.exe", "lp"); HandleCommand("sd"); } else { - - Process.Start("./DiscordBot", $"lp"); + Process.Start("./DiscordBot", "lp"); HandleCommand("sd"); } }); + //AddCommand(""); + //Sort the commands by name commandList.Sort((x, y) => x.CommandName.CompareTo(y.CommandName)); } public static void AddCommand(string command, string description, string usage, Action action) { - commandList.Add(new ConsoleCommand { CommandName = command, Description = description, Action = action, Usage = usage }); + commandList.Add(new ConsoleCommand + { CommandName = command, Description = description, Action = action, Usage = usage }); Console.ForegroundColor = ConsoleColor.White; Console_Utilities.WriteColorText($"Command &r{command} &cadded to the list of commands"); } @@ -468,7 +479,6 @@ public class ConsoleCommandsHandler Console.WriteLine(); while (isDownloading) await Task.Delay(1000); - } } @@ -482,7 +492,7 @@ public class ConsoleCommandsHandler if (removeCommandExecution) { Console.SetCursorPosition(0, Console.CursorTop - 1); - for (int i = 0; i < command.Length + 30; i++) + for (var i = 0; i < command.Length + 30; i++) Console.Write(" "); Console.SetCursorPosition(0, Console.CursorTop); } @@ -496,4 +506,4 @@ public class ConsoleCommandsHandler return false; //Console.WriteLine($"Executing: {args[0]} with the following parameters: {args.MergeStrings(1)}"); } -} +} \ No newline at end of file diff --git a/PluginManager/Loaders/Loader.cs b/PluginManager/Loaders/Loader.cs index d5e10da..e14f606 100644 --- a/PluginManager/Loaders/Loader.cs +++ b/PluginManager/Loaders/Loader.cs @@ -3,39 +3,31 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; -using System.Threading.Tasks; - -using PluginManager.Online.Updates; using PluginManager.Others; namespace PluginManager.Loaders; internal class LoaderArgs : EventArgs { - internal string? PluginName { get; init; } - internal string? TypeName { get; init; } - internal bool IsLoaded { get; init; } - internal Exception? Exception { get; init; } - internal object? Plugin { get; init; } + internal string? PluginName { get; init; } + internal string? TypeName { get; init; } + internal bool IsLoaded { get; init; } + internal Exception? Exception { get; init; } + internal object? Plugin { get; init; } } internal class Loader { internal Loader(string path, string extension) { - this.path = path; + this.path = path; this.extension = extension; } - private string path { get; } + private string path { get; } private string extension { get; } - - internal delegate void FileLoadedEventHandler(LoaderArgs args); - - internal delegate void PluginLoadedEventHandler(LoaderArgs args); - internal event FileLoadedEventHandler? FileLoaded; internal event PluginLoadedEventHandler? PluginLoaded; @@ -52,17 +44,16 @@ internal class Loader var files = Directory.GetFiles(path, $"*.{extension}", SearchOption.AllDirectories); foreach (var file in files) { - Assembly.LoadFrom(file); if (FileLoaded != null) { var args = new LoaderArgs { - Exception = null, - TypeName = nameof(T), - IsLoaded = false, + Exception = null, + TypeName = nameof(T), + IsLoaded = false, PluginName = new FileInfo(file).Name.Split('.')[0], - Plugin = null + Plugin = null }; FileLoaded.Invoke(args); } @@ -87,18 +78,22 @@ internal class Loader if (PluginLoaded != null) PluginLoaded.Invoke(new LoaderArgs - { - Exception = null, - IsLoaded = true, - PluginName = type.FullName, - TypeName = nameof(T), - Plugin = plugin - } + { + Exception = null, + IsLoaded = true, + PluginName = type.FullName, + TypeName = nameof(T), + Plugin = plugin + } ); } catch (Exception ex) { - if (PluginLoaded != null) PluginLoaded.Invoke(new LoaderArgs { Exception = ex, IsLoaded = false, PluginName = type.FullName, TypeName = nameof(T) }); + if (PluginLoaded != null) + PluginLoaded.Invoke(new LoaderArgs + { + Exception = ex, IsLoaded = false, PluginName = type.FullName, TypeName = nameof(T) + }); } } catch (Exception ex) @@ -109,4 +104,9 @@ internal class Loader return list; } -} + + + internal delegate void FileLoadedEventHandler(LoaderArgs args); + + internal delegate void PluginLoadedEventHandler(LoaderArgs args); +} \ No newline at end of file diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index 2d062a3..a292f4a 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -1,14 +1,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; using System.Threading.Tasks; - using Discord.WebSocket; - using PluginManager.Interfaces; -using PluginManager.Online.Helpers; +using PluginManager.Online; using PluginManager.Online.Updates; using PluginManager.Others; @@ -23,8 +19,8 @@ public class PluginLoader private const string pluginCMDFolder = @"./Data/Plugins/Commands/"; private const string pluginEVEFolder = @"./Data/Plugins/Events/"; - internal const string pluginCMDExtension = "dll"; - internal const string pluginEVEExtension = "dll"; + internal const string pluginCMDExtension = "dll"; + internal const string pluginEVEExtension = "dll"; private readonly DiscordSocketClient _client; /// @@ -63,35 +59,33 @@ public class PluginLoader public async void LoadPlugins() { //Check for updates in commands - foreach (var file in Directory.GetFiles("./Data/Plugins/Commands", $"*.{pluginCMDExtension}", SearchOption.AllDirectories)) - { + foreach (var file in Directory.GetFiles("./Data/Plugins/Commands", $"*.{pluginCMDExtension}", + SearchOption.AllDirectories)) await Task.Run(async () => { - string name = new FileInfo(file).Name.Split('.')[0]; + var name = new FileInfo(file).Name.Split('.')[0]; if (!Config.PluginVersionsContainsKey(name)) - Config.SetPluginVersion(name, (await Online.ServerCom.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0"); + Config.SetPluginVersion( + name, (await ServerCom.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0"); if (await PluginUpdater.CheckForUpdates(name)) await PluginUpdater.Download(name); }); - } - //Check for updates in events - foreach (var file in Directory.GetFiles("./Data/Plugins/Events", $"*.{pluginEVEExtension}", SearchOption.AllDirectories)) - { + foreach (var file in Directory.GetFiles("./Data/Plugins/Events", $"*.{pluginEVEExtension}", + SearchOption.AllDirectories)) await Task.Run(async () => { - string name = new FileInfo(file).Name.Split('.')[0]; + var name = new FileInfo(file).Name.Split('.')[0]; if (!Config.PluginVersionsContainsKey(name)) - Config.SetPluginVersion(name, (await Online.ServerCom.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0"); + Config.SetPluginVersion( + name, (await ServerCom.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0"); if (await PluginUpdater.CheckForUpdates(name)) await PluginUpdater.Download(name); }); - } - //Save the new config file (after the updates) await Config.SaveConfig(SaveType.NORMAL); @@ -100,39 +94,34 @@ public class PluginLoader //Load all plugins Commands = new List(); - Events = new List(); + Events = new List(); Functions.WriteLogFile("Starting plugin loader ... Client: " + _client.CurrentUser.Username); Console.WriteLine("Loading plugins"); var commandsLoader = new Loader(pluginCMDFolder, pluginCMDExtension); - var eventsLoader = new Loader(pluginEVEFolder, pluginEVEExtension); + var eventsLoader = new Loader(pluginEVEFolder, pluginEVEExtension); - commandsLoader.FileLoaded += OnCommandFileLoaded; + commandsLoader.FileLoaded += OnCommandFileLoaded; commandsLoader.PluginLoaded += OnCommandLoaded; - eventsLoader.FileLoaded += EventFileLoaded; + eventsLoader.FileLoaded += EventFileLoaded; eventsLoader.PluginLoaded += OnEventLoaded; Commands = commandsLoader.Load(); - Events = eventsLoader.Load(); - + Events = eventsLoader.Load(); } private void EventFileLoaded(LoaderArgs e) { if (!e.IsLoaded) - { Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !"); - } } private void OnCommandFileLoaded(LoaderArgs e) { if (!e.IsLoaded) - { Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !"); - } } private void OnEventLoaded(LoaderArgs e) @@ -147,8 +136,8 @@ public class PluginLoader catch (Exception ex) { Console.WriteLine(ex.ToString()); - Console.WriteLine("Plugin: " + e.PluginName); - Console.WriteLine("Type: " + e.TypeName); + Console.WriteLine("Plugin: " + e.PluginName); + Console.WriteLine("Type: " + e.TypeName); Console.WriteLine("IsLoaded: " + e.IsLoaded); } } @@ -157,4 +146,4 @@ public class PluginLoader { onCMDLoad?.Invoke(((DBCommand)e.Plugin!).Command, e.TypeName!, e.IsLoaded, e.Exception); } -} +} \ No newline at end of file diff --git a/PluginManager/Online/Helpers/OnlineFunctions.cs b/PluginManager/Online/Helpers/OnlineFunctions.cs index 343ffe1..dcb7868 100644 --- a/PluginManager/Online/Helpers/OnlineFunctions.cs +++ b/PluginManager/Online/Helpers/OnlineFunctions.cs @@ -1,67 +1,66 @@ using System; -using System.Net.Http; -using System.Threading.Tasks; using System.IO; +using System.Net.Http; using System.Threading; +using System.Threading.Tasks; using PluginManager.Others; -namespace PluginManager.Online.Helpers +namespace PluginManager.Online.Helpers; + +internal static class OnlineFunctions { - internal static class OnlineFunctions + /// + /// Downloads a and saves it to another . + /// + /// The that is used to download the file + /// The url to the file + /// The to save the downloaded data + /// The that is used to track the download progress + /// The cancellation token + /// + internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination, + IProgress? progress = null, + IProgress? downloadedBytes = null, int bufferSize = 81920, + CancellationToken cancellation = default) { - /// - /// Downloads a and saves it to another . - /// - /// The that is used to download the file - /// The url to the file - /// The to save the downloaded data - /// The that is used to track the download progress - /// The cancellation token - /// - internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination, IProgress? progress = null, IProgress? downloadedBytes = null, int bufferSize = 81920, CancellationToken cancellation = default) + using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation)) { - using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation)) + var contentLength = response.Content.Headers.ContentLength; + + using (var download = await response.Content.ReadAsStreamAsync(cancellation)) { - var contentLength = response.Content.Headers.ContentLength; - - using (var download = await response.Content.ReadAsStreamAsync(cancellation)) + // Ignore progress reporting when no progress reporter was + // passed or when the content length is unknown + if (progress == null || !contentLength.HasValue) { - // Ignore progress reporting when no progress reporter was - // passed or when the content length is unknown - if (progress == null || !contentLength.HasValue) - { - await download.CopyToAsync(destination, cancellation); - return; - } - - // Convert absolute progress (bytes downloaded) into relative progress (0% - 100%) - var relativeProgress = new Progress(totalBytes => - { - progress.Report((float)totalBytes / contentLength.Value * 100); - downloadedBytes?.Report(totalBytes); - } - ); - - // Use extension method to report progress while downloading - await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation); - progress.Report(1); + await download.CopyToAsync(destination, cancellation); + return; } + + // Convert absolute progress (bytes downloaded) into relative progress (0% - 100%) + var relativeProgress = new Progress(totalBytes => + { + progress.Report((float)totalBytes / contentLength.Value * 100); + downloadedBytes?.Report(totalBytes); + } + ); + + // Use extension method to report progress while downloading + await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation); + progress.Report(1); } } - - /// - /// Read contents of a file as string from specified URL - /// - /// The URL to read from - /// The cancellation token - /// - internal static async Task DownloadStringAsync(string url, CancellationToken cancellation = default) - { - using var client = new HttpClient(); - return await client.GetStringAsync(url, cancellation); - } - - - } -} + + /// + /// Read contents of a file as string from specified URL + /// + /// The URL to read from + /// The cancellation token + /// + internal static async Task DownloadStringAsync(string url, CancellationToken cancellation = default) + { + using var client = new HttpClient(); + return await client.GetStringAsync(url, cancellation); + } +} \ No newline at end of file diff --git a/PluginManager/Online/Helpers/VersionString.cs b/PluginManager/Online/Helpers/VersionString.cs index 31c3993..9437630 100644 --- a/PluginManager/Online/Helpers/VersionString.cs +++ b/PluginManager/Online/Helpers/VersionString.cs @@ -1,68 +1,83 @@ using System; -namespace PluginManager.Online.Helpers +namespace PluginManager.Online.Helpers; + +public class VersionString { - public class VersionString + public int PackageCheckVersion; + public int PackageMainVersion; + public int PackageVersionID; + + public VersionString(string version) { - public int PackageVersionID; - public int PackageMainVersion; - public int PackageCheckVersion; - - public VersionString(string version) + var data = version.Split('.'); + try { - string[] data = version.Split('.'); - try - { - PackageVersionID = int.Parse(data[0]); - PackageMainVersion = int.Parse(data[1]); - PackageCheckVersion = int.Parse(data[2]); - } - catch (Exception ex) - { - throw new Exception("Failed to write Version", ex); - } + PackageVersionID = int.Parse(data[0]); + PackageMainVersion = int.Parse(data[1]); + PackageCheckVersion = int.Parse(data[2]); } - - - - #region operators - public static bool operator >(VersionString s1, VersionString s2) + catch (Exception ex) { - if (s1.PackageVersionID > s2.PackageVersionID) return true; - if (s1.PackageVersionID == s2.PackageVersionID) - { - if (s1.PackageMainVersion > s2.PackageMainVersion) return true; - if (s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion > s2.PackageCheckVersion) return true; - - } - return false; + throw new Exception("Failed to write Version", ex); } - public static bool operator <(VersionString s1, VersionString s2) => !(s1 > s2) && s1 != s2; - - public static bool operator ==(VersionString s1, VersionString s2) - { - if (s1.PackageVersionID == s2.PackageVersionID && s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion == s2.PackageCheckVersion) return true; - return false; - } - - public static bool operator !=(VersionString s1, VersionString s2) => !(s1 == s2); - - public static bool operator <=(VersionString s1, VersionString s2) => (s1 < s2 || s1 == s2); - public static bool operator >=(VersionString s1, VersionString s2) => (s1 > s2 || s1 == s2); - - #endregion - - public override string ToString() - { - return "{PackageID: " + PackageVersionID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}"; - } - - public string ToShortString() - { - if (PackageVersionID == 0 && PackageCheckVersion == 0 && PackageMainVersion == 0) - return "Unknown"; - return $"{PackageVersionID}.{PackageMainVersion}.{PackageCheckVersion}"; - } - } -} + + public override string ToString() + { + return "{PackageID: " + PackageVersionID + ", PackageVersion: " + PackageMainVersion + + ", PackageCheckVersion: " + PackageCheckVersion + "}"; + } + + public string ToShortString() + { + if (PackageVersionID == 0 && PackageCheckVersion == 0 && PackageMainVersion == 0) + return "Unknown"; + return $"{PackageVersionID}.{PackageMainVersion}.{PackageCheckVersion}"; + } + + + #region operators + + public static bool operator >(VersionString s1, VersionString s2) + { + if (s1.PackageVersionID > s2.PackageVersionID) return true; + if (s1.PackageVersionID == s2.PackageVersionID) + { + if (s1.PackageMainVersion > s2.PackageMainVersion) return true; + if (s1.PackageMainVersion == s2.PackageMainVersion && + s1.PackageCheckVersion > s2.PackageCheckVersion) return true; + } + + return false; + } + + public static bool operator <(VersionString s1, VersionString s2) + { + return !(s1 > s2) && s1 != s2; + } + + public static bool operator ==(VersionString s1, VersionString s2) + { + if (s1.PackageVersionID == s2.PackageVersionID && s1.PackageMainVersion == s2.PackageMainVersion && + s1.PackageCheckVersion == s2.PackageCheckVersion) return true; + return false; + } + + public static bool operator !=(VersionString s1, VersionString s2) + { + return !(s1 == s2); + } + + public static bool operator <=(VersionString s1, VersionString s2) + { + return s1 < s2 || s1 == s2; + } + + public static bool operator >=(VersionString s1, VersionString s2) + { + return s1 > s2 || s1 == s2; + } + + #endregion +} \ No newline at end of file diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index 56adb74..4f1de51 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; - using PluginManager.Online.Helpers; using PluginManager.Others; - using OperatingSystem = PluginManager.Others.OperatingSystem; namespace PluginManager.Online; @@ -33,13 +31,13 @@ public class PluginsManager { try { - var list = await ServerCom.ReadTextFromURL(PluginsLink); + var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); var data = new List(); - var op = Functions.GetOperatingSystem(); + var op = Functions.GetOperatingSystem(); - var len = lines.Length; + var len = lines.Length; string[] titles = { "Name", "Description", "Type", "Version", "Installed" }; data.Add(new[] { "-", "-", "-", "-", "-" }); data.Add(titles); @@ -57,7 +55,9 @@ public class PluginsManager display[0] = content[0]; display[1] = content[1]; display[2] = content[2]; - display[3] = (await Online.ServerCom.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString(); + display[3] = + (await ServerCom.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")) + .ToShortString(); if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0])) display[4] = "✓"; else @@ -72,7 +72,9 @@ public class PluginsManager display[0] = content[0]; display[1] = content[1]; display[2] = content[2]; - display[3] = (await Online.ServerCom.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString(); + display[3] = + (await ServerCom.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")) + .ToShortString(); if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0])) display[4] = "✓"; else @@ -102,9 +104,9 @@ public class PluginsManager { try { - var list = await ServerCom.ReadTextFromURL(PluginsLink); + var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); - var len = lines.Length; + var len = lines.Length; for (var i = 0; i < len; i++) { var contents = lines[i].Split(','); @@ -126,4 +128,4 @@ public class PluginsManager return new string[] { null!, null!, null! }; } -} +} \ No newline at end of file diff --git a/PluginManager/Online/ServerCom.cs b/PluginManager/Online/ServerCom.cs index 7cf67b0..6dd2bf9 100644 --- a/PluginManager/Online/ServerCom.cs +++ b/PluginManager/Online/ServerCom.cs @@ -1,107 +1,109 @@ using PluginManager.Online.Helpers; +using PluginManager.Others; + using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using PluginManager.Others; -namespace PluginManager.Online +namespace PluginManager.Online; + +public static class ServerCom { - public static class ServerCom + /// + /// Read all lines from a file async + /// + /// The link of the file + /// + public static async Task> ReadTextFromURL(string link) { - /// - /// Read all lines from a file async - /// - /// The link of the file - /// - public static async Task> ReadTextFromURL(string link) - { - string response = await OnlineFunctions.DownloadStringAsync(link); - string[] lines = response.Split('\n'); - return lines.ToList(); - } + var response = await OnlineFunctions.DownloadStringAsync(link); + var lines = response.Split('\n'); + return lines.ToList(); + } - /// - /// Download file from url - /// - /// The url to the file - /// The location where to store the downloaded data - /// The to track the download - /// - public static async Task DownloadFileAsync(string URL, string location, IProgress progress, IProgress? downloadedBytes = null) + /// + /// Download file from url + /// + /// The url to the file + /// The location where to store the downloaded data + /// The to track the download + /// + public static async Task DownloadFileAsync(string URL, string location, IProgress progress, + IProgress? downloadedBytes = null) + { + using (var client = new HttpClient()) { - using (var client = new System.Net.Http.HttpClient()) + client.Timeout = TimeSpan.FromMinutes(5); + + using (var file = new FileStream(location, FileMode.Create, FileAccess.Write, FileShare.None)) { - client.Timeout = TimeSpan.FromMinutes(5); - - using (var file = new FileStream(location, FileMode.Create, FileAccess.Write, FileShare.None)) - { - await client.DownloadFileAsync(URL, file, progress, downloadedBytes); - } + await client.DownloadFileAsync(URL, file, progress, downloadedBytes); } } - - /// - /// Download file from url - /// - /// The url to the file - /// The location where to store the downloaded data - /// - public static async Task DownloadFileAsync(string URL, string location) - { - bool isDownloading = true; - float c_progress = 0; - - Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, NoColor = true }; - - IProgress progress = new Progress(percent => { c_progress = percent; }); - - - Task updateProgressBarTask = new Task(() => - { - while (isDownloading) - { - pbar.Update(c_progress); - if (c_progress == 100f) - break; - Thread.Sleep(500); - } - } - ); - - new Thread(updateProgressBarTask.Start).Start(); - await DownloadFileAsync(URL, location, progress); - - - c_progress = pbar.Max; - pbar.Update(100f); - isDownloading = false; - } - public static async Task DownloadFileNoProgressAsync(string URL, string location) - { - IProgress progress = new Progress(); - await DownloadFileAsync(URL, location, progress); - } - - public static VersionString? GetVersionOfPackage(string pakName) - { - if (!Config.PluginVersionsContainsKey(pakName)) - return null; - return new VersionString(Config.GetPluginVersion(pakName)); - } - - public static async Task GetVersionOfPackageFromWeb(string pakName) - { - string url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions"; - List data = await ServerCom.ReadTextFromURL(url); - string? version = (from item in data - where !item.StartsWith("#") && item.StartsWith(pakName) - select item.Split(',')[1]).FirstOrDefault(); - if (version == default || version == null) return null; - return new VersionString(version); - } - } -} + + /// + /// Download file from url + /// + /// The url to the file + /// The location where to store the downloaded data + /// + public static async Task DownloadFileAsync(string URL, string location) + { + var isDownloading = true; + float c_progress = 0; + + var pbar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, NoColor = true }; + + IProgress progress = new Progress(percent => { c_progress = percent; }); + + + var updateProgressBarTask = new Task(() => + { + while (isDownloading) + { + pbar.Update(c_progress); + if (c_progress == 100f) + break; + Thread.Sleep(500); + } + } + ); + + new Thread(updateProgressBarTask.Start).Start(); + await DownloadFileAsync(URL, location, progress); + + + c_progress = pbar.Max; + pbar.Update(100f); + isDownloading = false; + } + + public static async Task DownloadFileNoProgressAsync(string URL, string location) + { + IProgress progress = new Progress(); + await DownloadFileAsync(URL, location, progress); + } + + public static VersionString? GetVersionOfPackage(string pakName) + { + if (!Config.PluginVersionsContainsKey(pakName)) + return null; + return new VersionString(Config.GetPluginVersion(pakName)); + } + + public static async Task GetVersionOfPackageFromWeb(string pakName) + { + var url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions"; + var data = await ReadTextFromURL(url); + var version = (from item in data + where !item.StartsWith("#") && item.StartsWith(pakName) + select item.Split(',')[1]).FirstOrDefault(); + if (version == default || version == null) return null; + return new VersionString(version); + } +} \ No newline at end of file diff --git a/PluginManager/Online/Updates/PluginUpdater.cs b/PluginManager/Online/Updates/PluginUpdater.cs index 3d24c16..c0d5afe 100644 --- a/PluginManager/Online/Updates/PluginUpdater.cs +++ b/PluginManager/Online/Updates/PluginUpdater.cs @@ -1,51 +1,51 @@ -using PluginManager.Items; -using PluginManager.Online.Helpers; +using System; +using System.Threading.Tasks; +using PluginManager.Items; using PluginManager.Others; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; +namespace PluginManager.Online.Updates; -namespace PluginManager.Online.Updates +public class PluginUpdater { - public class PluginUpdater + public static async Task CheckForUpdates(string pakName) { - public static async Task CheckForUpdates(string pakName) + try { - try - { - var webV = await Online.ServerCom.GetVersionOfPackageFromWeb(pakName); - var local = Online.ServerCom.GetVersionOfPackage(pakName); + var webV = await ServerCom.GetVersionOfPackageFromWeb(pakName); + var local = ServerCom.GetVersionOfPackage(pakName); - if (local is null) return true; - if (webV is null) return false; + if (local is null) return true; + if (webV is null) return false; - if (webV == local) return false; - if (webV > local) return true; - } - catch (Exception ex) { Console.WriteLine(ex.Message); } - - - return false; + if (webV == local) return false; + if (webV > local) return true; } - - public static async Task DownloadUpdateInfo(string pakName) + catch (Exception ex) { - string url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions"; - List info = await ServerCom.ReadTextFromURL(url); - VersionString? version = await Online.ServerCom.GetVersionOfPackageFromWeb(pakName); - - if (version is null) return Update.Empty; - Update update = new Update(pakName, string.Join('\n', info), version); - return update; - } - - public static async Task Download(string pakName) - { - Console_Utilities.WriteColorText("An update was found for &g" + pakName + "&c. Version: &r" + (await Online.ServerCom.GetVersionOfPackageFromWeb(pakName))?.ToShortString() + "&c. Current Version: &y" + Online.ServerCom.GetVersionOfPackage(pakName)?.ToShortString()); - await ConsoleCommandsHandler.ExecuteCommad("dwplug " + pakName); + Console.WriteLine(ex.Message); } + return false; } -} + + public static async Task DownloadUpdateInfo(string pakName) + { + var url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions"; + var info = await ServerCom.ReadTextFromURL(url); + var version = await ServerCom.GetVersionOfPackageFromWeb(pakName); + + if (version is null) return Update.Empty; + var update = new Update(pakName, string.Join('\n', info), version); + return update; + } + + public static async Task Download(string pakName) + { + Console_Utilities.WriteColorText("An update was found for &g" + pakName + "&c. Version: &r" + + (await ServerCom.GetVersionOfPackageFromWeb(pakName))?.ToShortString() + + "&c. Current Version: &y" + + ServerCom.GetVersionOfPackage(pakName)?.ToShortString()); + await ConsoleCommandsHandler.ExecuteCommad("dwplug " + pakName); + } +} \ No newline at end of file diff --git a/PluginManager/Online/Updates/Update.cs b/PluginManager/Online/Updates/Update.cs index 39eaed4..2cdde6b 100644 --- a/PluginManager/Online/Updates/Update.cs +++ b/PluginManager/Online/Updates/Update.cs @@ -1,36 +1,34 @@ -using PluginManager.Online.Helpers; +using System; +using PluginManager.Online.Helpers; -namespace PluginManager.Online.Updates +namespace PluginManager.Online.Updates; + +public class Update { - public class Update + public static Update Empty = new(null, null, null); + + private readonly bool isEmpty; + + public VersionString newVersion; + public string pakName; + public string UpdateMessage; + + public Update(string pakName, string updateMessage, VersionString newVersion) { - public static Update Empty = new Update(null, null, null); - public string pakName; - public string UpdateMessage; - - public VersionString newVersion; - - private bool isEmpty; - - public Update(string pakName, string updateMessage, VersionString newVersion) - { - this.pakName = pakName; - UpdateMessage = updateMessage; - this.newVersion = newVersion; - - if (pakName is null && updateMessage is null && newVersion is null) - isEmpty = true; - - } - - public override string ToString() - { - if (isEmpty) - throw new System.Exception("The update is EMPTY. Can not print information about an empty update !"); - return $"Package Name: {this.pakName}\n" + - $"Update Message: {UpdateMessage}\n" + - $"Version: {newVersion.ToString()}"; - } + this.pakName = pakName; + UpdateMessage = updateMessage; + this.newVersion = newVersion; + if (pakName is null && updateMessage is null && newVersion is null) + isEmpty = true; } -} + + public override string ToString() + { + if (isEmpty) + throw new Exception("The update is EMPTY. Can not print information about an empty update !"); + return $"Package Name: {pakName}\n" + + $"Update Message: {UpdateMessage}\n" + + $"Version: {newVersion}"; + } +} \ No newline at end of file diff --git a/PluginManager/Others/Channels.cs b/PluginManager/Others/Channels.cs index d0dbac6..ca8a270 100644 --- a/PluginManager/Others/Channels.cs +++ b/PluginManager/Others/Channels.cs @@ -57,4 +57,4 @@ public static class ChannelManagement { return message.Channel; } -} +} \ No newline at end of file diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index 818042e..09c0012 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -1,371 +1,367 @@ -using Discord; - -using System; +using System; using System.Collections.Generic; +using System.Threading.Tasks; -namespace PluginManager.Others +namespace PluginManager.Others; + +public static class Console_Utilities { - public static class Console_Utilities + public static void Initialize() { - public static void Initialize() + if (!Config.ContainsKey("TableVariables")) + Config.AddValueToVariables("TableVariables", new Dictionary { { "DefaultSpace", "3" } }, + false); + if (!Config.ContainsKey("ColorDataBase")) + Config.AddValueToVariables("ColorDataBase", new Dictionary + { + { 'g', ConsoleColor.Green }, + { 'b', ConsoleColor.Blue }, + { 'r', ConsoleColor.Red }, + { 'm', ConsoleColor.Magenta }, + { 'y', ConsoleColor.Yellow } + }, false + ); + + if (!Config.ContainsKey("ColorPrefix")) + Config.AddValueToVariables("ColorPrefix", '&', false); + } + + + private static bool CanAproximateTo(this float f, float y) + { + return MathF.Abs(f - y) < 0.000001; + } + + + /// + /// A way to create a table based on input data + /// + /// The List of arrays of strings that represent the rows. + public static void FormatAndAlignTable(List data, TableFormat format) + { + if (format == TableFormat.CENTER_EACH_COLUMN_BASED) { - if (!Config.ContainsKey("TableVariables")) - Config.AddValueToVariables("TableVariables", new Dictionary { { "DefaultSpace", "3" } }, false); - if (!Config.ContainsKey("ColorDataBase")) - Config.AddValueToVariables("ColorDataBase", new Dictionary() - { - { 'g', ConsoleColor.Green }, - { 'b', ConsoleColor.Blue }, - { 'r', ConsoleColor.Red }, - { 'm', ConsoleColor.Magenta }, - { 'y', ConsoleColor.Yellow }, - }, false - ); + var tableLine = '-'; + var tableCross = '+'; + var tableWall = '|'; - if (!Config.ContainsKey("ColorPrefix")) - Config.AddValueToVariables("ColorPrefix", '&', false); - } + var len = new int[data[0].Length]; + foreach (var line in data) + for (var i = 0; i < line.Length; i++) + if (line[i].Length > len[i]) + len[i] = line[i].Length; - /// - /// Progress bar object - /// - public class ProgressBar - { - public ProgressBar(ProgressBarType type) + foreach (var row in data) { - this.type = type; - } - - public float Max { get; init; } - public ConsoleColor Color { get; init; } - public bool NoColor { get; init; } - public ProgressBarType type { get; set; } - - public int TotalLength { get; private set; } - - private int BarLength = 32; - private int position = 1; - private bool positive = true; - - private bool isRunning; - - - public async void Start() - { - if (type != ProgressBarType.NO_END) - throw new Exception("Only NO_END progress bar can use this method"); - if (isRunning) - throw new Exception("This progress bar is already running"); - - isRunning = true; - while (isRunning) - { - UpdateNoEnd(); - await System.Threading.Tasks.Task.Delay(100); - } - } - - public async void Start(string message) - { - if (type != ProgressBarType.NO_END) - throw new Exception("Only NO_END progress bar can use this method"); - if (isRunning) - throw new Exception("This progress bar is already running"); - - isRunning = true; - - TotalLength = message.Length + BarLength + 5; - while (isRunning) - { - UpdateNoEnd(message); - await System.Threading.Tasks.Task.Delay(100); - } - } - - public void Stop() - { - if (type != ProgressBarType.NO_END) - throw new Exception("Only NO_END progress bar can use this method"); - if (!isRunning) - throw new Exception("Can not stop a progressbar that did not start"); - isRunning = false; - } - - public void Stop(string message) - { - Stop(); - - if (message is not null) - { - Console.CursorLeft = 0; - for (int i = 0; i < BarLength + message.Length + 1; i++) - Console.Write(" "); - Console.CursorLeft = 0; - Console.WriteLine(message); - } - } - - public void Update(float progress) - { - if (type == ProgressBarType.NO_END) - throw new Exception("This function is for progress bars with end"); - - UpdateNormal(progress); - } - - private void UpdateNoEnd(string message) - { - Console.CursorLeft = 0; - Console.Write("["); - for (int i = 1; i <= position; i++) - Console.Write(" "); - Console.Write("<==()==>"); - position += positive ? 1 : -1; - for (int i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++) - Console.Write(" "); - Console.Write("] " + message); - - - - - if (position == BarLength - 1 || position == 1) - positive = !positive; - } - - private void UpdateNoEnd() - { - Console.CursorLeft = 0; - Console.Write("["); - for (int i = 1; i <= position; i++) - Console.Write(" "); - Console.Write("<==()==>"); - position += positive ? 1 : -1; - for (int i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++) - Console.Write(" "); - Console.Write("]"); - - - - - if (position == BarLength - 1 || position == 1) - positive = !positive; - } - - private void UpdateNormal(float progress) - { - Console.CursorLeft = 0; - Console.Write("["); - Console.CursorLeft = BarLength; - Console.Write("]"); - Console.CursorLeft = 1; - float onechunk = 30.0f / Max; - - int position = 1; - - for (int i = 0; i < onechunk * progress; i++) - { - Console.BackgroundColor = NoColor ? ConsoleColor.Black : this.Color; - Console.CursorLeft = position++; - Console.Write("#"); - } - - for (int i = position; i < BarLength; i++) - { - Console.BackgroundColor = NoColor ? ConsoleColor.Black : ConsoleColor.DarkGray; - Console.CursorLeft = position++; - Console.Write(" "); - } - - Console.CursorLeft = BarLength + 4; - Console.BackgroundColor = ConsoleColor.Black; - if (progress.CanAproximateTo(Max)) - Console.Write(progress + " % ✓"); + if (row[0][0] == tableLine) + Console.Write(tableCross); else - Console.Write(MathF.Round(progress, 2) + " % "); - } - } - - - private static bool CanAproximateTo(this float f, float y) => (MathF.Abs(f - y) < 0.000001); - - - /// - /// A way to create a table based on input data - /// - /// The List of arrays of strings that represent the rows. - public static void FormatAndAlignTable(List data, TableFormat format) - { - if (format == TableFormat.CENTER_EACH_COLUMN_BASED) - { - char tableLine = '-'; - char tableCross = '+'; - char tableWall = '|'; - - int[] len = new int[data[0].Length]; - foreach (var line in data) - for (int i = 0; i < line.Length; i++) - if (line[i].Length > len[i]) - len[i] = line[i].Length; - - - foreach (string[] row in data) + Console.Write(tableWall); + for (var l = 0; l < row.Length; l++) { - if (row[0][0] == tableLine) - Console.Write(tableCross); + if (row[l][0] == tableLine) + { + for (var i = 0; i < len[l] + 4; ++i) + Console.Write(tableLine); + } + else if (row[l].Length == len[l]) + { + Console.Write(" "); + Console.Write(row[l]); + Console.Write(" "); + } else - Console.Write(tableWall); - for (int l = 0; l < row.Length; l++) { - if (row[l][0] == tableLine) - { - for (int i = 0; i < len[l] + 4; ++i) - Console.Write(tableLine); - } - else if (row[l].Length == len[l]) - { - Console.Write(" "); - Console.Write(row[l]); - Console.Write(" "); - } - else - { - int lenHalf = row[l].Length / 2; - for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i) - Console.Write(" "); - Console.Write(row[l]); - for (int i = (len[l] + 4) / 2 + lenHalf + 1; i < len[l] + 4; ++i) - Console.Write(" "); - if (row[l].Length % 2 == 0) - Console.Write(" "); - } - - Console.Write(row[l][0] == tableLine ? tableCross : tableWall); - } - - Console.WriteLine(); //end line - } - - return; - } - - if (format == TableFormat.CENTER_OVERALL_LENGTH) - { - int maxLen = 0; - foreach (string[] row in data) - foreach (string s in row) - if (s.Length > maxLen) - maxLen = s.Length; - - int div = (maxLen + 4) / 2; - - foreach (string[] row in data) - { - Console.Write("\t"); - if (row[0] == "-") - Console.Write("+"); - else - Console.Write("|"); - - foreach (string s in row) - { - if (s == "-") - { - for (int i = 0; i < maxLen + 4; ++i) - Console.Write("-"); - } - else if (s.Length == maxLen) - { - Console.Write(" "); - Console.Write(s); - Console.Write(" "); - } - else - { - int lenHalf = s.Length / 2; - for (int i = 0; i < div - lenHalf; ++i) - Console.Write(" "); - Console.Write(s); - for (int i = div + lenHalf + 1; i < maxLen + 4; ++i) - Console.Write(" "); - if (s.Length % 2 == 0) - Console.Write(" "); - } - - if (s == "-") - Console.Write("+"); - else - Console.Write("|"); - } - - Console.WriteLine(); //end line - } - - return; - } - - if (format == TableFormat.DEFAULT) - { - int[] widths = new int[data[0].Length]; - int space_between_columns = int.Parse(Config.GetValue>("TableVariables")?["DefaultSpace"]!); - for (int i = 0; i < data.Count; i++) - { - for (int j = 0; j < data[i].Length; j++) - { - if (data[i][j].Length > widths[j]) - widths[j] = data[i][j].Length; - } - } - - for (int i = 0; i < data.Count; i++) - { - for (int j = 0; j < data[i].Length; j++) - { - if (data[i][j] == "-") - data[i][j] = " "; - Console.Write(data[i][j]); - for (int k = 0; k < widths[j] - data[i][j].Length + 1 + space_between_columns; k++) + var lenHalf = row[l].Length / 2; + for (var i = 0; i < (len[l] + 4) / 2 - lenHalf; ++i) + Console.Write(" "); + Console.Write(row[l]); + for (var i = (len[l] + 4) / 2 + lenHalf + 1; i < len[l] + 4; ++i) + Console.Write(" "); + if (row[l].Length % 2 == 0) Console.Write(" "); } - Console.WriteLine(); + Console.Write(row[l][0] == tableLine ? tableCross : tableWall); } - return; + Console.WriteLine(); //end line } - throw new Exception("Unknown type of table"); + return; } - public static void WriteColorText(string text, bool appendNewLineAtEnd = true) + if (format == TableFormat.CENTER_OVERALL_LENGTH) { - ConsoleColor initialForeGround = Console.ForegroundColor; - char[] input = text.ToCharArray(); - for (int i = 0; i < input.Length; i++) + var maxLen = 0; + foreach (var row in data) + foreach (var s in row) + if (s.Length > maxLen) + maxLen = s.Length; + + var div = (maxLen + 4) / 2; + + foreach (var row in data) { - if (input[i] == Config.GetValue("ColorPrefix")) + Console.Write("\t"); + if (row[0] == "-") + Console.Write("+"); + else + Console.Write("|"); + + foreach (var s in row) { - if (i + 1 < input.Length) + if (s == "-") { - if (Config.GetValue>("ColorDataBase")!.ContainsKey(input[i + 1])) - { - Console.ForegroundColor = Config.GetValue>("ColorDataBase")![input[i + 1]]; - i++; - } - else if (input[i + 1] == 'c') - { - Console.ForegroundColor = initialForeGround; - i++; - } + for (var i = 0; i < maxLen + 4; ++i) + Console.Write("-"); + } + else if (s.Length == maxLen) + { + Console.Write(" "); + Console.Write(s); + Console.Write(" "); + } + else + { + var lenHalf = s.Length / 2; + for (var i = 0; i < div - lenHalf; ++i) + Console.Write(" "); + Console.Write(s); + for (var i = div + lenHalf + 1; i < maxLen + 4; ++i) + Console.Write(" "); + if (s.Length % 2 == 0) + Console.Write(" "); + } + + if (s == "-") + Console.Write("+"); + else + Console.Write("|"); + } + + Console.WriteLine(); //end line + } + + return; + } + + if (format == TableFormat.DEFAULT) + { + var widths = new int[data[0].Length]; + var space_between_columns = + int.Parse(Config.GetValue>("TableVariables")?["DefaultSpace"]!); + for (var i = 0; i < data.Count; i++) + for (var j = 0; j < data[i].Length; j++) + if (data[i][j].Length > widths[j]) + widths[j] = data[i][j].Length; + + for (var i = 0; i < data.Count; i++) + { + for (var j = 0; j < data[i].Length; j++) + { + if (data[i][j] == "-") + data[i][j] = " "; + Console.Write(data[i][j]); + for (var k = 0; k < widths[j] - data[i][j].Length + 1 + space_between_columns; k++) + Console.Write(" "); + } + + Console.WriteLine(); + } + + return; + } + + throw new Exception("Unknown type of table"); + } + + public static void WriteColorText(string text, bool appendNewLineAtEnd = true) + { + var initialForeGround = Console.ForegroundColor; + var input = text.ToCharArray(); + for (var i = 0; i < input.Length; i++) + if (input[i] == Config.GetValue("ColorPrefix")) + { + if (i + 1 < input.Length) + { + if (Config.GetValue>("ColorDataBase")!.ContainsKey(input[i + 1])) + { + Console.ForegroundColor = + Config.GetValue>("ColorDataBase")![input[i + 1]]; + i++; + } + else if (input[i + 1] == 'c') + { + Console.ForegroundColor = initialForeGround; + i++; } } - else - Console.Write(input[i]); + } + else + { + Console.Write(input[i]); } - Console.ForegroundColor = initialForeGround; - if (appendNewLineAtEnd) - Console.WriteLine(); + Console.ForegroundColor = initialForeGround; + if (appendNewLineAtEnd) + Console.WriteLine(); + } + + + /// + /// Progress bar object + /// + public class ProgressBar + { + private readonly int BarLength = 32; + + private bool isRunning; + private int position = 1; + private bool positive = true; + + public ProgressBar(ProgressBarType type) + { + this.type = type; + } + + public float Max { get; init; } + public ConsoleColor Color { get; init; } + public bool NoColor { get; init; } + public ProgressBarType type { get; set; } + + public int TotalLength { get; private set; } + + + public async void Start() + { + if (type != ProgressBarType.NO_END) + throw new Exception("Only NO_END progress bar can use this method"); + if (isRunning) + throw new Exception("This progress bar is already running"); + + isRunning = true; + while (isRunning) + { + UpdateNoEnd(); + await Task.Delay(100); + } + } + + public async void Start(string message) + { + if (type != ProgressBarType.NO_END) + throw new Exception("Only NO_END progress bar can use this method"); + if (isRunning) + throw new Exception("This progress bar is already running"); + + isRunning = true; + + TotalLength = message.Length + BarLength + 5; + while (isRunning) + { + UpdateNoEnd(message); + await Task.Delay(100); + } + } + + public void Stop() + { + if (type != ProgressBarType.NO_END) + throw new Exception("Only NO_END progress bar can use this method"); + if (!isRunning) + throw new Exception("Can not stop a progressbar that did not start"); + isRunning = false; + } + + public void Stop(string message) + { + Stop(); + + if (message is not null) + { + Console.CursorLeft = 0; + for (var i = 0; i < BarLength + message.Length + 1; i++) + Console.Write(" "); + Console.CursorLeft = 0; + Console.WriteLine(message); + } + } + + public void Update(float progress) + { + if (type == ProgressBarType.NO_END) + throw new Exception("This function is for progress bars with end"); + + UpdateNormal(progress); + } + + private void UpdateNoEnd(string message) + { + Console.CursorLeft = 0; + Console.Write("["); + for (var i = 1; i <= position; i++) + Console.Write(" "); + Console.Write("<==()==>"); + position += positive ? 1 : -1; + for (var i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++) + Console.Write(" "); + Console.Write("] " + message); + + + if (position == BarLength - 1 || position == 1) + positive = !positive; + } + + private void UpdateNoEnd() + { + Console.CursorLeft = 0; + Console.Write("["); + for (var i = 1; i <= position; i++) + Console.Write(" "); + Console.Write("<==()==>"); + position += positive ? 1 : -1; + for (var i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++) + Console.Write(" "); + Console.Write("]"); + + + if (position == BarLength - 1 || position == 1) + positive = !positive; + } + + private void UpdateNormal(float progress) + { + Console.CursorLeft = 0; + Console.Write("["); + Console.CursorLeft = BarLength; + Console.Write("]"); + Console.CursorLeft = 1; + var onechunk = 30.0f / Max; + + var position = 1; + + for (var i = 0; i < onechunk * progress; i++) + { + Console.BackgroundColor = NoColor ? ConsoleColor.Black : Color; + Console.CursorLeft = position++; + Console.Write("#"); + } + + for (var i = position; i < BarLength; i++) + { + Console.BackgroundColor = NoColor ? ConsoleColor.Black : ConsoleColor.DarkGray; + Console.CursorLeft = position++; + Console.Write(" "); + } + + Console.CursorLeft = BarLength + 4; + Console.BackgroundColor = ConsoleColor.Black; + if (progress.CanAproximateTo(Max)) + Console.Write(progress + " % ✓"); + else + Console.Write(MathF.Round(progress, 2) + " % "); } } -} +} \ No newline at end of file diff --git a/PluginManager/Others/Enums.cs b/PluginManager/Others/Enums.cs index fb63614..33b1064 100644 --- a/PluginManager/Others/Enums.cs +++ b/PluginManager/Others/Enums.cs @@ -1,13 +1,14 @@ -using PluginManager.Interfaces; - -namespace PluginManager.Others; +namespace PluginManager.Others; /// /// A list of operating systems /// public enum OperatingSystem { - WINDOWS, LINUX, MAC_OS, UNKNOWN + WINDOWS, + LINUX, + MAC_OS, + UNKNOWN } /// @@ -15,22 +16,57 @@ public enum OperatingSystem /// public enum Error { - UNKNOWN_ERROR, GUILD_NOT_FOUND, STREAM_NOT_FOUND, INVALID_USER, INVALID_CHANNEL, INVALID_PERMISSIONS + UNKNOWN_ERROR, + GUILD_NOT_FOUND, + STREAM_NOT_FOUND, + INVALID_USER, + INVALID_CHANNEL, + INVALID_PERMISSIONS } /// /// The output log type /// -public enum OutputLogLevel { NONE, INFO, WARNING, ERROR, CRITICAL } +public enum OutputLogLevel +{ + NONE, + INFO, + WARNING, + ERROR, + CRITICAL +} /// -/// Plugin Type +/// Plugin Type /// -public enum PluginType { Command, Event, Unknown } +public enum PluginType +{ + Command, + Event, + Unknown +} -public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize } +public enum UnzipProgressType +{ + PercentageFromNumberOfFiles, + PercentageFromTotalSize +} -public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT } +public enum TableFormat +{ + CENTER_EACH_COLUMN_BASED, + CENTER_OVERALL_LENGTH, + DEFAULT +} -public enum SaveType { NORMAL, BACKUP } -public enum ProgressBarType { NORMAL, NO_END } \ No newline at end of file +public enum SaveType +{ + NORMAL, + BACKUP +} + +public enum ProgressBarType +{ + NORMAL, + NO_END +} \ No newline at end of file diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index fa9bc40..1784acd 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -1,376 +1,380 @@ -using System.IO.Compression; -using System.IO; -using System; -using System.Threading.Tasks; -using System.Linq; +using System; using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Runtime.InteropServices; using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; using Discord.WebSocket; using PluginManager.Items; -using System.Threading; -using System.Text.Json; -using System.Text; -namespace PluginManager.Others +namespace PluginManager.Others; + +/// +/// A special class with functions +/// +public static class Functions { /// - /// A special class with functions + /// The location for the Resources folder /// - public static class Functions + public static readonly string dataFolder = @"./Data/Resources/"; + + /// + /// The location for all logs + /// + public static readonly string logFolder = @"./Data/Output/Logs/"; + + /// + /// The location for all errors + /// + public static readonly string errFolder = @"./Data/Output/Errors/"; + + /// + /// Archives folder + /// + public static readonly string pakFolder = @"./Data/PAKS/"; + + /// + /// Beta testing folder + /// + public static readonly string betaFolder = @"./Data/BetaTest/"; + + + /// + /// Read data from a file that is inside an archive (ZIP format) + /// + /// The file name that is inside the archive or its full path + /// The archive location from the PAKs folder + /// A string that represents the content of the file or null if the file does not exists or it has no content + public static async Task ReadFromPakAsync(string FileName, string archFile) { - /// - /// The location for the Resources folder - /// - public static readonly string dataFolder = @"./Data/Resources/"; + archFile = pakFolder + archFile; + if (!File.Exists(archFile)) + throw new Exception("Failed to load file !"); - /// - /// The location for all logs - /// - public static readonly string logFolder = @"./Data/Output/Logs/"; - - /// - /// The location for all errors - /// - public static readonly string errFolder = @"./Data/Output/Errors/"; - - /// - /// Archives folder - /// - public static readonly string pakFolder = @"./Data/PAKS/"; - - /// - /// Beta testing folder - /// - public static readonly string betaFolder = @"./Data/BetaTest/"; - - - /// - /// Read data from a file that is inside an archive (ZIP format) - /// - /// The file name that is inside the archive or its full path - /// The archive location from the PAKs folder - /// A string that represents the content of the file or null if the file does not exists or it has no content - public static async Task ReadFromPakAsync(string FileName, string archFile) + try { - archFile = pakFolder + archFile; - if (!File.Exists(archFile)) - throw new Exception("Failed to load file !"); - - try + string textValue = null; + using (var fs = new FileStream(archFile, FileMode.Open)) + using (var zip = new ZipArchive(fs, ZipArchiveMode.Read)) { - string textValue = null; - using (var fs = new FileStream(archFile, FileMode.Open)) - using (var zip = new ZipArchive(fs, ZipArchiveMode.Read)) - foreach (var entry in zip.Entries) - { - if (entry.Name == FileName || entry.FullName == FileName) + foreach (var entry in zip.Entries) + if (entry.Name == FileName || entry.FullName == FileName) + using (var s = entry.Open()) + using (var reader = new StreamReader(s)) { - using (Stream s = entry.Open()) - using (StreamReader reader = new StreamReader(s)) - { - textValue = await reader.ReadToEndAsync(); - reader.Close(); - s.Close(); - fs.Close(); - } + textValue = await reader.ReadToEndAsync(); + reader.Close(); + s.Close(); + fs.Close(); } + } + + return textValue; + } + catch + { + await Task.Delay(100); + return await ReadFromPakAsync(FileName, archFile); + } + } + + + /// + /// Write logs to file + /// + /// The message to be wrote + public static void WriteLogFile(string LogMessage) + { + var logsPath = logFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Log.txt"; + Directory.CreateDirectory(logFolder); + File.AppendAllText(logsPath, LogMessage + " \n"); + } + + /// + /// Write error to file + /// + /// The message to be wrote + public static void WriteErrFile(string ErrMessage) + { + var errPath = errFolder + + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Error.txt"; + Directory.CreateDirectory(errFolder); + File.AppendAllText(errPath, ErrMessage + " \n"); + } + + public static void WriteErrFile(this Exception ex) + { + WriteErrFile(ex.ToString()); + } + + /// + /// Merge one array of strings into one string + /// + /// The array of strings + /// The index from where the merge should start (included) + /// A string built based on the array + public static string MergeStrings(this string[] s, int indexToStart) + { + return string.Join(' ', s, indexToStart, s.Length - 1); + + /* string r = ""; + + int len = s.Length; + if (len <= indexToStart) return ""; + for (int i = indexToStart; i < len - 1; ++i) + { + r += s[i] + " "; } - return textValue; - } - catch + + r += s[len - 1]; + + return r; + */ + } + + /// + /// Get the Operating system you are runnin on + /// + /// An Operating system + public static OperatingSystem GetOperatingSystem() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return OperatingSystem.WINDOWS; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return OperatingSystem.LINUX; + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) return OperatingSystem.MAC_OS; + return OperatingSystem.UNKNOWN; + } + + public static List GetArguments(SocketMessage message) + { + var command = new Command(message); + return command.Arguments; + } + + /// + /// Copy one Stream to another + /// + /// The base stream + /// The destination stream + /// The buffer to read + /// The progress + /// The cancellation token + /// Triggered if any is empty + /// Triggered if is less then or equal to 0 + /// Triggered if is not readable + /// Triggered in is not writable + public static async Task CopyToOtherStreamAsync(this Stream stream, Stream destination, int bufferSize, + IProgress? progress = null, + CancellationToken cancellationToken = default) + { + if (stream == null) throw new ArgumentNullException(nameof(stream)); + if (destination == null) throw new ArgumentNullException(nameof(destination)); + if (bufferSize <= 0) throw new ArgumentOutOfRangeException(nameof(bufferSize)); + if (!stream.CanRead) throw new InvalidOperationException("The stream is not readable."); + if (!destination.CanWrite) + throw new ArgumentException("Destination stream is not writable", nameof(destination)); + + var buffer = new byte[bufferSize]; + long totalBytesRead = 0; + int bytesRead; + while ((bytesRead = + await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) + { + await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); + totalBytesRead += bytesRead; + progress?.Report(totalBytesRead); + } + } + + /// + /// Extract zip to location + /// + /// The zip location + /// The target location + /// The progress that is updated as a file is processed + /// The type of progress + /// + public static async Task ExtractArchive(string zip, string folder, IProgress progress, + UnzipProgressType type) + { + Directory.CreateDirectory(folder); + using (var archive = ZipFile.OpenRead(zip)) + { + if (type == UnzipProgressType.PercentageFromNumberOfFiles) { - await Task.Delay(100); - return await ReadFromPakAsync(FileName, archFile); - } - - } - - - /// - /// Write logs to file - /// - /// The message to be wrote - public static void WriteLogFile(string LogMessage) - { - string logsPath = logFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Log.txt"; - Directory.CreateDirectory(logFolder); - File.AppendAllText(logsPath, LogMessage + " \n"); - } - - /// - /// Write error to file - /// - /// The message to be wrote - public static void WriteErrFile(string ErrMessage) - { - string errPath = errFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Error.txt"; - Directory.CreateDirectory(errFolder); - File.AppendAllText(errPath, ErrMessage + " \n"); - } - - public static void WriteErrFile(this Exception ex) - { - WriteErrFile(ex.ToString()); - } - - /// - /// Merge one array of strings into one string - /// - /// The array of strings - /// The index from where the merge should start (included) - /// A string built based on the array - public static string MergeStrings(this string[] s, int indexToStart) - { - return string.Join(' ', s, indexToStart, s.Length - 1); - - /* string r = ""; - - int len = s.Length; - if (len <= indexToStart) return ""; - for (int i = indexToStart; i < len - 1; ++i) - { - r += s[i] + " "; - } - - r += s[len - 1]; - - return r; - */ - } - - /// - /// Get the Operating system you are runnin on - /// - /// An Operating system - public static OperatingSystem GetOperatingSystem() - { - if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)) return OperatingSystem.WINDOWS; - if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Linux)) return OperatingSystem.LINUX; - if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.OSX)) return OperatingSystem.MAC_OS; - return OperatingSystem.UNKNOWN; - } - - public static List GetArguments(SocketMessage message) - { - Command command = new Command(message); - return command.Arguments; - } - - /// - /// Copy one Stream to another - /// - /// The base stream - /// The destination stream - /// The buffer to read - /// The progress - /// The cancellation token - /// Triggered if any is empty - /// Triggered if is less then or equal to 0 - /// Triggered if is not readable - /// Triggered in is not writable - public static async Task CopyToOtherStreamAsync(this Stream stream, Stream destination, int bufferSize, IProgress? progress = null, CancellationToken cancellationToken = default) - { - if (stream == null) throw new ArgumentNullException(nameof(stream)); - if (destination == null) throw new ArgumentNullException(nameof(destination)); - if (bufferSize <= 0) throw new ArgumentOutOfRangeException(nameof(bufferSize)); - if (!stream.CanRead) throw new InvalidOperationException("The stream is not readable."); - if (!destination.CanWrite) throw new ArgumentException("Destination stream is not writable", nameof(destination)); - - byte[] buffer = new byte[bufferSize]; - long totalBytesRead = 0; - int bytesRead; - while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) - { - await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); - totalBytesRead += bytesRead; - progress?.Report(totalBytesRead); - } - - } - - /// - /// Extract zip to location - /// - /// The zip location - /// The target location - /// The progress that is updated as a file is processed - /// The type of progress - /// - public static async Task ExtractArchive(string zip, string folder, IProgress progress, UnzipProgressType type) - { - Directory.CreateDirectory(folder); - using (ZipArchive archive = ZipFile.OpenRead(zip)) - { - if (type == UnzipProgressType.PercentageFromNumberOfFiles) + var totalZIPFiles = archive.Entries.Count(); + var currentZIPFile = 0; + foreach (var entry in archive.Entries) { - int totalZIPFiles = archive.Entries.Count(); - int currentZIPFile = 0; - foreach (ZipArchiveEntry entry in archive.Entries) - { - if (entry.FullName.EndsWith("/")) // it is a folder - Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); - - else - try - { - entry.ExtractToFile(Path.Combine(folder, entry.FullName), true); - } - catch (Exception ex) - { - Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}"); - } - - currentZIPFile++; - await Task.Delay(10); - if (progress != null) - progress.Report((float)currentZIPFile / totalZIPFiles * 100); - } - } - else if (type == UnzipProgressType.PercentageFromTotalSize) - { - ulong zipSize = 0; - - foreach (ZipArchiveEntry entry in archive.Entries) - zipSize += (ulong)entry.CompressedLength; - - ulong currentSize = 0; - foreach (ZipArchiveEntry entry in archive.Entries) - { - if (entry.FullName.EndsWith("/")) - { - Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); - continue; - } + if (entry.FullName.EndsWith("/")) // it is a folder + Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); + else try { entry.ExtractToFile(Path.Combine(folder, entry.FullName), true); - currentSize += (ulong)entry.CompressedLength; } catch (Exception ex) { Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}"); } - await Task.Delay(10); - if (progress != null) - progress.Report((float)currentSize / zipSize * 100); + currentZIPFile++; + await Task.Delay(10); + if (progress != null) + progress.Report((float)currentZIPFile / totalZIPFiles * 100); + } + } + else if (type == UnzipProgressType.PercentageFromTotalSize) + { + ulong zipSize = 0; + + foreach (var entry in archive.Entries) + zipSize += (ulong)entry.CompressedLength; + + ulong currentSize = 0; + foreach (var entry in archive.Entries) + { + if (entry.FullName.EndsWith("/")) + { + Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); + continue; } + + try + { + entry.ExtractToFile(Path.Combine(folder, entry.FullName), true); + currentSize += (ulong)entry.CompressedLength; + } + catch (Exception ex) + { + Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}"); + } + + await Task.Delay(10); + if (progress != null) + progress.Report((float)currentSize / zipSize * 100); } } } + } - /// - /// Convert Bytes to highest measurement unit possible - /// - /// The amount of bytes - /// - public static (double, string) ConvertBytes(long bytes) + /// + /// Convert Bytes to highest measurement unit possible + /// + /// The amount of bytes + /// + public static (double, string) ConvertBytes(long bytes) + { + var units = new List { - List units = new List() - { - "B", - "KB", - "MB", - "GB", - "TB" - }; - int i = 0; - while (bytes >= 1024) - { - i++; - bytes /= 1024; - } - - return (bytes, units[i]); + "B", + "KB", + "MB", + "GB", + "TB" + }; + var i = 0; + while (bytes >= 1024) + { + i++; + bytes /= 1024; } - /// - /// Save to JSON file - /// - /// The class type - /// The file path - /// The values - /// - public static async Task SaveToJsonFile(string file, T Data) + return (bytes, units[i]); + } + + /// + /// Save to JSON file + /// + /// The class type + /// The file path + /// The values + /// + public static async Task SaveToJsonFile(string file, T Data) + { + var str = new MemoryStream(); + await JsonSerializer.SerializeAsync(str, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true }); + await File.WriteAllBytesAsync(file, str.ToArray()); + } + + /// + /// 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; + if (File.Exists(input)) + text = new MemoryStream(await File.ReadAllBytesAsync(input)); + else + text = new MemoryStream(Encoding.ASCII.GetBytes(input)); + text.Position = 0; + var obj = await JsonSerializer.DeserializeAsync(text); + text.Close(); + return (obj ?? default)!; + } + + /// + /// Check if all words from are in
+ /// This function returns true if
+ /// 1. The is part of
+ /// 2. The words (split by a space) of are located (separately) in + ///
+ /// + /// The following example will return
+ /// STRContains("Hello World !", "I type word Hello and then i typed word World !")
+ /// The following example will return
+ /// STRContains("Hello World !", "I typed Hello World !"
+ /// The following example will return
+ /// STRContains("Hello World", "I type World then Hello")
+ /// The following example will return
+ /// STRContains("Hello World !", "I typed Hello World")
+ ///
+ ///
+ /// The string you are checking + /// The main string that should contain + /// + public static bool STRContains(this string str, string baseString) + { + if (baseString.Contains(str)) return true; + var array = str.Split(' '); + foreach (var s in array) + if (!baseString.Contains(s)) + return false; + return true; + } + + public static bool TryReadValueFromJson(string input, string codeName, out JsonElement element) + { + Stream text; + if (File.Exists(input)) + text = File.OpenRead(input); + + else + text = new MemoryStream(Encoding.ASCII.GetBytes(input)); + + var jsonObject = JsonDocument.Parse(text); + + var data = jsonObject.RootElement.TryGetProperty(codeName, out element); + return data; + } + + public static string CreateMD5(string input) + { + using (var md5 = MD5.Create()) { - MemoryStream str = new MemoryStream(); - await JsonSerializer.SerializeAsync(str, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true }); - await File.WriteAllBytesAsync(file, str.ToArray()); - } - - /// - /// 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; - if (File.Exists(input)) - text = new MemoryStream(await File.ReadAllBytesAsync(input)); - else - text = new MemoryStream(Encoding.ASCII.GetBytes(input)); - text.Position = 0; - var obj = await JsonSerializer.DeserializeAsync(text); - text.Close(); - return (obj ?? default)!; - } - - /// - /// Check if all words from are in
- /// This function returns true if
- /// 1. The is part of
- /// 2. The words (split by a space) of are located (separately) in
- /// - /// The following example will return
- /// STRContains("Hello World !", "I type word Hello and then i typed word World !")
- /// The following example will return
- /// STRContains("Hello World !", "I typed Hello World !"
- /// The following example will return
- /// STRContains("Hello World", "I type World then Hello")
- /// The following example will return
- /// STRContains("Hello World !", "I typed Hello World")
- ///
- ///
- /// The string you are checking - /// The main string that should contain - /// - public static bool STRContains(this string str, string baseString) - { - if (baseString.Contains(str)) return true; - string[] array = str.Split(' '); - foreach (var s in array) - if (!baseString.Contains(s)) - return false; - return true; - } - - public static bool TryReadValueFromJson(string input, string codeName, out JsonElement element) - { - Stream text; - if (File.Exists(input)) - text = File.OpenRead(input); - - else - text = new MemoryStream(Encoding.ASCII.GetBytes(input)); - - var jsonObject = JsonDocument.Parse(text); - - var data = jsonObject.RootElement.TryGetProperty(codeName, out element); - return data; - } - - public static string CreateMD5(string input) - { - using (MD5 md5 = MD5.Create()) - { - byte[] inputBytes = Encoding.ASCII.GetBytes(input); - byte[] hashBytes = md5.ComputeHash(inputBytes); - return Convert.ToHexString(hashBytes); - } + var inputBytes = Encoding.ASCII.GetBytes(input); + var hashBytes = md5.ComputeHash(inputBytes); + return Convert.ToHexString(hashBytes); } } -} +} \ No newline at end of file diff --git a/PluginManager/Others/Permissions/DiscordPermissions.cs b/PluginManager/Others/Permissions/DiscordPermissions.cs index e8fae3b..5bca6dd 100644 --- a/PluginManager/Others/Permissions/DiscordPermissions.cs +++ b/PluginManager/Others/Permissions/DiscordPermissions.cs @@ -61,4 +61,4 @@ public static class DiscordPermissions { return isAdmin((SocketGuildUser)user); } -} +} \ No newline at end of file