From b0ab88d143b391b501d3ec4d5b3c71713cdbb63b Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Sat, 16 May 2020 21:46:10 +0200 Subject: [PATCH] added setMode to documentation, added error handling with templated exception for set mode and refactored some feature config related methods (changed the equal to be case insensitive) --- .../commands/config/features/SetMode.java | 14 +++------ .../service/FeatureConfigServiceBean.java | 31 ++++++++++++------- .../core/service/FeatureModeServiceBean.java | 19 ++++++++---- .../feature_mode_not_found_en_US.ftl | 1 + .../FeatureModeNotFoundException.java | 31 +++++++++++++++++++ .../core/service/FeatureConfigService.java | 3 +- .../src/main/docs/asciidoc/features/core.adoc | 4 +++ .../src/main/docs/asciidoc/main.adoc | 3 +- .../help/setMode_description_en_US.ftl | 1 + .../setMode/help/setMode_example_en_US.ftl | 1 + .../setMode/help/setMode_long_help_en_US.ftl | 1 + .../help/setMode_parameter_feature_en_US.ftl | 1 + .../help/setMode_parameter_newMode_en_US.ftl | 1 + .../setMode/help/setMode_usage_en_US.ftl | 1 + .../feature_mode_not_found_text_en_US.ftl | 1 + 15 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_mode_not_found_en_US.ftl create mode 100644 abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureModeNotFoundException.java create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_description_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_example_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_long_help_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_feature_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_newMode_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_usage_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/core/exception/feature_mode_not_found_text_en_US.ftl diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/SetMode.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/SetMode.java index b93ce9f2c..a4d28b57f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/SetMode.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/features/SetMode.java @@ -13,6 +13,7 @@ import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.service.FeatureConfigService; import dev.sheldan.abstracto.core.service.FeatureModeService; import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; +import dev.sheldan.abstracto.templating.service.TemplateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -34,20 +35,15 @@ public class SetMode extends AbstractConditionableCommand { @Autowired private FeatureFlagManagementService featureFlagManagementService; + @Autowired + private TemplateService templateService; + @Override public CommandResult execute(CommandContext commandContext) { String featureName = (String) commandContext.getParameters().getParameters().get(0); String modeName = (String) commandContext.getParameters().getParameters().get(1); - if(featureConfigService.doesFeatureExist(featureName)) { - if(featureConfigService.isModeValid(featureName, modeName)) { - featureModeService.setModeForFeatureTo(featureName, commandContext.getUserInitiatedContext().getServer(), modeName); - } else { - return CommandResult.fromError("Mode not available"); - } - } else { - return CommandResult.fromError("Feature does not exist"); - } + featureModeService.setModeForFeatureTo(featureName, commandContext.getUserInitiatedContext().getServer(), modeName); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigServiceBean.java index 9bab642a0..157e4c03c 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigServiceBean.java @@ -5,6 +5,8 @@ import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.config.PostTargetEnum; import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; +import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException; +import dev.sheldan.abstracto.core.exception.FeatureNotFoundException; import dev.sheldan.abstracto.core.models.FeatureValidationResult; import dev.sheldan.abstracto.core.models.database.AServer; import org.springframework.beans.factory.annotation.Autowired; @@ -43,7 +45,7 @@ public class FeatureConfigServiceBean implements FeatureConfigService { if(any.isPresent()) { return any.get(); } - throw new AbstractoRunTimeException(String.format("Feature %s not found in configuration", featureEnum.getKey())); + throw new FeatureNotFoundException("", featureEnum.getKey(), getFeaturesAsList()); } @Override @@ -64,23 +66,29 @@ public class FeatureConfigServiceBean implements FeatureConfigService { .collect(Collectors.toList()); } + @Override + public List getFeatureModesFromFeatureAsString(String featureName) { + FeatureConfig featureConfig = getFeatureDisplayForFeature(featureName); + return featureConfig.getAvailableModes().stream().map(FeatureMode::getKey).collect(Collectors.toList()); + } + @Override public boolean doesFeatureExist(String name) { - return availableFeatures.stream().anyMatch(featureDisplay -> featureDisplay.getFeature().getKey().equals(name)); + return availableFeatures.stream().anyMatch(featureDisplay -> featureDisplay.getFeature().getKey().equalsIgnoreCase(name)); } @Override public FeatureEnum getFeatureEnum(String key) { - Optional foundFeature = availableFeatures.stream().filter(featureDisplay -> featureDisplay.getFeature().getKey().equals(key)).findAny(); + Optional foundFeature = availableFeatures.stream().filter(featureDisplay -> featureDisplay.getFeature().getKey().equalsIgnoreCase(key)).findAny(); if(foundFeature.isPresent()) { return foundFeature.get().getFeature(); } - throw new AbstractoRunTimeException(String.format("Feature %s not found.", key)); + throw new FeatureNotFoundException("", key, getFeaturesAsList()); } @Override public PostTargetEnum getPostTargetEnumByKey(String key) { - Predicate postTargetComparison = postTargetEnum -> postTargetEnum.getKey().equals(key); + Predicate postTargetComparison = postTargetEnum -> postTargetEnum.getKey().equalsIgnoreCase(key); Optional foundFeature = availableFeatures.stream().filter(featureDisplay -> featureDisplay.getRequiredPostTargets().stream().anyMatch(postTargetComparison)).findAny(); if(foundFeature.isPresent()) { return foundFeature.get().getRequiredPostTargets().stream().filter(postTargetComparison).findAny().get(); @@ -107,24 +115,23 @@ public class FeatureConfigServiceBean implements FeatureConfigService { } @Override - public FeatureMode getFeatureModeByKey(String key) { - Predicate postTargetComparison = postTargetEnum -> postTargetEnum.getKey().equals(key); - Optional foundFeature = availableFeatures.stream().filter(featureDisplay -> featureDisplay.getAvailableModes().stream().anyMatch(postTargetComparison)).findAny(); + public FeatureMode getFeatureModeByKey(FeatureConfig featureConfig, String key) { + Optional foundFeature = featureConfig.getAvailableModes().stream().filter(featureMode -> featureMode.getKey().equalsIgnoreCase(key)).findAny(); if(foundFeature.isPresent()) { - return foundFeature.get().getAvailableModes().stream().filter(postTargetComparison).findAny().get(); + return foundFeature.get(); } - throw new AbstractoRunTimeException(String.format("Feature mode %s not found.", key)); + throw new FeatureModeNotFoundException("", key, getFeatureModesFromFeatureAsString(featureConfig.getFeature().getKey())); } @Override public boolean isModeValid(String featureName, String modeName) { return availableFeatures .stream() - .filter(featureConfig -> featureConfig.getFeature().getKey().equals(featureName)) + .filter(featureConfig -> featureConfig.getFeature().getKey().equalsIgnoreCase(featureName)) .map(FeatureConfig::getAvailableModes) .anyMatch(featureModes -> featureModes .stream() - .anyMatch(featureMode -> featureMode.getKey().equals(modeName)) + .anyMatch(featureMode -> featureMode.getKey().equalsIgnoreCase(modeName)) ); } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureModeServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureModeServiceBean.java index f8e71ca41..8efda6154 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureModeServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureModeServiceBean.java @@ -1,6 +1,7 @@ package dev.sheldan.abstracto.core.service; import dev.sheldan.abstracto.core.command.service.management.FeatureManagementService; +import dev.sheldan.abstracto.core.config.FeatureConfig; import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureMode; import dev.sheldan.abstracto.core.models.database.AFeature; @@ -35,19 +36,22 @@ public class FeatureModeServiceBean implements FeatureModeService { @Override public AFeatureMode setModeForFeatureTo(AFeatureFlag flag, String newMode) { - FeatureMode featureMode = featureConfigService.getFeatureModeByKey(newMode); + FeatureConfig featureConfig = featureConfigService.getFeatureDisplayForFeature(flag.getFeature().getKey()); + FeatureMode featureMode = featureConfigService.getFeatureModeByKey(featureConfig, newMode); return setModeForFeatureTo(flag, featureMode); } @Override public AFeatureMode setModeForFeatureTo(FeatureEnum featureEnum, AServer server, String newMode) { - FeatureMode featureMode = featureConfigService.getFeatureModeByKey(newMode); + FeatureConfig featureConfig = featureConfigService.getFeatureDisplayForFeature(featureEnum); + FeatureMode featureMode = featureConfigService.getFeatureModeByKey(featureConfig, newMode); return setModeForFeatureTo(featureEnum, server, featureMode); } @Override public AFeatureMode setModeForFeatureTo(AFeature feature, AServer server, String newMode) { - FeatureMode featureMode = featureConfigService.getFeatureModeByKey(newMode); + FeatureConfig featureConfig = featureConfigService.getFeatureDisplayForFeature(feature.getKey()); + FeatureMode featureMode = featureConfigService.getFeatureModeByKey(featureConfig, newMode); return setModeForFeatureTo(feature, server, featureMode); } @@ -77,19 +81,22 @@ public class FeatureModeServiceBean implements FeatureModeService { @Override public AFeatureMode createMode(AFeatureFlag flag, String newMode) { - FeatureMode featureMode = featureConfigService.getFeatureModeByKey(newMode); + FeatureConfig featureConfig = featureConfigService.getFeatureDisplayForFeature(flag.getFeature().getKey()); + FeatureMode featureMode = featureConfigService.getFeatureModeByKey(featureConfig, newMode); return createMode(flag, featureMode); } @Override public AFeatureMode createMode(FeatureEnum featureEnum, AServer server, String newMode) { - FeatureMode featureMode = featureConfigService.getFeatureModeByKey(newMode); + FeatureConfig featureConfig = featureConfigService.getFeatureDisplayForFeature(featureEnum); + FeatureMode featureMode = featureConfigService.getFeatureModeByKey(featureConfig, newMode); return createMode(featureEnum, server, featureMode); } @Override public AFeatureMode createMode(AFeature feature, AServer server, String newMode) { - FeatureMode featureMode = featureConfigService.getFeatureModeByKey(newMode); + FeatureConfig featureConfig = featureConfigService.getFeatureDisplayForFeature(feature.getKey()); + FeatureMode featureMode = featureConfigService.getFeatureModeByKey(featureConfig, newMode); return createMode(feature, server, featureMode); } diff --git a/abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_mode_not_found_en_US.ftl b/abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_mode_not_found_en_US.ftl new file mode 100644 index 000000000..f1f29b870 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_mode_not_found_en_US.ftl @@ -0,0 +1 @@ +<#assign availableModes>${availableModes?join(", ")}<#include "feature_mode_not_found_text"> \ No newline at end of file diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureModeNotFoundException.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureModeNotFoundException.java new file mode 100644 index 000000000..77074c3fc --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureModeNotFoundException.java @@ -0,0 +1,31 @@ +package dev.sheldan.abstracto.core.exception; + +import dev.sheldan.abstracto.templating.Templatable; + +import java.util.HashMap; +import java.util.List; + +public class FeatureModeNotFoundException extends AbstractoRunTimeException implements Templatable { + + private final String featureMode; + private final List availableModes; + + public FeatureModeNotFoundException(String message, String featureMode, List availableModes) { + super(message); + this.featureMode = featureMode; + this.availableModes = availableModes; + } + + @Override + public String getTemplateName() { + return "feature_mode_not_found"; + } + + @Override + public Object getTemplateModel() { + HashMap parameters = new HashMap<>(); + parameters.put("featureMode", this.featureMode); + parameters.put("availableModes", this.availableModes); + return parameters; + } +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigService.java index ff5e92ca7..07654caf2 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureConfigService.java @@ -17,9 +17,10 @@ public interface FeatureConfigService { boolean doesFeatureExist(FeatureConfig name); boolean doesFeatureExist(String name); List getFeaturesAsList(); + List getFeatureModesFromFeatureAsString(String featureName); FeatureEnum getFeatureEnum(String key); PostTargetEnum getPostTargetEnumByKey(String key); FeatureValidationResult validateFeatureSetup(FeatureConfig featureConfig, AServer server); - FeatureMode getFeatureModeByKey(String key); + FeatureMode getFeatureModeByKey(FeatureConfig featureConfig, String key); boolean isModeValid(String featureName, String modeName); } diff --git a/abstracto-application/documentation/src/main/docs/asciidoc/features/core.adoc b/abstracto-application/documentation/src/main/docs/asciidoc/features/core.adoc index 577c6c936..ab522aa0c 100644 --- a/abstracto-application/documentation/src/main/docs/asciidoc/features/core.adoc +++ b/abstracto-application/documentation/src/main/docs/asciidoc/features/core.adoc @@ -101,6 +101,10 @@ Make a role immune against a command:: Enforce the role restrictions of commands:: * Usage: `restrict ` * Description: Causes the role restrictions for a all commands in the `feature`/the `command` to be in effect again. +Changing the mode of a feature: +* Usage: `setMode ` +* Description: Changes the mode of feature `featureName` to `newMode`. + .What does it mean if a role is immune? A command can take a member as a target, for example `ban`. If a role is considered immune, this means, if the member which is the target of the command has the given role, this command will fail. Not all commands support this feature, but only the following: diff --git a/abstracto-application/documentation/src/main/docs/asciidoc/main.adoc b/abstracto-application/documentation/src/main/docs/asciidoc/main.adoc index 8e8a7dc79..c743083c5 100644 --- a/abstracto-application/documentation/src/main/docs/asciidoc/main.adoc +++ b/abstracto-application/documentation/src/main/docs/asciidoc/main.adoc @@ -29,7 +29,8 @@ System configuration:: Some properties can be configured while the bot is runnin In the respective features they are noted under `Relevant system configuration`. In order to change this you need to use the command `setConfig` with the provided key and the new desired value. Emotes:: The features have section of the keys of used emotes in the feature, you can change this emote with the `setEmote` command. - +Feature Modes:: Features can have different modes. This means, a feature behaves differently if the mode is changed. For example: `modmail` has two modes: `log` and `noLog`. +In the mode `log` mod mail threads wil be logged into the post target `modmailLog` while in the other mode, this does not happen. This consideration of the modes does depend on the implementation of the features. == Features include::features/core.adoc[] diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_description_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_description_en_US.ftl new file mode 100644 index 000000000..f3c86b969 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_description_en_US.ftl @@ -0,0 +1 @@ +Changes the mode of a features. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_example_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_example_en_US.ftl new file mode 100644 index 000000000..c4edd321b --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_example_en_US.ftl @@ -0,0 +1 @@ +setMode modmail nolog \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_long_help_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_long_help_en_US.ftl new file mode 100644 index 000000000..e247d954b --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_long_help_en_US.ftl @@ -0,0 +1 @@ +The features of the bot have different modes. These modes influence how the features behave. With this command you can change the mode of a certain feature in this guild. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_feature_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_feature_en_US.ftl new file mode 100644 index 000000000..02bbfa242 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_feature_en_US.ftl @@ -0,0 +1 @@ +The feature to change the mode for. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_newMode_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_newMode_en_US.ftl new file mode 100644 index 000000000..e88d55db6 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_parameter_newMode_en_US.ftl @@ -0,0 +1 @@ +The internal key of the emote \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_usage_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_usage_en_US.ftl new file mode 100644 index 000000000..4595a1807 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/core/commands/setMode/help/setMode_usage_en_US.ftl @@ -0,0 +1 @@ +setMode \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/core/exception/feature_mode_not_found_text_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/core/exception/feature_mode_not_found_text_en_US.ftl new file mode 100644 index 000000000..c6f85a234 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/core/exception/feature_mode_not_found_text_en_US.ftl @@ -0,0 +1 @@ +Feature mode `${featureMode}` not available. The available feature modes are: ${availableModes}. \ No newline at end of file