From 1f1983480a66eab056f4b3b57f1b4ac82a3a03f5 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Tue, 16 Aug 2022 16:14:25 +0300 Subject: [PATCH] --- .idea/.idea.SethDiscordBot/.idea/.gitignore | 13 ++++++ .idea/.idea.SethDiscordBot/.idea/.name | 1 + .../.idea.SethDiscordBot/.idea/encodings.xml | 4 ++ .../.idea/indexLayout.xml | 8 ++++ .idea/.idea.SethDiscordBot/.idea/vcs.xml | 6 +++ BUILDS/net6.0/CMD_Utils.dll | Bin 11776 -> 11776 bytes BUILDS/net6.0/Music Commands.dll | Bin 16896 -> 17408 bytes BUILDS/net6.0/PluginManager.dll | Bin 62464 -> 61440 bytes CMD_LevelingSystem/Level.cs | 2 + CMD_Utils/Echo.cs | 3 ++ CMD_Utils/FlipCoin.cs | 3 ++ CMD_Utils/Poll.cs | 2 + CMD_Utils/Random.cs | 5 +- DiscordBot/Discord/Commands/Help.cs | 29 ++++++++---- DiscordBot/Discord/Commands/Restart.cs | 3 ++ DiscordBot/Discord/Commands/Settings.cs | 3 ++ DiscordBot/Discord/Core/Boot.cs | 4 +- DiscordBot/Discord/Core/CommandHandler.cs | 20 ++++---- DiscordBot/DiscordBot.csproj | 2 +- DiscordBot/Program.cs | 44 ++++++++++++++++-- MusicCommands/Leave.cs | 5 +- MusicCommands/MusicPlayer.cs | 8 ++-- MusicCommands/Pause.cs | 5 +- MusicCommands/Play.cs | 14 +++--- MusicCommands/Skip.cs | 11 +++++ MusicCommands/queue.cs | 3 +- PluginManager/Config.cs | 6 +-- PluginManager/Interfaces/DBCommand.cs | 13 ++++-- PluginManager/Items/Command.cs | 8 ++-- PluginManager/Items/ConsoleCommandsHandler.cs | 10 ++-- PluginManager/Others/Functions.cs | 18 +++---- SethDiscordBot.sln | 7 +++ 32 files changed, 195 insertions(+), 65 deletions(-) create mode 100644 .idea/.idea.SethDiscordBot/.idea/.gitignore create mode 100644 .idea/.idea.SethDiscordBot/.idea/.name create mode 100644 .idea/.idea.SethDiscordBot/.idea/encodings.xml create mode 100644 .idea/.idea.SethDiscordBot/.idea/indexLayout.xml create mode 100644 .idea/.idea.SethDiscordBot/.idea/vcs.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/.gitignore b/.idea/.idea.SethDiscordBot/.idea/.gitignore new file mode 100644 index 0000000..7fa1cfe --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/projectSettingsUpdater.xml +/contentModel.xml +/.idea.SethDiscordBot.iml +/modules.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/.name b/.idea/.idea.SethDiscordBot/.idea/.name new file mode 100644 index 0000000..ac07819 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/.name @@ -0,0 +1 @@ +SethDiscordBot \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/encodings.xml b/.idea/.idea.SethDiscordBot/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/vcs.xml b/.idea/.idea.SethDiscordBot/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BUILDS/net6.0/CMD_Utils.dll b/BUILDS/net6.0/CMD_Utils.dll index d30bcd71d4779c6e994310616fcdd889ae9a65ab..d0b729a039747d0f1ffae51636739c94b7c74168 100644 GIT binary patch delta 4321 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 A)Bpeg diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 9671e1e560ed7b03407c632794ef11ad9c774f66..b035aeb7e3099892f01bd3c0b6456627ed99f862 100644 GIT binary patch delta 16591 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 delta 17260 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 U{^Q@WRNF6V|L%LSp@-rB0N*oFk^lez diff --git a/CMD_LevelingSystem/Level.cs b/CMD_LevelingSystem/Level.cs index e11fd3f..ba66498 100644 --- a/CMD_LevelingSystem/Level.cs +++ b/CMD_LevelingSystem/Level.cs @@ -11,6 +11,8 @@ internal class Level : DBCommand { public string Command => "level"; + public List Aliases => new() { "lvl" }; + public string Description => "Display tour current level"; public string Usage => "level"; diff --git a/CMD_Utils/Echo.cs b/CMD_Utils/Echo.cs index 83ec899..68e5ab2 100644 --- a/CMD_Utils/Echo.cs +++ b/CMD_Utils/Echo.cs @@ -1,11 +1,14 @@ using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; +using System.Collections.Generic; internal class Echo : DBCommand { public string Command => "echo"; + public List Aliases => null; + public string Description => "Replay with the same message"; public string Usage => "echo [message]"; diff --git a/CMD_Utils/FlipCoin.cs b/CMD_Utils/FlipCoin.cs index 0057f33..2ec361e 100644 --- a/CMD_Utils/FlipCoin.cs +++ b/CMD_Utils/FlipCoin.cs @@ -1,6 +1,7 @@ using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; +using System.Collections.Generic; namespace CMD_Utils; @@ -8,6 +9,8 @@ internal class FlipCoin : DBCommand { public string Command => "flip"; + public List Aliases => null; + public string Description => "Flip a coin"; public string Usage => "flip"; diff --git a/CMD_Utils/Poll.cs b/CMD_Utils/Poll.cs index c3624c6..3093e8b 100644 --- a/CMD_Utils/Poll.cs +++ b/CMD_Utils/Poll.cs @@ -11,6 +11,8 @@ public class Poll : DBCommand { public string Command => "poll"; + public List Aliases => null; + public string Description => "Create a poll with options"; public string Usage => "poll [This-is-question] [This-is-answer-1] [This-is-answer-2] ... "; diff --git a/CMD_Utils/Random.cs b/CMD_Utils/Random.cs index 7a93e0d..b69fc04 100644 --- a/CMD_Utils/Random.cs +++ b/CMD_Utils/Random.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -6,6 +7,8 @@ public class Random : DBCommand { public string Command => "random"; + public List Aliases => new() { "rnd" }; + public string Description => "random number between number1 and number2"; public string Usage => "random [number1] [number2]"; diff --git a/DiscordBot/Discord/Commands/Help.cs b/DiscordBot/Discord/Commands/Help.cs index 11fb0f9..570dd05 100644 --- a/DiscordBot/Discord/Commands/Help.cs +++ b/DiscordBot/Discord/Commands/Help.cs @@ -1,4 +1,6 @@ -using Discord; +using System.Collections.Generic; +using System.Linq; +using Discord; using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -17,15 +19,17 @@ internal class Help : DBCommand /// public string Command => "help"; + public List Aliases => null; + /// /// Command Description /// - public string Description => "This command allows you to check all loadded commands"; + public string Description => "This command allows you to check all loaded commands"; /// /// Command usage /// - public string Usage => "help"; + public string Usage => "help "; /// /// Check if the command can be used /> @@ -57,10 +61,10 @@ internal class Help : DBCommand foreach (var item in args) { var e = GenerateHelpCommand(item); - if (e != null) - context.Channel.SendMessageAsync(embed: e.Build()); - else + if (e is null) context.Channel.SendMessageAsync("Unknown Command " + item); + else + context.Channel.SendMessageAsync(embed: e.Build()); } return; @@ -74,10 +78,12 @@ internal class Help : DBCommand foreach (var cmd in PluginLoader.Commands!) { - if (cmd.canUseDM) DMCommands += cmd.Command + " "; + if (cmd.canUseDM) + DMCommands += cmd.Command + " "; if (cmd.requireAdmin) - adminCommands += cmd.Command + " "; - else if (cmd.canUseServer) normalCommands += cmd.Command + " "; + adminCommands += cmd.Command + " "; + if (cmd.canUseServer) + normalCommands += cmd.Command + " "; } embedBuilder.AddField("Admin Commands", adminCommands); @@ -89,11 +95,14 @@ internal class Help : DBCommand private EmbedBuilder GenerateHelpCommand(string command) { var embedBuilder = new EmbedBuilder(); - var cmd = PluginLoader.Commands.Find(p => p.Command == 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", cmd.Usage); embedBuilder.AddField("Description", cmd.Description); + if (cmd.Aliases is null) + return embedBuilder; + embedBuilder.AddField("Alias", cmd.Aliases.Count == 0 ? "-" : string.Join(", ", cmd.Aliases)); return embedBuilder; } diff --git a/DiscordBot/Discord/Commands/Restart.cs b/DiscordBot/Discord/Commands/Restart.cs index a567783..d9a7019 100644 --- a/DiscordBot/Discord/Commands/Restart.cs +++ b/DiscordBot/Discord/Commands/Restart.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using Discord.WebSocket; using PluginManager.Interfaces; @@ -17,6 +18,8 @@ internal class Restart : DBCommand /// public string Command => "restart"; + public List Aliases => null; + /// /// Command Description /// diff --git a/DiscordBot/Discord/Commands/Settings.cs b/DiscordBot/Discord/Commands/Settings.cs index 044a2fd..866a91f 100644 --- a/DiscordBot/Discord/Commands/Settings.cs +++ b/DiscordBot/Discord/Commands/Settings.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Discord; using Discord.Commands; using Discord.WebSocket; @@ -14,6 +15,8 @@ internal class Settings : DBCommand /// public string Command => "set"; + public List Aliases => null; + /// /// Command Description /// diff --git a/DiscordBot/Discord/Core/Boot.cs b/DiscordBot/Discord/Core/Boot.cs index 2c6e9f7..e32a198 100644 --- a/DiscordBot/Discord/Core/Boot.cs +++ b/DiscordBot/Discord/Core/Boot.cs @@ -60,7 +60,9 @@ internal class Boot /// Task public async Task Awake() { - client = new DiscordSocketClient(); + DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true }; + + client = new DiscordSocketClient(config); service = new CommandService(); CommonTasks(); diff --git a/DiscordBot/Discord/Core/CommandHandler.cs b/DiscordBot/Discord/Core/CommandHandler.cs index 3a87dbc..c89d84b 100644 --- a/DiscordBot/Discord/Core/CommandHandler.cs +++ b/DiscordBot/Discord/Core/CommandHandler.cs @@ -47,13 +47,16 @@ internal class CommandHandler { try { - if (Message as SocketUserMessage == null) return; + if (Message as SocketUserMessage == null) + return; var message = Message as SocketUserMessage; - if (message == null) return; + if (message == null) + return; - if (!message.Content.StartsWith(botPrefix)) return; + if (!message.Content.StartsWith(botPrefix)) + return; var argPos = 0; @@ -63,17 +66,14 @@ internal class CommandHandler return; } - if (message.Author.IsBot) return; + if (message.Author.IsBot) + return; var context = new SocketCommandContext(client, message); - await commandService.ExecuteAsync( - context, - argPos, - null - ); + await commandService.ExecuteAsync(context, argPos, null); - var plugin = PluginLoader.Commands!.Where(p => p.Command == 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 != null) diff --git a/DiscordBot/DiscordBot.csproj b/DiscordBot/DiscordBot.csproj index da11f94..fdfaf9e 100644 --- a/DiscordBot/DiscordBot.csproj +++ b/DiscordBot/DiscordBot.csproj @@ -8,7 +8,7 @@ False True - 1.0.0.1 + 1.0.0.2 diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 94bac8c..7a72639 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -34,6 +34,38 @@ public class Program Directory.CreateDirectory("./Data/Plugins/Events"); PreLoadComponents().Wait(); + if (!Config.ContainsKey("ServerID")) + { + do + { + Console.Clear(); + Console.WriteLine("Please enter the server ID: "); + Console_Utilities.WriteColorText("You can find it in the Server Settings at &r\"Widget\"&c section"); + Console.WriteLine("Example: 1234567890123456789"); + + Console.WriteLine("This is not required, but is recommended. If you refuse to provide the ID, just press enter.\nThe server id is required to make easier for the bot to interact with the server.\nRemember: this bot is for one server ONLY."); + Console.Write("User Input > "); + ConsoleKeyInfo key = Console.ReadKey(); + if (key.Key == ConsoleKey.Enter) + Config.AddValueToVariables("ServerID", "null", false); + else + { + string SID = key.KeyChar + Console.ReadLine(); + if (SID.Length != 18) + { + Console.WriteLine("Your server ID is not 18 characters long. Please try again."); + continue; + } + + + Config.AddValueToVariables("ServerID", SID, false); + + } + break; + } while (true); + + } + if (!Config.ContainsKey("token") || Config.GetValue("token") == null || Config.GetValue("token")?.Length != 70) { Console.WriteLine("Please insert your token"); @@ -75,9 +107,13 @@ public class Program private static void NoGUI(Boot discordbooter) { var consoleCommandsHandler = new ConsoleCommandsHandler(discordbooter.client); +#if DEBUG + Console.WriteLine(); + consoleCommandsHandler.HandleCommand("lp"); +#else if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp"); if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs"); - +#endif Config.SaveConfig(); while (true) @@ -264,9 +300,9 @@ public class Program Config.PluginConfig.Load(); if (!Config.ContainsKey("Version")) - Config.AddValueToVariables("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), false); + Config.AddValueToVariables("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString(), false); else - Config.SetValue("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); + Config.SetValue("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString()); foreach (var key in OnlineDefaultKeys) { @@ -311,7 +347,7 @@ public class Program Console.WriteLine("\n\n"); await Task.Delay(1000); - int waitTime = 20; //wait time to proceed + int waitTime = 10; //wait time to proceed Console.Write($"The bot will start in {waitTime} seconds"); while (waitTime > 0) diff --git a/MusicCommands/Leave.cs b/MusicCommands/Leave.cs index 3ee6975..79979e8 100644 --- a/MusicCommands/Leave.cs +++ b/MusicCommands/Leave.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -8,6 +9,8 @@ internal class Leave : DBCommand { public string Command => "leave"; + public List Aliases => null; + public string Description => "Leave the voice channel"; public string Usage => "leave"; diff --git a/MusicCommands/MusicPlayer.cs b/MusicCommands/MusicPlayer.cs index 5b5ae17..e1c974a 100644 --- a/MusicCommands/MusicPlayer.cs +++ b/MusicCommands/MusicPlayer.cs @@ -5,7 +5,8 @@ namespace MusicCommands; internal class MusicPlayer { - private Stream outputStream { get; } + private Stream outputStream { get; } + internal AudioFile NowPlaying = null; internal bool isPlaying, isPaused; @@ -14,9 +15,10 @@ internal class MusicPlayer outputStream = outputChannel; } - public async Task Play(Stream source, int byteSize) + public async Task Play(Stream source, int byteSize, AudioFile songPlaying) { - isPlaying = true; + isPlaying = true; + NowPlaying = songPlaying; while (isPlaying) { if (isPaused) diff --git a/MusicCommands/Pause.cs b/MusicCommands/Pause.cs index 5b16b37..065a02a 100644 --- a/MusicCommands/Pause.cs +++ b/MusicCommands/Pause.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -8,6 +9,8 @@ internal class Pause : DBCommand { public string Command => "pause"; + public List Aliases => null; + public string Description => "Pause/Unpause the music that is currently running"; public string Usage => "pause"; diff --git a/MusicCommands/Play.cs b/MusicCommands/Play.cs index 68333b9..9b46e7f 100644 --- a/MusicCommands/Play.cs +++ b/MusicCommands/Play.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using Discord; @@ -14,6 +15,8 @@ internal class Play : DBCommand { public string Command => "play"; + public List Aliases => new() { "p" }; + public string Description => "Play music from a file"; public string Usage => "play [name/url]"; @@ -69,11 +72,11 @@ internal class Play : DBCommand if (Data.MusicPlayer is not null) { - await context.Channel.SendMessageAsync("Enqueued your request"); + await context.Channel.SendMessageAsync("Queued your request: " + splitted.MergeStrings(1)); return; } } - while (false); + while (false); // run only one time ! Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; @@ -93,15 +96,14 @@ internal class Play : DBCommand using (var discordChanneAudioOutStream = Data.audioClient.CreatePCMStream(AudioApplication.Mixed)) { - if (Data.MusicPlayer is null) - Data.MusicPlayer = new MusicPlayer(discordChanneAudioOutStream); + Data.MusicPlayer ??= new MusicPlayer(discordChanneAudioOutStream); while (Data.Playlist.Count > 0) { var nowPlaying = Data.Playlist.GetNextSong; using (var ffmpeg = CreateStream(nowPlaying.Name)) using (var ffmpegOutputBaseStream = ffmpeg.StandardOutput.BaseStream) { - await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024); + await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024, nowPlaying); Console.WriteLine("Finished playing from " + nowPlaying.Url); } } @@ -110,7 +112,7 @@ internal class Play : DBCommand } } - private Process CreateStream(string path) + private static Process CreateStream(string path) { return Process.Start(new ProcessStartInfo { FileName = "ffmpeg", Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1", UseShellExecute = false, RedirectStandardOutput = true }); } diff --git a/MusicCommands/Skip.cs b/MusicCommands/Skip.cs index 583363c..0ca23b3 100644 --- a/MusicCommands/Skip.cs +++ b/MusicCommands/Skip.cs @@ -13,6 +13,8 @@ namespace MusicCommands { public string Command => "skip"; + public List Aliases => null; + public string Description => "skip the music that is currently running"; public string Usage => "skip"; @@ -25,7 +27,16 @@ namespace MusicCommands public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) { + var loadedSong = Data.MusicPlayer.NowPlaying; + + if (loadedSong is null || Data.MusicPlayer.isPlaying == false) + { + message.Channel.SendMessageAsync("There is no music playing"); + return; + } + Data.MusicPlayer.isPlaying = false; + message.Channel.SendMessageAsync($"You have skipped {loadedSong.Name}"); } } } diff --git a/MusicCommands/queue.cs b/MusicCommands/queue.cs index a6c762d..d918f30 100644 --- a/MusicCommands/queue.cs +++ b/MusicCommands/queue.cs @@ -11,7 +11,8 @@ namespace MusicCommands { public class queue : DBCommand { - public string Command => "queue"; + public string Command => "queue"; + public List Aliases => new() { "q" }; public string Description => "check queue"; diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index f20434a..644b085 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -67,9 +67,9 @@ namespace PluginManager public static PluginType GetPluginType(string pluginName) { foreach (var tuple in InstalledPlugins) - { - if (tuple.Item1 == pluginName) return tuple.Item2; - } + if (tuple.Item1 == pluginName) + return tuple.Item2; + return PluginType.Unknown; } diff --git a/PluginManager/Interfaces/DBCommand.cs b/PluginManager/Interfaces/DBCommand.cs index 4095427..7dc759d 100644 --- a/PluginManager/Interfaces/DBCommand.cs +++ b/PluginManager/Interfaces/DBCommand.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; namespace PluginManager.Interfaces; @@ -11,6 +12,11 @@ public interface DBCommand /// string Command { get; } + /// + /// Command aliases. Users may use this to execute the command + /// + List? Aliases { get; } + /// /// Command description /// @@ -44,8 +50,5 @@ public interface DBCommand /// The message that the user types /// The discord client of the bot /// true if the message was sent from DM, otherwise false. It is always false if canUseDM is false - void Execute(SocketCommandContext context, - SocketMessage message, - DiscordSocketClient client, - bool isDM); + void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM); } diff --git a/PluginManager/Items/Command.cs b/PluginManager/Items/Command.cs index 22cd36a..d6b4ded 100644 --- a/PluginManager/Items/Command.cs +++ b/PluginManager/Items/Command.cs @@ -44,8 +44,8 @@ public class Command public class ConsoleCommand { - public string CommandName { get; set; } - public string Description { get; set; } - public string Usage { get; set; } - public Action Action { get; set; } + public string CommandName { get; init; } + public string Description { get; init; } + public string Usage { get; init; } + public Action Action { get; init; } } \ No newline at end of file diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 351d295..bf08bae 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -233,15 +233,15 @@ public class ConsoleCommandsHandler } ); - AddCommand("sd", "Shuts down the discord bot", async () => + AddCommand("sd", "Shuts down the discord bot", () => { if (client is null) return; - await client.StopAsync(); - await client.DisposeAsync(); + client.StopAsync(); + client.DisposeAsync(); Config.SaveConfig(); Console.WriteLine("Bot is closing in 2 seconds ! Please wait to save data !"); - await Task.Delay(2000); + Thread.Sleep(2000); Environment.Exit(0); } ); @@ -268,7 +268,7 @@ public class ConsoleCommandsHandler public static bool CommandExists(string command) { - return !(GetCommand(command) is null); + return GetCommand(command) is not null; } public static ConsoleCommand? GetCommand(string command) diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 360b7c8..35d29c5 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -57,7 +57,7 @@ namespace PluginManager.Others if (!File.Exists(archFile)) throw new FileNotFoundException("Failed to load file !"); using ZipArchive archive = ZipFile.OpenRead(archFile); - ZipArchiveEntry? entry = archive.GetEntry(FileName); + ZipArchiveEntry? entry = archive.GetEntry(FileName); return entry?.Open(); } @@ -91,8 +91,8 @@ namespace PluginManager.Others /// A string built based on the array public static string MergeStrings(this string[] s, int indexToStart) { - string r = ""; - int len = s.Length; + string r = ""; + int len = s.Length; if (len <= indexToStart) return ""; for (int i = indexToStart; i < len - 1; ++i) { @@ -142,9 +142,9 @@ namespace PluginManager.Others 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; + 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); @@ -171,11 +171,11 @@ namespace PluginManager.Others { if (type == UnzipProgressType.PercentageFromNumberOfFiles) { - int totalZIPFiles = archive.Entries.Count(); + int totalZIPFiles = archive.Entries.Count(); int currentZIPFile = 0; foreach (ZipArchiveEntry entry in archive.Entries) { - if (entry.FullName.EndsWith("/")) + if (entry.FullName.EndsWith("/")) // it is a folder Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); else @@ -335,7 +335,7 @@ namespace PluginManager.Others using (MD5 md5 = MD5.Create()) { byte[] inputBytes = Encoding.ASCII.GetBytes(input); - byte[] hashBytes = md5.ComputeHash(inputBytes); + byte[] hashBytes = md5.ComputeHash(inputBytes); return Convert.ToHexString(hashBytes); } } diff --git a/SethDiscordBot.sln b/SethDiscordBot.sln index bccffb6..9fa99c8 100644 --- a/SethDiscordBot.sln +++ b/SethDiscordBot.sln @@ -21,6 +21,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EVE_LevelingSystem", "EVE_L EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_LevelingSystem", "CMD_LevelingSystem\CMD_LevelingSystem.csproj", "{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roles", "Roles\Roles.csproj", "{954F2AA9-6624-4554-946D-0F17B84487C3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,6 +53,10 @@ Global {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Debug|Any CPU.Build.0 = Debug|Any CPU {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.Build.0 = Release|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -62,6 +68,7 @@ Global {B1B4976E-5112-4217-B57B-3A03C5207B6E} = {449FA364-0B72-43FF-B3A3-806E2916200E} {EEC445DC-0C4B-43EA-8694-606BA0390B77} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012} {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9} = {449FA364-0B72-43FF-B3A3-806E2916200E} + {954F2AA9-6624-4554-946D-0F17B84487C3} = {449FA364-0B72-43FF-B3A3-806E2916200E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF}