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)

This commit is contained in:
Sheldan
2020-05-16 21:46:10 +02:00
parent d2264937b2
commit b0ab88d143
15 changed files with 84 additions and 29 deletions

View File

@@ -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");
}
return CommandResult.fromSuccess();
}

View File

@@ -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<String> 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<FeatureConfig> foundFeature = availableFeatures.stream().filter(featureDisplay -> featureDisplay.getFeature().getKey().equals(key)).findAny();
Optional<FeatureConfig> 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<PostTargetEnum> postTargetComparison = postTargetEnum -> postTargetEnum.getKey().equals(key);
Predicate<PostTargetEnum> postTargetComparison = postTargetEnum -> postTargetEnum.getKey().equalsIgnoreCase(key);
Optional<FeatureConfig> 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<FeatureMode> postTargetComparison = postTargetEnum -> postTargetEnum.getKey().equals(key);
Optional<FeatureConfig> foundFeature = availableFeatures.stream().filter(featureDisplay -> featureDisplay.getAvailableModes().stream().anyMatch(postTargetComparison)).findAny();
public FeatureMode getFeatureModeByKey(FeatureConfig featureConfig, String key) {
Optional<FeatureMode> 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))
);
}
}

View File

@@ -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);
}

View File

@@ -0,0 +1 @@
<#assign availableModes>${availableModes?join(", ")}</#assign><#include "feature_mode_not_found_text">

View File

@@ -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<String> availableModes;
public FeatureModeNotFoundException(String message, String featureMode, List<String> availableModes) {
super(message);
this.featureMode = featureMode;
this.availableModes = availableModes;
}
@Override
public String getTemplateName() {
return "feature_mode_not_found";
}
@Override
public Object getTemplateModel() {
HashMap<String, Object> parameters = new HashMap<>();
parameters.put("featureMode", this.featureMode);
parameters.put("availableModes", this.availableModes);
return parameters;
}
}

View File

@@ -17,9 +17,10 @@ public interface FeatureConfigService {
boolean doesFeatureExist(FeatureConfig name);
boolean doesFeatureExist(String name);
List<String> getFeaturesAsList();
List<String> 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);
}

View File

@@ -101,6 +101,10 @@ Make a role immune against a command::
Enforce the role restrictions of commands::
* Usage: `restrict <featureName|commandName>`
* 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 <featureName> <newMode>`
* 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:

View File

@@ -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[]

View File

@@ -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.

View File

@@ -0,0 +1 @@
Feature mode `${featureMode}` not available. The available feature modes are: ${availableModes}.