From f3be67b13201207e0a371d2b8f97bd42945baf7f Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 5 May 2022 21:52:51 +0300 Subject: [PATCH 1/8] Create README.md --- README.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..664fc1e --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# DiscordBotWithAPI + +Plugin Types: +1. Commands +2. Events + + +## How to create a plugin +1. Commands
+First of all, Create a new project (class library) in Visual Studio. +![Imgur Image](https://i.imgur.com/KUqzKsB.png) +![Imgur Image](https://i.imgur.com/JzpEViR.png) +![Imgur Image](https://i.imgur.com/vtoEepX.png) +![Imgur Image](https://i.imgur.com/ceaVR2R.png) +![Imgur Image](https://i.imgur.com/UMSitk4.png) +![Imgur Image](https://i.imgur.com/GEjShdl.png) +Here is an example of class that is a command class +```cs +using Discord.Commands; +using Discord.WebSocket; + +using PluginManager.Interfaces; + +namespace CMD_Utils +{ + class FlipCoin : DBCommand + { + public string Command => "flip"; + + public string Description => "Flip a coin"; + + public string Usage => "flip"; + + public bool canUseDM => true; + + public bool canUseServer => true; + + public bool requireAdmin => false; + + public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) + { + System.Random random = new System.Random(); + int r = random.Next(1, 3); + if (r == 1) + await message.Channel.SendMessageAsync("Heads"); + else await message.Channel.SendMessageAsync("Tails"); + } + } +} + +``` +####Definitions: +- Command - The keyword that triggers the execution for the command. This is what players must type in order to execute your command +- Description - The description of your command. Can be anything you like +- Usage - The usage of your command. This is what `help [Command]` command will display +- canUseDM - true if you plan to let users execute this command in DM chat with bot +- canUseServer - true if you plan to let the users execute this command in a server chat +- requireAdmin - true if this command requres an user with Administrator permission in the server +- Execute () - the function of your command. + - context - the command context + - message - the message itself + - client - the discord bot client + - isDM - true if the message was sent from DM chat + +From here on, start coding. When your plugin is done, build it as any DLL project then add it to the following path +`{bot_executable}/Data/Plugins/Commands//yourDLLName.dll` +Then, reload bot and execute command `lp` in bot's console. The plugin should be loaded into memory or an error is thrown if not. If an error is thrown, then +there is something wrong in your command's code. + +2. Events From d58202407d8a643ebe11b6ab60b28f0469248b86 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 5 May 2022 21:53:36 +0300 Subject: [PATCH 2/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 664fc1e..84b936d 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ namespace CMD_Utils } ``` -####Definitions: +#### Definitions: - Command - The keyword that triggers the execution for the command. This is what players must type in order to execute your command - Description - The description of your command. Can be anything you like - Usage - The usage of your command. This is what `help [Command]` command will display From 1a39eaf102a8f82296a4ae651501a583add406f8 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 5 May 2022 22:14:00 +0300 Subject: [PATCH 3/8] Update README.md --- README.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 84b936d..07dbb1c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,20 @@ # DiscordBotWithAPI +This is a Discord Bot made with C# that accepts plugins as extensions for more commands and events. All basic commands are built in already in the PluginManager class library. +This project is based on .NET 6 (C#) and [Discord.Net](https://github.com/discord-net/Discord.Net) + + +## Plugins +#### Requirements: +- [Visual Studio](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false) +- .NET 6 (downloaded with Visual Studio) Plugin Types: 1. Commands 2. Events -## How to create a plugin -1. Commands
+### How to create a plugin + First of all, Create a new project (class library) in Visual Studio. ![Imgur Image](https://i.imgur.com/KUqzKsB.png) ![Imgur Image](https://i.imgur.com/JzpEViR.png) @@ -14,6 +22,10 @@ First of all, Create a new project (class library) in Visual Studio. ![Imgur Image](https://i.imgur.com/ceaVR2R.png) ![Imgur Image](https://i.imgur.com/UMSitk4.png) ![Imgur Image](https://i.imgur.com/GEjShdl.png) + +1. Commands +Commands are loaded when all plugins are loaded into memory. When an user executes the command, only then the Execute function is called. +Commands are plugins that allow users to interact with them. Here is an example of class that is a command class ```cs using Discord.Commands; @@ -49,7 +61,7 @@ namespace CMD_Utils } ``` -#### Definitions: +#### Code description: - Command - The keyword that triggers the execution for the command. This is what players must type in order to execute your command - Description - The description of your command. Can be anything you like - Usage - The usage of your command. This is what `help [Command]` command will display @@ -68,3 +80,35 @@ Then, reload bot and execute command `lp` in bot's console. The plugin should be there is something wrong in your command's code. 2. Events + +Events are loaded when all plugins are loaded. At the moment when they are loaded, the Start function is called. +Events are used if you want the bot to do something when something happens in server. The following example shows you how to catch when a user joins the server +and send to that user a DM message with `Welcome to server !`. + +```cs +using PluginManager.Others; +using PluginManager.Interfaces; + +public class OnUserJoin : DBEvent +{ + public string name => "MyEvent"; + + public string description => "This is a demo event"; + + public async void Start(Discord.WebSocket.DiscordSocketClient client) + { + Console.WriteLine($"Hello World from {name}"); + + client.UserJoined += async (user) => { + await (await user.CreateDMChannelAsync()).SendMessageAsync("Welcome to server !"); + }; + } +} +``` + +#### Code description: +- name - The name of your event. It will appear in console when it loads +- description - The description of your event +- Start() - The main body of your event. This is executed when the bot loads all plugins + - client - the discord bot client + From 9621db147d62251b3fbabe1f2d288e4b6882965a Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 5 May 2022 22:14:32 +0300 Subject: [PATCH 4/8] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 07dbb1c..907e7a3 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ This project is based on .NET 6 (C#) and [Discord.Net](https://github.com/discor #### Requirements: - [Visual Studio](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false) - .NET 6 (downloaded with Visual Studio) + Plugin Types: 1. Commands 2. Events From d811de105934f31aeccd5db7d5cb613b4729de51 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 5 May 2022 22:17:49 +0300 Subject: [PATCH 5/8] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 907e7a3..ca40c15 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,19 @@ Plugin Types: First of all, Create a new project (class library) in Visual Studio. ![Imgur Image](https://i.imgur.com/KUqzKsB.png) + ![Imgur Image](https://i.imgur.com/JzpEViR.png) + ![Imgur Image](https://i.imgur.com/vtoEepX.png) + ![Imgur Image](https://i.imgur.com/ceaVR2R.png) + +Now, let's add the PluginManager reference. It can be found inside the bot's main folder under +`DiscordBot/bin/Debug/net6.0/PluginManager.dll` or `PluginManager/bin/Debug/net6.0/PluginManager.dll` +after one successfull build. + ![Imgur Image](https://i.imgur.com/UMSitk4.png) + ![Imgur Image](https://i.imgur.com/GEjShdl.png) 1. Commands From e5704a15a5d3c35e90f144af487a82f6a6c6e04e Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 5 May 2022 22:18:33 +0300 Subject: [PATCH 6/8] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ca40c15..206fab4 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ after one successfull build. ![Imgur Image](https://i.imgur.com/GEjShdl.png) 1. Commands + Commands are loaded when all plugins are loaded into memory. When an user executes the command, only then the Execute function is called. Commands are plugins that allow users to interact with them. Here is an example of class that is a command class From d2c1cdab771bcfc2aa0b8c15c048ae6057bd174a Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 5 May 2022 22:21:03 +0300 Subject: [PATCH 7/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 206fab4..45ad2e1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# DiscordBotWithAPI +# Seth Discord Bot This is a Discord Bot made with C# that accepts plugins as extensions for more commands and events. All basic commands are built in already in the PluginManager class library. This project is based on .NET 6 (C#) and [Discord.Net](https://github.com/discord-net/Discord.Net) From 7fcdf7db560d5956d12c65eb4e9f9fe7c69dd01f Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Fri, 6 May 2022 08:57:37 +0300 Subject: [PATCH 8/8] --- BUILDS/net6.0/PluginManager.dll | Bin 43008 -> 45056 bytes DiscordBot/Program.cs | 11 ++++---- PluginManager/Loaders/PluginLoader.cs | 6 ++++- PluginManager/Online/LanguageManager.cs | 5 ---- PluginManager/Online/PluginsManager.cs | 2 +- PluginManager/Online/ServerCom.cs | 30 +++------------------- PluginManager/Others/Console Utilities.cs | 2 -- 7 files changed, 16 insertions(+), 40 deletions(-) diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index b790e5f32037c60e9485f7913ac03c3583d7c057..97cc8133d77aee2a20e3a7d49f62a3d772854caa 100644 GIT binary patch literal 45056 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 literal 43008 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 diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 92902d4..dad195a 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -9,11 +9,10 @@ using PluginManager.Others; using PluginManager.Loaders; using PluginManager.LanguageSystem; using PluginManager.Online; + using System.Diagnostics; using System.Collections.Generic; using System.Linq; -using System.Threading; - namespace DiscordBot { public class Program @@ -37,7 +36,7 @@ namespace DiscordBot Directory.CreateDirectory("./Data/Languages"); Directory.CreateDirectory("./Data/Plugins/Commands"); Directory.CreateDirectory("./Data/Plugins/Events"); - if (!File.Exists("./Data/Resources/DiscordBotCore.data") || Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_TOKEN", '=')!.Length != 59) + 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"); while (true) @@ -45,7 +44,7 @@ namespace DiscordBot Console.WriteLine("Please insert your token: "); Console.Write("TOKEN: "); string botToken = Console.ReadLine(); - if (botToken.Length == 59) + if (botToken.Length == 59 || botToken.Length == 70) { string prefix = Functions.readCodeFromFile("./Data/Resources/DiscordBotCore.data", "BOT_PREFIX", '='); if (prefix == string.Empty || prefix == null) @@ -96,7 +95,9 @@ namespace DiscordBot Console_Utilities.WriteColorText("&mConsole > &c", false); string[] data = Console.ReadLine().Split(' '); - if (data[0].Length < 2) continue; + if (data[0].Length < 2) + continue; // The input command is less then 2 characters long + switch (data[0]) { case "shutdown": diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index 3f6ed97..36a192a 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -61,7 +61,11 @@ namespace PluginManager.Loaders Functions.WriteLogFile("Starting plugin loader..."); if (LanguageSystem.Language.ActiveLanguage != null) - Console_Utilities.WriteColorText(LanguageSystem.Language.ActiveLanguage.FormatText(LanguageSystem.Language.ActiveLanguage.LanguageWords["PLUGIN_LOADING_START"])); + Console_Utilities.WriteColorText( + LanguageSystem.Language.ActiveLanguage.FormatText( + LanguageSystem.Language.ActiveLanguage.LanguageWords["PLUGIN_LOADING_START"] + ) + ); //Load commands CommandsLoader CMDLoader = new CommandsLoader(pluginCMDFolder, pluginCMDExtension); diff --git a/PluginManager/Online/LanguageManager.cs b/PluginManager/Online/LanguageManager.cs index 71eacdd..408315c 100644 --- a/PluginManager/Online/LanguageManager.cs +++ b/PluginManager/Online/LanguageManager.cs @@ -27,11 +27,6 @@ namespace PluginManager.Online try { - /*#pragma warning disable SYSLIB0014 - WebClient client = new WebClient(); - #pragma warning restore SYSLIB0014 - Stream data = await client.OpenReadTaskAsync(link); - string[] lines = (await new StreamReader(data).ReadToEndAsync()).Split('\n');*/ List list = await ServerCom.ReadTextFromFile(link); string[] lines = list.ToArray(); diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index 1de837e..344d3fd 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -63,7 +63,7 @@ namespace PluginManager.Online continue; } } - else if (op == PluginManager.Others.OperatingSystem.LINUX) + else if (op == Others.OperatingSystem.LINUX) { if (content[4].Contains("Linux")) { diff --git a/PluginManager/Online/ServerCom.cs b/PluginManager/Online/ServerCom.cs index d53e833..edd7e58 100644 --- a/PluginManager/Online/ServerCom.cs +++ b/PluginManager/Online/ServerCom.cs @@ -57,11 +57,8 @@ namespace PluginManager.Online bool isDownloading = true; int c_progress = 0; - long secondsPast = 0; - long m_dwBytes = 0; - double c_downloadSpeed = 0f; - string c_downloadUnit = "MB"; - + //long m_dwBytes = 0; + Others.Console_Utilities.ProgressBar pbar = new Others.Console_Utilities.ProgressBar(100, ""); IProgress progress = new Progress(percent => @@ -71,39 +68,20 @@ namespace PluginManager.Online IProgress progress_downloaded = new Progress(downloadedBytes => { - m_dwBytes = downloadedBytes; + //m_dwBytes = downloadedBytes; }); Task updateProgressBarTask = new Task(async () => { while (isDownloading) { - //pbar.Update(c_progress, c_downloadSpeed, c_downloadUnit); pbar.Update(c_progress); if (c_progress == 100) break; System.Threading.Thread.Sleep(500); } }); - - Task calculateDownloadSpeed = new Task(async () => - { - - while (isDownloading) - { - secondsPast++; - c_downloadSpeed = m_dwBytes / secondsPast; - - c_downloadSpeed /= 1024; // in KB - c_downloadSpeed /= 1024; // in MB - - c_downloadSpeed = Math.Round(c_downloadSpeed, 2, MidpointRounding.AwayFromZero); - - System.Threading.Thread.Sleep(1000); - } - }); - - // new System.Threading.Thread(calculateDownloadSpeed.Start).Start(); + new System.Threading.Thread(updateProgressBarTask.Start).Start(); await DownloadFileAsync(URL, location, progress, progress_downloaded); diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index 8c0f230..80e3330 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -96,7 +96,6 @@ namespace PluginManager.Others foreach (string[] row in data) { - //Console.Write("\t"); if (row[0][0] == tableLine) Console.Write(tableCross); else Console.Write(tableWall); for (int l = 0; l < row.Length; l++) @@ -135,7 +134,6 @@ namespace PluginManager.Others /// /// Write the text using color options( &g-green; &b-blue; &r-red; &c-clear; ) - /// /// /// The text public static void WriteColorText(string text, bool appendNewLine = true)