DeukBot4/DeukBot4/MessageHandlers/CommandHandler/CommandHandler.cs

67 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using DeukBot4.MessageHandlers.CommandHandler.RequestStructure;
using DeukBot4.MessageHandlers.Permissions;
using DeukBot4.Utilities;
using Discord.WebSocket;
namespace DeukBot4.MessageHandlers.CommandHandler
{
public static class CommandHandler
{
public static Dictionary<string, Command> Commands { get; private set; } = new Dictionary<string, Command>();
public const char CommandTrigger = '!';
public static void Build()
{
var commandContainers = typeof(CommandHandler).Assembly.GetTypes()
.Where(x => typeof(CommandContainerBase).IsAssignableFrom(x) && !x.IsAbstract);
foreach (var commandContainer in commandContainers)
{
if (!(Activator.CreateInstance(commandContainer) is CommandContainerBase obj))
continue;
var commands = obj.GetCommands();
foreach (var command in commands)
{
Commands.Add(command.Name.ToLowerInvariant(), command);
}
Logger.Log($"Loaded following commands for container {obj.Name}: {commands.Select(x => x.Name).Join(", ")}");
}
}
public static async Task HandleMessage(SocketMessage message)
{
if (message.Content[0] != CommandTrigger) return;
var req = CommandRequest.Create(message);
var resultCode = req.Item2;
if (resultCode == CommandRequest.RequestCode.Invalid)
{
await Logger.LogError("Invalid content: " + message.Content);
return;
}
else if (resultCode == CommandRequest.RequestCode.Forbidden)
{
await Logger.Log(
$"Unauthorized user tried to run command: {message.Author.Username} -> {message.Content}");
}
else if (resultCode == CommandRequest.RequestCode.OK)
{
await req.Item1.Command.Invoke(req.Item1);
}
}
public static Command GetCommand(string name)
{
return Commands.TryGetValue(name.ToLowerInvariant(), out var com) ? com : null;
}
}
}