59 lines
2.1 KiB
C#
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);
|
|
}
|
|
|
|
}
|
|
} |