From ed26623e17e8dfcc036f88cca6de10d5a35697ec Mon Sep 17 00:00:00 2001 From: uzvkl Date: Mon, 20 May 2019 00:54:14 +0200 Subject: Reorganize Code delete ZoBotanica --- DiscordBot/CommandHandler.cs | 112 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 DiscordBot/CommandHandler.cs (limited to 'DiscordBot/CommandHandler.cs') diff --git a/DiscordBot/CommandHandler.cs b/DiscordBot/CommandHandler.cs new file mode 100644 index 0000000..0f6aa7e --- /dev/null +++ b/DiscordBot/CommandHandler.cs @@ -0,0 +1,112 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Reflection; +using System.Threading.Tasks; +using Discord; +using Discord.Commands; +using Discord.WebSocket; + +namespace DiscordBot +{ + public class CommandHandler + { + private readonly DiscordSocketClient _client; + private readonly CommandService _commands; + private static readonly HttpClient _HttpClient = new HttpClient(); + + public CommandHandler(DiscordSocketClient client, CommandService commands) + { + _commands = commands; + _client = client; + } + + public async Task InstallCommandsAsync() + { + // Hook the MessageReceived event into our command handler + _client.MessageReceived += HandleCommandAsync; + + // Here we discover all of the command modules in the entry + // assembly and load them. Starting from Discord.NET 2.0, a + // service provider is required to be passed into the + // module registration method to inject the + // required dependencies. + // + // If you do not use Dependency Injection, pass null. + // See Dependency Injection guide for more information. + await _commands.AddModulesAsync(assembly: Assembly.GetEntryAssembly(), + services: null); + } + + private async Task HandleCommandAsync(SocketMessage messageParam) + { + // Don't process the command if it was a system message + var message = messageParam as SocketUserMessage; + if (message == null) return; + + // Create a number to track where the prefix ends and the command begins + int argPos = 0; + + // Determine if the message is a command based on the prefix and make sure no bots trigger commands + if (!(message.HasCharPrefix('!', ref argPos) || + message.HasMentionPrefix(_client.CurrentUser, ref argPos)) || + message.Author.IsBot) + return; + + // Create a WebSocket-based command context based on the message + var context = new SocketCommandContext(_client, message); + + // Execute the command with the command context we just + // created, along with the service provider for precondition checks. + + // Keep in mind that result does not indicate a return value + // rather an object stating if the command executed successfully. + var result = await _commands.ExecuteAsync( + context: context, + argPos: argPos, + services: null); + + // Optionally, we may inform the user if the command fails + // to be executed; however, this may not always be desired, + // as it may clog up the request queue should a user spam a + // command. + + if (result.Error == CommandError.UnknownCommand) + { + var response = await SendCommand(message.Author.Username, message.Content,"https://kobert.dev/api/dsa/commands"); + //var response = "invalid"; + await context.Channel.SendMessageAsync(response); + } + else if (!result.IsSuccess) await context.Channel.SendMessageAsync(result.ErrorReason); + } + + + + private static async Task SendCommand(string name, string command, string url) + { + command = command.Remove(0, 1); + var args = command.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + + var cmdContent = string.Empty; + if (args.Length > 1) cmdContent = "\"" + args.Skip(1).Aggregate((s, n) => s + "\", \"" + n) + "\""; + + var values = new Dictionary + { + { "Name", name }, + { "CmdIdentifier", args.First()}, + { "CmdTexts", "[" + cmdContent + "]"} + }; + + var content = new FormUrlEncodedContent(values); + + var response = await _HttpClient.PostAsync(url, content); + + return await response.Content.ReadAsStringAsync(); + } + + } +} -- cgit v1.2.3-70-g09d2