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

107 lines
4.0 KiB
C#
Raw Normal View History

2018-03-28 23:34:48 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
2018-03-28 23:34:48 +00:00
using System.Text.RegularExpressions;
using System.Threading.Tasks;
2018-03-28 23:34:48 +00:00
using DeukBot4.MessageHandlers.Permissions;
using Discord;
using Discord.Rest;
2018-03-28 23:34:48 +00:00
using Discord.WebSocket;
namespace DeukBot4.MessageHandlers.CommandHandler.RequestStructure
{
public class CommandRequest
{
private static readonly string CommandNamePattern =
"(?:" + CommandHandler.CommandTrigger + "+|<@\\d*> !*)([^ ]+) *(.*)";
2018-03-28 23:34:48 +00:00
private static readonly Regex CommandNameMatcher = new Regex(CommandNamePattern);
public Command Command { get; }
public SocketMessage OriginalMessage { get; }
public RequestParameter[] Parameters { get; }
2018-03-28 23:34:48 +00:00
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, UnknownCommand, Invalid, Forbidden, InvalidParameters
2018-03-28 23:34:48 +00:00
}
public Task<RestUserMessage> SendMessageAsync(string text, bool isTTS = false, Embed embed = null)
{
return OriginalMessage.Channel.SendMessageAsync(text, isTTS, embed);
}
public Task<RestUserMessage> SendSimpleEmbed(string title, string description, IEnumerable<EmbedFieldBuilder> fields = null)
{
var eb = EmbedFactory.GetStandardEmbedBuilder();
eb.Title = title;
eb.Description = description;
eb.Fields = fields == null ? new List<EmbedFieldBuilder>() : fields.ToList();
return OriginalMessage.Channel.SendMessageAsync("", embed: eb.Build());
}
public class CommandRequestResponse
{
public CommandRequest Request { get; }
public RequestCode Response { get; }
public string CommandName { get; }
public CommandRequestResponse(CommandRequest request, RequestCode response, string commandName)
{
Request = request;
Response = response;
CommandName = commandName;
}
}
public static async Task<CommandRequestResponse> Create(SocketMessage message)
2018-03-28 23:34:48 +00:00
{
var originalMessage = message;
var content = message.Content;
var res = CommandNameMatcher.Match(content);
if (res.Groups.Count <= 2)
return new CommandRequestResponse(null, RequestCode.Invalid, null);
2018-03-28 23:34:48 +00:00
var commandName = res.Groups[1].Value;
var command = CommandHandler.GetCommand(commandName);
if (command == null)
{
return new CommandRequestResponse(null, RequestCode.UnknownCommand, commandName);
2018-03-28 23:34:48 +00:00
}
PermissionLevel permission;
try
{
permission = await PermissionValidator.GetUserPermissionLevel(message);
}
catch (Exception e)
{
2018-08-13 16:41:59 +00:00
await Logger.Main.LogError(e.Message);
return new CommandRequestResponse(null, RequestCode.Forbidden, null);
}
2018-03-28 23:34:48 +00:00
if (permission < command.Permission)
{
return new CommandRequestResponse(null, RequestCode.Forbidden, permission.ToString());
2018-03-28 23:34:48 +00:00
}
var parameterString = res.Groups[2].Value;
var parameters = ParameterMatcher.GetParameterValues(command, parameterString);
2018-03-30 12:51:38 +00:00
if (parameters == null)
{
return new CommandRequestResponse(null, RequestCode.InvalidParameters, parameterString);
2018-03-30 12:51:38 +00:00
}
return new CommandRequestResponse(new CommandRequest(originalMessage, command, permission, parameters),
RequestCode.OK, null);
2018-03-28 23:34:48 +00:00
}
}
}