summaryrefslogtreecommitdiff
path: root/DiscordBot/CommandHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'DiscordBot/CommandHandler.cs')
-rw-r--r--DiscordBot/CommandHandler.cs112
1 files changed, 112 insertions, 0 deletions
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<string> 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<string, string>
+ {
+ { "Name", name },
+ { "CmdIdentifier", args.First()},
+ { "CmdTexts", "[" + cmdContent + "]"}
+ };
+
+ var content = new FormUrlEncodedContent(values);
+
+ var response = await _HttpClient.PostAsync(url, content);
+
+ return await response.Content.ReadAsStringAsync();
+ }
+
+ }
+}