mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-03-27 14:23:56 +00:00
[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:
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user