[AB-70] adding concept of command parameter validators and applied them at various places, this has the intention for commands to fail early

removing duplicated command for assignable role places
This commit is contained in:
Sheldan
2020-09-30 00:17:43 +02:00
parent 0f9a0dc143
commit 8e05bc90ea
33 changed files with 588 additions and 78 deletions

View File

@@ -2,7 +2,9 @@ package dev.sheldan.abstracto.core.command;
import dev.sheldan.abstracto.core.command.condition.ConditionResult;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.config.ParameterValidator;
import dev.sheldan.abstracto.core.command.config.Parameters;
import dev.sheldan.abstracto.core.command.exception.CommandParameterValidationException;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameterException;
import dev.sheldan.abstracto.core.command.exception.ParameterTooLongException;
import dev.sheldan.abstracto.core.command.service.CommandManager;
@@ -115,6 +117,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
private void tryToExecuteFoundCommand(@Nonnull MessageReceivedEvent event, UserInitiatedServerContext userInitiatedContext, CommandContext.CommandContextBuilder commandContextBuilder, Command foundCommand, UnParsedCommandParameter unParsedParameter) {
try {
Parameters parsedParameters = getParsedParameters(unParsedParameter, foundCommand, event.getMessage(), userInitiatedContext);
validateCommandParameters(parsedParameters, foundCommand);
CommandContext commandContext = commandContextBuilder.parameters(parsedParameters).build();
ConditionResult conditionResult = commandService.isCommandExecutable(foundCommand, commandContext);
CommandResult commandResult = null;
@@ -158,6 +161,21 @@ public class CommandReceivedHandler extends ListenerAdapter {
}
}
private void validateCommandParameters(Parameters parameters, Command foundCommand) {
List<Parameter> parameterList = foundCommand.getConfiguration().getParameters();
// we iterate only over the actually found parameters, that way we dont have to consider the optional parameters
// the parameters are going from left to right anyway
for (int i = 0; i < parameters.getParameters().size(); i++) {
Parameter parameter = parameterList.get(i);
for (ParameterValidator parameterValidator : parameter.getValidators()) {
boolean validate = parameterValidator.validate(parameters.getParameters().get(i));
if(!validate) {
throw new CommandParameterValidationException(parameterValidator.getParameters(), parameterValidator.getTemplateName(), parameter);
}
}
}
}
@Transactional
public void executePostCommandListener(Command foundCommand, CommandContext commandContext, CommandResult result) {
for (PostCommandExecution postCommandExecution : executions) {
@@ -308,8 +326,6 @@ public class CommandReceivedHandler extends ListenerAdapter {
}
} catch (NoSuchElementException e) {
throw new IncorrectParameterException(command, param.getType(), param.getName());
} catch (IllegalArgumentException e) {
}
}

View File

@@ -4,6 +4,8 @@ import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.config.ParameterValidator;
import dev.sheldan.abstracto.core.command.config.validator.MaxStringLengthValidator;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.config.FeatureEnum;
@@ -30,7 +32,8 @@ public class SetPrefix extends AbstractConditionableCommand {
@Override
public CommandConfiguration getConfiguration() {
Parameter newPrefixParameter = Parameter.builder().name("prefix").type(String.class).templated(true).build();
List<ParameterValidator> validators = Arrays.asList(MaxStringLengthValidator.max(10L));
Parameter newPrefixParameter = Parameter.builder().name("prefix").validators(validators).type(String.class).templated(true).build();
List<Parameter> parameters = Arrays.asList(newPrefixParameter);
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()

View File

@@ -4,6 +4,8 @@ import dev.sheldan.abstracto.core.command.UtilityModuleInterface;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.ParameterValidator;
import dev.sheldan.abstracto.core.command.config.validator.MaxStringLengthValidator;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.command.config.Parameter;
@@ -38,7 +40,8 @@ public class SetEmote extends AbstractConditionableCommand {
@Override
public CommandConfiguration getConfiguration() {
Parameter emoteKey = Parameter.builder().name("emoteKey").type(String.class).templated(true).build();
List<ParameterValidator> emoteKeyValidators = Arrays.asList(MaxStringLengthValidator.max(255L));
Parameter emoteKey = Parameter.builder().name("emoteKey").validators(emoteKeyValidators).type(String.class).templated(true).build();
Parameter emote = Parameter.builder().name("emote").type(AEmote.class).templated(true).build();
List<Parameter> parameters = Arrays.asList(emoteKey, emote);
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();