DeukBot4/DeukBot4/MessageHandlers/CommandHandler/RequestStructure/CommandRequest.cs

59 lines
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using DeukBot4.MessageHandlers.Permissions;
using Discord.WebSocket;
namespace DeukBot4.MessageHandlers.CommandHandler.RequestStructure
{
public class CommandRequest
{
private const string CommandNamePattern = "!([a-zA-Z0-9_]*) *(.*)";
private static readonly Regex CommandNameMatcher = new Regex(CommandNamePattern);
public Command Command { get; }
//public string ParameterString { get; }
public SocketMessage OriginalMessage { get; }
public RequestParameter[] Parameters { get; private set; }
public PermissionLevel RequestPermissions { get; }
private CommandRequest(SocketMessage message, Command command, PermissionLevel requestPermissions, RequestParameter[] parameters)
{
OriginalMessage = message;
Command = command;
RequestPermissions = requestPermissions;
Parameters = parameters;
}
public enum RequestCode
{
OK, Invalid, Forbidden
}
public static (CommandRequest, RequestCode) Create(SocketMessage message)
{
var originalMessage = message;
var content = message.Content;
var res = CommandNameMatcher.Match(content);
if (res.Groups.Count <= 2)
return (null, RequestCode.Invalid);
var commandName = res.Groups[1].Value;
var command = CommandHandler.GetCommand(commandName);
if (command == null)
{
return (null, RequestCode.Invalid);
}
var permission = PermissionValidator.GetUserPermissionLevel(message);
if (permission < command.Permission)
{
return (null, RequestCode.Forbidden);
}
var parameterString = res.Groups[2].Value;
var parameters = ParameterMatcher.GetParameterValues(command, parameterString);
return (new CommandRequest(originalMessage, command, permission, parameters), RequestCode.OK);
}
}
}