From 0d524cdf65d73ec28663ee205ec35ae344a8a5c0 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 2 Jun 2022 13:48:56 +0300 Subject: [PATCH] patch for UI --- .../.idea.DiscordBotWithAPI/.idea/.gitignore | 13 +++ .../.idea/avalonia.xml | 13 +++ .../.idea/encodings.xml | 4 + .../.idea/indexLayout.xml | 8 ++ .idea/.idea.DiscordBotWithAPI/.idea/vcs.xml | 6 ++ BUILDS/net6.0/EVE_LevelingSystem.dll | Bin 11776 -> 11776 bytes BUILDS/net6.0/PluginManager.dll | Bin 61952 -> 62976 bytes DiscordBot/App.config | 11 +- DiscordBot/Discord/Commands/Help.cs | 9 +- DiscordBot/Discord/Core/CommandHandler.cs | 2 +- DiscordBot/Program.cs | 69 +++++------- DiscordBotGUI/App.axaml.cs | 10 +- DiscordBotGUI/AppUpdater.axaml.cs | 56 +++++----- DiscordBotWithAPI.sln | 7 -- PluginManager/Loaders/CommandsLoader.cs | 99 ----------------- PluginManager/Loaders/EventsLoader.cs | 100 ------------------ PluginManager/Loaders/Loader.cs | 94 ++++++++++++++++ PluginManager/Loaders/PluginLoader.cs | 68 ++++++------ PluginManager/Others/Console Utilities.cs | 36 ++++--- PluginManager/Others/Functions.cs | 13 +-- PluginManager/PluginManager.csproj | 6 -- 21 files changed, 265 insertions(+), 359 deletions(-) create mode 100644 .idea/.idea.DiscordBotWithAPI/.idea/.gitignore create mode 100644 .idea/.idea.DiscordBotWithAPI/.idea/avalonia.xml create mode 100644 .idea/.idea.DiscordBotWithAPI/.idea/encodings.xml create mode 100644 .idea/.idea.DiscordBotWithAPI/.idea/indexLayout.xml create mode 100644 .idea/.idea.DiscordBotWithAPI/.idea/vcs.xml delete mode 100644 PluginManager/Loaders/CommandsLoader.cs delete mode 100644 PluginManager/Loaders/EventsLoader.cs create mode 100644 PluginManager/Loaders/Loader.cs diff --git a/.idea/.idea.DiscordBotWithAPI/.idea/.gitignore b/.idea/.idea.DiscordBotWithAPI/.idea/.gitignore new file mode 100644 index 0000000..1e2399a --- /dev/null +++ b/.idea/.idea.DiscordBotWithAPI/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/contentModel.xml +/.idea.DiscordBotWithAPI.iml +/projectSettingsUpdater.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.DiscordBotWithAPI/.idea/avalonia.xml b/.idea/.idea.DiscordBotWithAPI/.idea/avalonia.xml new file mode 100644 index 0000000..c0fdb9d --- /dev/null +++ b/.idea/.idea.DiscordBotWithAPI/.idea/avalonia.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea.DiscordBotWithAPI/.idea/encodings.xml b/.idea/.idea.DiscordBotWithAPI/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.DiscordBotWithAPI/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.DiscordBotWithAPI/.idea/indexLayout.xml b/.idea/.idea.DiscordBotWithAPI/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.DiscordBotWithAPI/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.DiscordBotWithAPI/.idea/vcs.xml b/.idea/.idea.DiscordBotWithAPI/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.DiscordBotWithAPI/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BUILDS/net6.0/EVE_LevelingSystem.dll b/BUILDS/net6.0/EVE_LevelingSystem.dll index e44346107e2f2c1203421bedc78994df8fa0da88..58c77e5e96d071e9830f8b1b8a63fdbfe13f1d1d 100644 GIT binary patch delta 238 zcmZpOX^5H7!J@HqdgsI*8AhdvE5jKtOlD+MXWin=z#ubOkx6HAB%?Z`#^grEdPbJX zj7-9;4N?pYjFTPJ%r^%xX|r()Gcputh%zv66Ov2@C84pHo3;r#)0CkzNpeyb|Y$g-JJ cjg@J#1EauZK8;_@Oe!Xu1$EvtPBdT#00Y`Qx&QzG delta 250 zcmZpOX^5H7!IGcua(QBp45QJ+mEnvJCNnasvmS9~V33)t$fPqll2M(}Vsay6J)_8E zMkZm_2~rFUjFS!3%r^%xX|r)FGcputh%zv66?so?--lGI^hU{DSXW)Ki#U=UycvfV>HU4XR0=84=5A{v^>42cXm4EYSj3txn^7QZg<5Fst2@rq&owVEWn37w*+sF3g_i?l k9uz1|zN;$DD6;vdDl5}wK8;_@OeQ9q1$EvtPBdT#05}Rjwg3PC diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 856115d475eef34cc74c0721d43092668387d9b8..484c585cfad2bab1d5678c0b02ae8e2c84a55d37 100644 GIT binary patch literal 62976 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 eM>lRG8vi8xG`$!M}B+TXi=kUW);J*ONy-Csl literal 61952 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 W_(XQF^ve(aGW6yD`|$Hp;J*P$&{(Jd diff --git a/DiscordBot/App.config b/DiscordBot/App.config index 2a5ff10..828bd34 100644 --- a/DiscordBot/App.config +++ b/DiscordBot/App.config @@ -1,4 +1,7 @@ - - - - \ No newline at end of file + + + + + + + diff --git a/DiscordBot/Discord/Commands/Help.cs b/DiscordBot/Discord/Commands/Help.cs index 67840a5..26a1c51 100644 --- a/DiscordBot/Discord/Commands/Help.cs +++ b/DiscordBot/Discord/Commands/Help.cs @@ -75,12 +75,11 @@ namespace DiscordBot.Discord.Commands string normalCommands = ""; string DMCommands = ""; - foreach (var cmd in PluginLoader.Plugins!) + foreach (var cmd in PluginLoader.Commands!) { - if (cmd.canUseDM) - DMCommands += cmd.Command + " "; + if (cmd.canUseDM) DMCommands += cmd.Command + " "; if (cmd.requireAdmin) - adminCommands += cmd.Command + " "; + adminCommands += cmd.Command + " "; else if (cmd.canUseServer) normalCommands += cmd.Command + " "; } @@ -94,7 +93,7 @@ namespace DiscordBot.Discord.Commands private EmbedBuilder GenerateHelpCommand(string command) { EmbedBuilder embedBuilder = new EmbedBuilder(); - DBCommand cmd = PluginLoader.Plugins.Find(p => p.Command == command); + DBCommand cmd = PluginLoader.Commands.Find(p => p.Command == command); if (cmd == null) return null; diff --git a/DiscordBot/Discord/Core/CommandHandler.cs b/DiscordBot/Discord/Core/CommandHandler.cs index 5ed266b..b877f79 100644 --- a/DiscordBot/Discord/Core/CommandHandler.cs +++ b/DiscordBot/Discord/Core/CommandHandler.cs @@ -80,7 +80,7 @@ namespace PluginManager.Core services: null ); - DBCommand plugin = PluginLoader.Plugins!.Where(p => p.Command == (message.Content.Split(' ')[0]).Substring(botPrefix.Length)).FirstOrDefault(); + DBCommand plugin = PluginLoader.Commands!.Where(p => p.Command == (message.Content.Split(' ')[0]).Substring(botPrefix.Length)).FirstOrDefault(); if (plugin != null) diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 9c1a719..903d078 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -1,16 +1,14 @@ using Discord; - using System; using System.IO; using System.Threading.Tasks; - using PluginManager.Core; using PluginManager.Others; using PluginManager.LanguageSystem; using PluginManager.Online; - using System.Collections.Generic; using System.Linq; +using System.Threading; using PluginManager.Items; namespace DiscordBot @@ -20,21 +18,23 @@ namespace DiscordBot private static bool loadPluginsOnStartup = false; private static bool listPluginsAtStartup = false; private static bool listLanguagAtStartup = false; - - private static bool ShowStartupMessage = true; + //private static bool ShowStartupMessage = true; /// /// The main entry point for the application. /// [STAThread] [Obsolete] - public static void Main(string[] args) { Directory.CreateDirectory("./Data/Resources"); Directory.CreateDirectory("./Data/Languages"); Directory.CreateDirectory("./Data/Plugins/Commands"); Directory.CreateDirectory("./Data/Plugins/Events"); + Directory.CreateDirectory("./Data/runtime"); + + AppDomain.CurrentDomain.AppendPrivatePath("./Data/runtime"); + if (!File.Exists("./Data/Resources/DiscordBotCore.data") || (Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", '=').Length != 59 && Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", '=').Length != 70)) { File.WriteAllText("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN=token\nBOT_PREFIX=!\n"); @@ -45,13 +45,13 @@ namespace DiscordBot string botToken = Console.ReadLine(); if (botToken.Length == 59 || botToken.Length == 70) { - string prefix = Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_PREFIX", '='); - if (prefix == string.Empty || prefix == null) - prefix = "!"; + string prefix = Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_PREFIX", '='); + if (prefix == string.Empty || prefix == null) prefix = "!"; File.WriteAllText("./Data/Resources/DiscordBotCore.data", $"BOT_TOKEN={botToken}\nBOT_PREFIX={prefix}\n"); break; } - else Console.WriteLine("Invalid Token !"); + else + Console.WriteLine("Invalid Token !"); } } @@ -72,17 +72,14 @@ namespace DiscordBot /// The main loop for the discord bot /// /// The discord booter used to start the application - private static async Task NoGUI(Boot discordbooter) + private static Task NoGUI(Boot discordbooter) { Language.LoadLanguage(); ConsoleCommandsHandler consoleCommandsHandler = new ConsoleCommandsHandler(discordbooter.client); - if (loadPluginsOnStartup) - consoleCommandsHandler.HandleCommand("lp"); - if (listPluginsAtStartup) - consoleCommandsHandler.HandleCommand("listplugs"); - if (listLanguagAtStartup) - consoleCommandsHandler.HandleCommand("listlang"); + if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp"); + if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs"); + if (listLanguagAtStartup) consoleCommandsHandler.HandleCommand("listlang"); while (true) { @@ -98,23 +95,14 @@ namespace DiscordBot /// Returns the boot loader for the Discord Bot private static async Task StartNoGUI() { - Console.Clear(); Console.ForegroundColor = ConsoleColor.DarkYellow; Console.WriteLine("Discord BOT for Cross Platform"); Console.WriteLine("Created by: Wizzy\nDiscord: Wizzy#9181"); - if (ShowStartupMessage) - try - { - Console.WriteLine("Connecting to server ..."); - List text = await ServerCom.ReadTextFromFile("https://sethdiscordbot.000webhostapp.com/Storage/Discord%20Bot/StartupMessage"); - foreach (var t in text) Console_Utilities.WriteColorText(t); - } - catch { Console.WriteLine("Failed to connect to server."); } Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("============================ Discord BOT - Cross Platform ============================"); - string token = Functions.readCodeFromFile(Functions.dataFolder + "DiscordBotCore.data", "BOT_TOKEN", '='); + string token = Functions.readCodeFromFile(Functions.dataFolder + "DiscordBotCore.data", "BOT_TOKEN", '='); string prefix = Functions.readCodeFromFile(Functions.dataFolder + "DiscordBotCore.data", "BOT_PREFIX", '='); var discordbooter = new Boot(token, prefix); @@ -128,8 +116,8 @@ namespace DiscordBot /// Directory path private static Task ClearFolder(string d) { - string[] files = Directory.GetFiles(d); - int fileNumb = files.Length; + string[] files = Directory.GetFiles(d); + int fileNumb = files.Length; for (var i = 0; i < fileNumb; i++) { File.Delete(files[i]); @@ -145,7 +133,6 @@ namespace DiscordBot /// The arguments private static async Task HandleInput(string[] args) { - if (args.Length == 0) { if (File.Exists("./ref/startupArguments.txt")) @@ -164,8 +151,12 @@ namespace DiscordBot if (len == 1 && args[0] == "--logout") { - File.Delete(Functions.dataFolder + "Login.dat"); - Console.WriteLine("Logged out. Please restart the application !"); + File.Delete(Functions.dataFolder + "DiscordBotCore.dat"); + await Task.Run(async () => + { + await Task.Delay(1000); + Environment.Exit(0x08); + }); return; } @@ -179,20 +170,14 @@ namespace DiscordBot if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage"))) { - if (args.Contains("lp") || args.Contains("loadplugins")) - loadPluginsOnStartup = true; - if (args.Contains("listplugs")) - listPluginsAtStartup = true; - if (args.Contains("listlang")) - listLanguagAtStartup = true; - if (args.Contains("--nomessage")) - ShowStartupMessage = false; + if (args.Contains("lp") || args.Contains("loadplugins")) loadPluginsOnStartup = true; + if (args.Contains("listplugs")) listPluginsAtStartup = true; + if (args.Contains("listlang")) listLanguagAtStartup = true; + //if (args.Contains("--nomessage")) ShowStartupMessage = false; len = 0; } - - if (len == 0 || args[0] != "--exec" && args[0] != "--execute") { Boot b = await StartNoGUI(); diff --git a/DiscordBotGUI/App.axaml.cs b/DiscordBotGUI/App.axaml.cs index a3b2c89..456aca5 100644 --- a/DiscordBotGUI/App.axaml.cs +++ b/DiscordBotGUI/App.axaml.cs @@ -1,6 +1,8 @@ +using System.IO; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; +using PluginManager.Others; namespace DiscordBotGUI { @@ -13,13 +15,7 @@ namespace DiscordBotGUI public override void OnFrameworkInitializationCompleted() { - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - - - desktop.MainWindow = new AppUpdater() { Width = 300, Height = 50, WindowStartupLocation = Avalonia.Controls.WindowStartupLocation.CenterScreen }; - - } + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { desktop.MainWindow = new AppUpdater() { Width = 300, Height = 50, WindowStartupLocation = Avalonia.Controls.WindowStartupLocation.CenterScreen }; } base.OnFrameworkInitializationCompleted(); } diff --git a/DiscordBotGUI/AppUpdater.axaml.cs b/DiscordBotGUI/AppUpdater.axaml.cs index ecc5405..8c4dccc 100644 --- a/DiscordBotGUI/AppUpdater.axaml.cs +++ b/DiscordBotGUI/AppUpdater.axaml.cs @@ -21,42 +21,48 @@ namespace DiscordBotGUI InitializeComponent(); if (!File.Exists("./Version.txt")) { - textBox1.Text = "Checking ..."; File.WriteAllText("./Version.txt", "DiscordBotVersion=0"); - //DownloadDiscordBotClientNoGUIAsDLL(); + DownloadDiscordBotClientNoGUIAsDLL(); } + if (!File.Exists("./DiscordBot.exe")) DownloadDiscordBotClientNoGUIAsDLL(); Updates(); } - /* private async void DownloadDiscordBotClientNoGUIAsDLL() - { + private async void DownloadDiscordBotClientNoGUIAsDLL() + { + //await Task.Delay(5000); + string url_bot_dll = "https://sethdiscordbot.000webhostapp.com/Storage/Discord%20Bot/Updates/DiscordBot.zip"; + int actiontype = 0; //0 - downolad, 1- extract + IProgress progress = new Progress((percent) => + { + if (actiontype == 0) + textBox1.Text = "Downloading DiscordBot ... " + MathF.Round(percent, 2) + "%"; + else + textBox1.Text = "Extracting package ..." + MathF.Round(percent, 2) + "%"; + this.progressBar1.Value = percent; + }); - //await Task.Delay(5000); - string url_bot_dll = "https://sethdiscordbot.000webhostapp.com/Storage/Discord%20Bot/Updates/DiscordBot.dll"; - IProgress progress = new Progress((percent) => - { - textBox1.Text = "Downloading DiscordBot.dll ... " + (percent * 100).ToString() + "%"; - this.progressBar1.Value = percent * 100; - }); + this.progressBar1.IsIndeterminate = false; + try + { + await ServerCom.DownloadFileAsync(url_bot_dll, "./DiscordBot.zip", progress); - this.progressBar1.IsIndeterminate = false; - try - { - await ServerCom.DownloadFileAsync(url_bot_dll, "./DiscordBot.dll", progress); - } - catch - { - textBox1.Text = "Error downloading DiscordBot.dll. Server is not responding."; + actiontype++; - await Task.Delay(1000); - return; - } + await Functions.ExtractArchive("./DiscordBot.zip", "./", progress); + } + catch + { + textBox1.Text = "Error downloading DiscordBot.dll. Server is not responding."; - //new MainWindow() { Height = 425, Width = 500 }.Show(); - //Close(); - }*/ + await Task.Delay(1000); + + new MainWindow() { Height = 425, Width = 500 }.Show(); + Close(); + } + } private async void Updates() { diff --git a/DiscordBotWithAPI.sln b/DiscordBotWithAPI.sln index 3f9ab41..7bf0ffe 100644 --- a/DiscordBotWithAPI.sln +++ b/DiscordBotWithAPI.sln @@ -23,8 +23,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_Utils", "CMD_Utils\CMD_ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicCommands", "MusicCommands\MusicCommands.csproj", "{B1B4976E-5112-4217-B57B-3A03C5207B6E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Games", "FreeGames\Games.csproj", "{7CC0819E-2BC0-44F0-8D92-EC442F36E1BB}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscordBotGUI", "DiscordBotGUI\DiscordBotGUI.csproj", "{7B5899F0-0218-4537-8C74-6210ED2D3690}" EndProject Global @@ -61,10 +59,6 @@ Global {B1B4976E-5112-4217-B57B-3A03C5207B6E}.Debug|Any CPU.Build.0 = Debug|Any CPU {B1B4976E-5112-4217-B57B-3A03C5207B6E}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1B4976E-5112-4217-B57B-3A03C5207B6E}.Release|Any CPU.Build.0 = Release|Any CPU - {7CC0819E-2BC0-44F0-8D92-EC442F36E1BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7CC0819E-2BC0-44F0-8D92-EC442F36E1BB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7CC0819E-2BC0-44F0-8D92-EC442F36E1BB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7CC0819E-2BC0-44F0-8D92-EC442F36E1BB}.Release|Any CPU.Build.0 = Release|Any CPU {7B5899F0-0218-4537-8C74-6210ED2D3690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7B5899F0-0218-4537-8C74-6210ED2D3690}.Debug|Any CPU.Build.0 = Debug|Any CPU {7B5899F0-0218-4537-8C74-6210ED2D3690}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -81,7 +75,6 @@ Global {CE9DBF06-38A0-4192-8B3E-4009210D040D} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012} {E26C87A4-3DD6-4B58-B14B-C8E086B852F9} = {449FA364-0B72-43FF-B3A3-806E2916200E} {B1B4976E-5112-4217-B57B-3A03C5207B6E} = {449FA364-0B72-43FF-B3A3-806E2916200E} - {7CC0819E-2BC0-44F0-8D92-EC442F36E1BB} = {449FA364-0B72-43FF-B3A3-806E2916200E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF} diff --git a/PluginManager/Loaders/CommandsLoader.cs b/PluginManager/Loaders/CommandsLoader.cs deleted file mode 100644 index 919fa6b..0000000 --- a/PluginManager/Loaders/CommandsLoader.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; - -using PluginManager.Interfaces; - -namespace PluginManager.Loaders -{ - internal class CommandsLoader - { - private readonly string CMDPath; - private readonly string CMDExtension; - - - internal delegate void onCommandLoaded(string name, bool success, DBCommand? command = null, Exception? exception = null); - internal delegate void onCommandFileLoaded(string path); - - /// - /// Event fired when a command is loaded - /// - internal onCommandLoaded? OnCommandLoaded; - - /// - /// Event fired when the file is loaded - /// - internal onCommandFileLoaded? OnCommandFileLoaded; - - /// - /// Command Loader contructor - /// - /// The path to the commands - /// The extension to search for in the - internal CommandsLoader(string CommandPath, string CommandExtension) - { - CMDPath = CommandPath; - CMDExtension = CommandExtension; - } - - /// - /// The method that loads all commands - /// - /// - internal List? LoadCommands() - { - if (!Directory.Exists(CMDPath)) - { - Directory.CreateDirectory(CMDPath); - return null; - } - string[] files = Directory.GetFiles(CMDPath, $"*{CMDExtension}", SearchOption.AllDirectories); - - foreach (var file in files) - { - Assembly.LoadFile(Path.GetFullPath(file)); - if (OnCommandFileLoaded != null) - OnCommandFileLoaded.Invoke(file); - } - - List plugins = new List(); - - try - { - Type interfaceType = typeof(DBCommand); - Type[] types = AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(a => a.GetTypes()) - .Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass) - .ToArray(); - foreach (Type type in types) - { - try - { - DBCommand plugin = (DBCommand)Activator.CreateInstance(type)!; - plugins.Add(plugin); - - if (OnCommandLoaded != null) - OnCommandLoaded.Invoke(type.FullName!, true, plugin); - } - catch (Exception e) - { - if (OnCommandLoaded != null) - OnCommandLoaded.Invoke(type.FullName!, false, null, e); - } - - } - - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - return null; - } - - return plugins; - - } - } -} diff --git a/PluginManager/Loaders/EventsLoader.cs b/PluginManager/Loaders/EventsLoader.cs deleted file mode 100644 index 28c1766..0000000 --- a/PluginManager/Loaders/EventsLoader.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; - -using PluginManager.Interfaces; - -namespace PluginManager.Loaders -{ - internal class EventsLoader - { - - private readonly string EVPath; - private readonly string EVExtension; - - internal delegate void onEventLoad(string name, bool success, DBEvent? ev = null, Exception? e = null); - internal delegate void onEventFileLoaded(string path); - - /// - /// An event that is fired whenever a event is loaded in memory - /// - internal onEventLoad? EventLoad; - - /// - /// An event that is fired whenever a event file is loaded - /// - internal onEventFileLoaded? EventFileLoaded; - - /// - /// The Event Loader constructor - /// - /// The path to all events - /// The extension for events - internal EventsLoader(string path, string ext) - { - EVPath = path; - EVExtension = ext; - } - - /// - /// The method that loads all events - /// - /// - internal List? LoadEvents() - { - - if (!Directory.Exists(EVPath)) - { - Directory.CreateDirectory(EVPath); - return null; - } - - string[] files = Directory.GetFiles(EVPath, $"*{EVExtension}", SearchOption.AllDirectories); - - foreach (var file in files) - { - Assembly.LoadFile(Path.GetFullPath(file)); - if (EventFileLoaded != null) - EventFileLoaded.Invoke(file); - } - - List events = new List(); - - try - { - Type interfaceType = typeof(DBEvent); - Type[] types = AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(a => a.GetTypes()) - .Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass) - .ToArray(); - foreach (Type type in types) - { - try - { - DBEvent ev = (DBEvent)Activator.CreateInstance(type)!; - events.Add(ev); - - if (EventLoad != null) - EventLoad.Invoke(type.FullName!, true, ev, null); - } - catch (Exception e) - { - if (EventLoad != null) - EventLoad.Invoke(type.FullName!, false, null, e); - } - - } - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - return null; - } - - return events; - - } - } -} \ No newline at end of file diff --git a/PluginManager/Loaders/Loader.cs b/PluginManager/Loaders/Loader.cs new file mode 100644 index 0000000..955bc9f --- /dev/null +++ b/PluginManager/Loaders/Loader.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using PluginManager.Interfaces; +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 class Loader + { + internal delegate void FileLoadedEventHandler(LoaderArgs args); + + internal event FileLoadedEventHandler? FileLoaded; + + internal delegate void PluginLoadedEventHandler(LoaderArgs args); + + internal event PluginLoadedEventHandler? PluginLoaded; + + + private string path { get; } + private string extension { get; } + + + internal Loader(string path, string extension) + { + this.path = path; + this.extension = extension; + } + + internal List? Load() + { + List list = new List(); + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + return null; + } + + string[] files = Directory.GetFiles(path, $"*.{extension}", SearchOption.AllDirectories); + foreach (var file in files) + { + Assembly.LoadFrom(file); + if (FileLoaded != null) + { + LoaderArgs args = new LoaderArgs() { Exception = null, TypeName = nameof(T), IsLoaded = false, PluginName = file, Plugin = null }; + FileLoaded.Invoke(args); + } + } + + try + { + Type interfaceType = typeof(T); + Type[] types = AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(a => a.GetTypes()) + .Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass) + .ToArray(); + + + list.Clear(); + foreach (Type type in types) + { + try + { + T plugin = (T)(Activator.CreateInstance(type)!); + list.Add(plugin); + + + if (PluginLoaded != null) { PluginLoaded.Invoke(new() { Exception = null, IsLoaded = true, PluginName = type.FullName, TypeName = nameof(T), Plugin = plugin }); } + } + catch (Exception ex) + { + if (PluginLoaded != null) { PluginLoaded.Invoke(new() { Exception = ex, IsLoaded = false, PluginName = type.FullName, TypeName = nameof(T) }); } + } + } + } + catch (Exception ex) { Functions.WriteErrFile(ex.ToString()); } + + + return list; + } + } +} diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index 520112d..813ba1b 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -1,35 +1,32 @@ using Discord.WebSocket; - using PluginManager.Interfaces; using PluginManager.Others; - using System; using System.Collections.Generic; + namespace PluginManager.Loaders { public class PluginLoader { - private DiscordSocketClient client; + private readonly DiscordSocketClient _client; /// /// The Plugin Loader constructor /// /// The discord bot client where the plugins will pe attached to - public PluginLoader(DiscordSocketClient discordSocketClient) - { - this.client = discordSocketClient; - } + public PluginLoader(DiscordSocketClient discordSocketClient) { this._client = discordSocketClient; } private const string pluginCMDFolder = @"./Data/Plugins/Commands/"; private const string pluginEVEFolder = @"./Data/Plugins/Events/"; - private const string pluginCMDExtension = ".dll"; - private const string pluginEVEExtension = ".dll"; + private const string pluginCMDExtension = "dll"; + private const string pluginEVEExtension = "dll"; + /// /// A list of commands /// - public static List? Plugins { get; set; } + public static List? Commands { get; set; } /// /// A list of commands @@ -38,6 +35,7 @@ namespace PluginManager.Loaders public delegate void CMDLoaded(string name, string typeName, bool success, Exception? e = null); + public delegate void EVELoaded(string name, string typeName, bool success, Exception? e = null); /// @@ -55,11 +53,10 @@ namespace PluginManager.Loaders /// public void LoadPlugins() { + Commands = new List(); + Events = new List(); - Plugins = new List(); - Events = new List(); - - Functions.WriteLogFile("Starting plugin loader ... Client: " + client.CurrentUser.Username); + Functions.WriteLogFile("Starting plugin loader ... Client: " + _client.CurrentUser.Username); if (LanguageSystem.Language.ActiveLanguage != null) Console_Utilities.WriteColorText( LanguageSystem.Language.ActiveLanguage.FormatText( @@ -67,45 +64,40 @@ namespace PluginManager.Loaders ) ); - //Load commands - CommandsLoader CMDLoader = new CommandsLoader(pluginCMDFolder, pluginCMDExtension); - CMDLoader.OnCommandLoaded += OnCommandLoaded!; - CMDLoader.OnCommandFileLoaded += OnCommandFileLoaded; - Plugins = CMDLoader.LoadCommands(); + Loader commandsLoader = new Loader(pluginCMDFolder, pluginCMDExtension); + Loader eventsLoader = new Loader(pluginEVEFolder, pluginEVEExtension); - //Load Events - EventsLoader EVLoader = new EventsLoader(pluginEVEFolder, pluginEVEExtension); - EVLoader.EventLoad += OnEventLoaded!; - EVLoader.EventFileLoaded += EventFileLoaded; - Events = EVLoader.LoadEvents(); + commandsLoader.FileLoaded += OnCommandFileLoaded; + commandsLoader.PluginLoaded += OnCommandLoaded; + eventsLoader.FileLoaded += EventFileLoaded; + eventsLoader.PluginLoaded += OnEventLoaded; + + Commands = commandsLoader.Load(); + Events = eventsLoader.Load(); } - private void EventFileLoaded(string path) + private void EventFileLoaded(LoaderArgs e) { - if (path != null) - Functions.WriteLogFile($"[EVENT] Event from file [{path}] has been successfully created !"); + if (e.IsLoaded) Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !"); } - private void OnCommandFileLoaded(string path) + private void OnCommandFileLoaded(LoaderArgs e) { - if (path != null) - Functions.WriteLogFile($"[CMD] Command from file [{path}] has been successfully loaded !"); + if (e.IsLoaded) Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !"); } - private void OnEventLoaded(string typename, bool success, DBEvent eve, Exception exception) + private void OnEventLoaded(LoaderArgs e) { - if (eve != null && success) - eve.Start(client); - if (onEVELoad != null) - onEVELoad.Invoke(eve!.name, typename, success, exception); + if (e.IsLoaded) { ((DBEvent)e.Plugin!).Start(_client); } + + if (onEVELoad != null) onEVELoad.Invoke(((DBEvent)e.Plugin!).name, e.TypeName!, e.IsLoaded, e.Exception); } - private void OnCommandLoaded(string name, bool success, DBCommand command, Exception exception) + private void OnCommandLoaded(LoaderArgs e) { - if (onCMDLoad != null) - onCMDLoad.Invoke(command.Command, name, success, exception); + if (onCMDLoad != null) onCMDLoad.Invoke(((DBCommand)e.Plugin!).Command, e.TypeName!, e.IsLoaded, e.Exception); } } } diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index 1cdf29a..cf710d8 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -1,9 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; namespace PluginManager.Others { @@ -14,17 +10,20 @@ namespace PluginManager.Others /// public class ProgressBar { - public int Progress { get; set; } - public int Max { get; set; } - public string Message { get; set; } + public int Max { get; set; } + public string Message { get; set; } + public ConsoleColor Color { get; init; } + public ProgressBar(int max, string message) { - Max = max; + Max = max; Message = message; + var consoleColors = Enum.GetValues(typeof(ConsoleColor)); + while ((Color = (ConsoleColor)consoleColors.GetValue(new Random().Next(consoleColors.Length))!) == ConsoleColor.White && Color != ConsoleColor.Black) ; } - public async void Update(int progress, double speed = -1, string? unit = null) + public void Update(int progress, double speed = -1, string? unit = null) { //progress bar @@ -39,8 +38,8 @@ namespace PluginManager.Others for (int i = 0; i < onechunk * progress; i++) { - Console.BackgroundColor = ConsoleColor.Green; - Console.CursorLeft = position++; + Console.BackgroundColor = this.Color; + Console.CursorLeft = position++; Console.Write(" "); } @@ -130,11 +129,12 @@ namespace PluginManager.Others ConsoleColor fg = Console.ForegroundColor; Dictionary colors = new Dictionary() { - {"&g", ConsoleColor.Green }, - {"&b", ConsoleColor.Blue }, - {"&r", ConsoleColor.Red }, - {"&m", ConsoleColor.Magenta }, - {"&c", fg } + { "&g", ConsoleColor.Green }, + { "&b", ConsoleColor.Blue }, + { "&r", ConsoleColor.Red }, + { "&m", ConsoleColor.Magenta }, + { "&y", ConsoleColor.Yellow }, + { "&c", fg } }; foreach (string word in words) { @@ -145,7 +145,9 @@ namespace PluginManager.Others Console.ForegroundColor = colors[prefix]; } - string m = word.Replace("&g", "").Replace("&b", "").Replace("&r", "").Replace("&c", "").Replace("&m", ""); + string m = word; + foreach (var key in colors.Keys) { m = m.Replace(key, ""); } + Console.Write(m + " "); } if (appendNewLine) diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 9e8091b..a87d603 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -259,16 +259,13 @@ namespace PluginManager.Others foreach (ZipArchiveEntry entry in archive.Entries) { if (entry.FullName.EndsWith("/")) - { - currentZIPFile++; Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); - } - else - { - entry.ExtractToFile(Path.Combine(folder, entry.FullName), true); - currentZIPFile++; - } + else + try { entry.ExtractToFile(Path.Combine(folder, entry.FullName), true); } + catch { } + + currentZIPFile++; await Task.Delay(10); progress.Report((float)currentZIPFile / totalZIPFiles * 100); } diff --git a/PluginManager/PluginManager.csproj b/PluginManager/PluginManager.csproj index 7d2d32a..7eafd1b 100644 --- a/PluginManager/PluginManager.csproj +++ b/PluginManager/PluginManager.csproj @@ -19,10 +19,4 @@ - - - MSBuild:Compile - - -