mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-28 19:35:23 +00:00
[AB-166] refactored conditions to not use exceptions for their regular case, split up feature mode exception into condition and exception, if the conditions need to be checked somewhere else, a separate exception is required, fixed command not being disabled properly in channels
This commit is contained in:
@@ -4,13 +4,15 @@ import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionResult;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition;
|
||||
import dev.sheldan.abstracto.modmail.exception.NotInModMailThreadException;
|
||||
import dev.sheldan.abstracto.modmail.condition.detail.NotInModMailThreadConditionDetail;
|
||||
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
|
||||
import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService;
|
||||
import dev.sheldan.abstracto.templating.service.TemplateService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* This {@link dev.sheldan.abstracto.core.command.condition.CommandCondition} checks the channel it is executed in
|
||||
* and checks if the channel is a valid and open mod mail thread.
|
||||
@@ -26,10 +28,10 @@ public class RequiresModMailCondition implements ModMailContextCondition {
|
||||
|
||||
@Override
|
||||
public ConditionResult shouldExecute(CommandContext commandContext, Command command) {
|
||||
ModMailThread thread = modMailThreadManagementService.getByChannel(commandContext.getUserInitiatedContext().getChannel());
|
||||
if(thread != null) {
|
||||
Optional<ModMailThread> threadOptional = modMailThreadManagementService.getByChannelOptional(commandContext.getUserInitiatedContext().getChannel());
|
||||
if(threadOptional.isPresent()) {
|
||||
return ConditionResult.builder().result(true).build();
|
||||
}
|
||||
return ConditionResult.builder().result(false).exception(new NotInModMailThreadException()).build();
|
||||
return ConditionResult.builder().result(false).conditionDetail(new NotInModMailThreadConditionDetail()).build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package dev.sheldan.abstracto.modmail.condition.detail;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionDetail;
|
||||
|
||||
public class NotInModMailThreadConditionDetail implements ConditionDetail {
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "modmail_not_in_modmail_thread_condition";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return new Object();
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
package dev.sheldan.abstracto.modmail.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
|
||||
public class NoModMailServerAvailable extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
public NoModMailServerAvailable() {
|
||||
super("No modmail server available");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "modmail_no_server_available_exception";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return new Object();
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package dev.sheldan.abstracto.modmail.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
|
||||
public class NotInModMailThreadException extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "modmail_not_in_modmail_thread_exception";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return new Object();
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,6 @@ import dev.sheldan.abstracto.core.command.exception.IncorrectParameterException;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
import dev.sheldan.abstracto.statistic.config.StatisticFeatures;
|
||||
@@ -22,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@@ -52,12 +50,9 @@ public class TrackEmote extends AbstractConditionableCommand {
|
||||
} else if(emoteToTrack.getEmote() != null) {
|
||||
boolean external = !emoteService.emoteIsFromGuild(emoteToTrack.getEmote(), commandContext.getGuild());
|
||||
if(external) {
|
||||
boolean trackExternalEmotes = featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, serverId, EmoteTrackingMode.EXTERNAL_EMOTES);
|
||||
if(!trackExternalEmotes) {
|
||||
throw new IncorrectFeatureModeException(StatisticFeatures.EMOTE_TRACKING, Arrays.asList(EmoteTrackingMode.EXTERNAL_EMOTES));
|
||||
featureModeService.validateActiveFeatureMode(serverId, StatisticFeatures.EMOTE_TRACKING, EmoteTrackingMode.EXTERNAL_EMOTES);
|
||||
}
|
||||
}
|
||||
trackedEmoteService.createFakeTrackedEmote(emoteToTrack.getEmote(), commandContext.getGuild());
|
||||
trackedEmoteService.createFakeTrackedEmote(emoteToTrack.getEmote(), commandContext.getGuild(), external);
|
||||
} else {
|
||||
throw new IncorrectParameterException(this, getConfiguration().getParameters().get(0).getName());
|
||||
}
|
||||
|
||||
@@ -173,6 +173,11 @@ public class TrackedEmoteServiceBean implements TrackedEmoteService {
|
||||
@Override
|
||||
public TrackedEmote createFakeTrackedEmote(Emote emote, Guild guild) {
|
||||
boolean external = !emoteService.emoteIsFromGuild(emote, guild);
|
||||
return createFakeTrackedEmote(emote, guild, external);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedEmote createFakeTrackedEmote(Emote emote, Guild guild, boolean external) {
|
||||
return trackedEmoteManagementService.createTrackedEmote(emote, guild, external);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import dev.sheldan.abstracto.core.command.exception.IncorrectParameterTypeExcept
|
||||
import dev.sheldan.abstracto.core.command.exception.InsufficientParametersException;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||
import dev.sheldan.abstracto.core.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.command.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
import dev.sheldan.abstracto.core.test.command.CommandTestUtilities;
|
||||
@@ -88,7 +88,7 @@ public class TrackEmoteTest {
|
||||
when(trackEmoteParameter.getEmote()).thenReturn(emoteToTrack);
|
||||
when(trackEmoteParameter.getTrackedEmote()).thenReturn(trackedEmote);
|
||||
when(emoteService.emoteIsFromGuild(emoteToTrack, commandContext.getGuild())).thenReturn(false);
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(false);
|
||||
doThrow(new IncorrectFeatureModeException(null, null)).when(featureModeService).validateActiveFeatureMode(SERVER_ID, StatisticFeatures.EMOTE_TRACKING, EmoteTrackingMode.EXTERNAL_EMOTES);
|
||||
testUnit.execute(commandContext);
|
||||
}
|
||||
|
||||
@@ -103,10 +103,10 @@ public class TrackEmoteTest {
|
||||
when(trackEmoteParameter.getEmote()).thenReturn(emoteToTrack);
|
||||
when(trackEmoteParameter.getTrackedEmote()).thenReturn(trackedEmote);
|
||||
when(emoteService.emoteIsFromGuild(emoteToTrack, commandContext.getGuild())).thenReturn(false);
|
||||
when(featureModeService.featureModeActive(StatisticFeatures.EMOTE_TRACKING, SERVER_ID, EmoteTrackingMode.EXTERNAL_EMOTES)).thenReturn(true);
|
||||
CommandResult result = testUnit.execute(commandContext);
|
||||
CommandTestUtilities.checkSuccessfulCompletion(result);
|
||||
verify(trackedEmoteService, times(1)).createFakeTrackedEmote(emoteToTrack, commandContext.getGuild());
|
||||
verify(trackedEmoteService, times(1)).createFakeTrackedEmote(emoteToTrack, commandContext.getGuild(), true);
|
||||
verify(featureModeService, times(1)).validateActiveFeatureMode(SERVER_ID, StatisticFeatures.EMOTE_TRACKING, EmoteTrackingMode.EXTERNAL_EMOTES);
|
||||
}
|
||||
|
||||
@Test(expected = IncorrectParameterException.class)
|
||||
|
||||
@@ -20,6 +20,7 @@ public interface TrackedEmoteService {
|
||||
TrackedEmoteOverview loadTrackedEmoteOverview(Guild guild);
|
||||
TrackedEmoteOverview loadTrackedEmoteOverview(Guild guild, Boolean showTrackingDisabled);
|
||||
TrackedEmote createFakeTrackedEmote(Emote emote, Guild guild);
|
||||
TrackedEmote createFakeTrackedEmote(Emote emote, Guild guild, boolean external);
|
||||
void deleteTrackedEmote(TrackedEmote trackedEmote);
|
||||
void resetEmoteStats(Guild guild);
|
||||
void disableEmoteTracking(Guild guild);
|
||||
|
||||
@@ -159,10 +159,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
|
||||
commandResult = self.executeCommand(foundCommand, commandContext);
|
||||
}
|
||||
} else {
|
||||
// TODO can it be done nicer?
|
||||
if(conditionResult.getException() != null) {
|
||||
throw conditionResult.getException();
|
||||
}
|
||||
commandResult = CommandResult.fromCondition(conditionResult);
|
||||
}
|
||||
if(commandResult != null) {
|
||||
self.executePostCommandListener(foundCommand, commandContext, commandResult);
|
||||
|
||||
@@ -4,7 +4,10 @@ import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandResult;
|
||||
import dev.sheldan.abstracto.core.command.execution.ResultState;
|
||||
import dev.sheldan.abstracto.core.command.models.condition.GenericConditionModel;
|
||||
import dev.sheldan.abstracto.core.command.service.PostCommandExecution;
|
||||
import dev.sheldan.abstracto.core.models.GuildChannelMember;
|
||||
import dev.sheldan.abstracto.core.service.ChannelService;
|
||||
import dev.sheldan.abstracto.core.service.MessageService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -12,17 +15,29 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
public class ConditionPostExecution implements PostCommandExecution {
|
||||
public static final String WARN_REACTION_EMOTE = "warnReaction";
|
||||
public static final String GENERIC_COMMAND_EXCEPTION_MODEL_KEY = "generic_condition_notification";
|
||||
|
||||
@Autowired
|
||||
private MessageService messageService;
|
||||
|
||||
@Autowired
|
||||
private ChannelService channelService;
|
||||
|
||||
@Override
|
||||
public void execute(CommandContext commandContext, CommandResult commandResult, Command command) {
|
||||
if(commandResult.getResult().equals(ResultState.CONDITION)) {
|
||||
if(commandResult.getResult().equals(ResultState.CONDITION) && commandResult.getConditionResult() != null && !commandResult.getConditionResult().isResult() && commandResult.getConditionResult().getConditionDetail() != null) {
|
||||
messageService.addReactionToMessage(WARN_REACTION_EMOTE, commandContext.getGuild().getIdLong(), commandContext.getMessage());
|
||||
if(commandResult.getConditionResult() != null && commandResult.getConditionResult().getReason() != null){
|
||||
commandContext.getChannel().sendMessage(commandResult.getConditionResult().getReason()).queue();
|
||||
}
|
||||
GenericConditionModel conditionModel = GenericConditionModel
|
||||
.builder()
|
||||
.conditionDetail(commandResult.getConditionResult().getConditionDetail())
|
||||
.guildChannelMember(GuildChannelMember
|
||||
.builder()
|
||||
.guild(commandContext.getGuild())
|
||||
.textChannel(commandContext.getChannel())
|
||||
.member(commandContext.getAuthor())
|
||||
.build())
|
||||
.build();
|
||||
channelService.sendEmbedTemplateInChannel(GENERIC_COMMAND_EXCEPTION_MODEL_KEY, conditionModel, commandContext.getChannel());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,10 +23,10 @@ public class ChannelGroupCommandServiceBean implements ChannelGroupCommandServic
|
||||
List<AChannelGroupCommand> allChannelGroupsOfCommand = channelGroupCommandService.getAllGroupCommandsForCommand(command);
|
||||
for (AChannelGroupCommand aChannelGroupCommand : allChannelGroupsOfCommand) {
|
||||
Optional<AChannel> channelInGroup = aChannelGroupCommand.getGroup()
|
||||
.getChannels().stream().filter(channel1 -> channel1.getId().equals(channel.getId())).findAny();
|
||||
if (channelInGroup.isPresent() && aChannelGroupCommand.getEnabled()) {
|
||||
log.trace("Command {} is enabled because the channel is part of group {} in server.", command.getName(), aChannelGroupCommand.getGroup().getId());
|
||||
return true;
|
||||
.getChannels().stream().filter(innerChannel -> innerChannel.getId().equals(channel.getId())).findAny();
|
||||
if (channelInGroup.isPresent() && !aChannelGroupCommand.getEnabled()) {
|
||||
log.trace("Command {} is disabled because the channel is part of group {} in server.", command.getName(), aChannelGroupCommand.getGroup().getId());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// empty -> no groups, command enabled
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package dev.sheldan.abstracto.core.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.command.service.management.FeatureManagementService;
|
||||
import dev.sheldan.abstracto.core.config.FeatureConfig;
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
@@ -14,10 +15,7 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -91,6 +89,14 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
||||
return featureModeActive(featureEnum, server, mode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validateActiveFeatureMode(Long serverId, FeatureEnum featureEnum, FeatureMode mode) {
|
||||
boolean featureModeActive = featureModeActive(featureEnum, serverId, mode);
|
||||
if(!featureModeActive) {
|
||||
throw new IncorrectFeatureModeException(featureEnum, Arrays.asList(mode));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public FeatureMode getFeatureModeForKey(String key) {
|
||||
return getAllAvailableFeatureModes().stream().filter(mode -> mode.getKey().equalsIgnoreCase(key)).findAny().orElseThrow(() -> new FeatureModeNotFoundException(key, getFeatureModesAsStrings()));
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.command.condition;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.exception.CommandDisabledException;
|
||||
import dev.sheldan.abstracto.core.command.condition.detail.CommandDisabledDetail;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.models.database.ACommand;
|
||||
import dev.sheldan.abstracto.core.command.service.ChannelGroupCommandService;
|
||||
@@ -21,10 +21,10 @@ public class CommandDisabledCondition implements CommandCondition {
|
||||
@Override
|
||||
public ConditionResult shouldExecute(CommandContext context, Command command) {
|
||||
ACommand acommand = commandManagementService.findCommandByName(command.getConfiguration().getName());
|
||||
Boolean booleanResult = channelGroupCommandService.isCommandEnabled(acommand, context.getUserInitiatedContext().getChannel());
|
||||
if(!booleanResult) {
|
||||
return ConditionResult.builder().result(true).exception(new CommandDisabledException()).build();
|
||||
Boolean commandEnabled = channelGroupCommandService.isCommandEnabled(acommand, context.getUserInitiatedContext().getChannel());
|
||||
if(!commandEnabled) {
|
||||
return ConditionResult.builder().result(false).conditionDetail(new CommandDisabledDetail()).build();
|
||||
}
|
||||
return ConditionResult.builder().result(true).reason("Command is enabled.").build();
|
||||
return ConditionResult.builder().result(true).build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.command.condition;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.exception.InsufficientPermissionException;
|
||||
import dev.sheldan.abstracto.core.command.condition.detail.InsufficientPermissionConditionDetail;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.models.database.ACommand;
|
||||
import dev.sheldan.abstracto.core.command.models.database.ACommandInAServer;
|
||||
@@ -50,7 +50,7 @@ public class CommandDisallowedCondition implements CommandCondition {
|
||||
}
|
||||
}
|
||||
List<Role> allowedRoles = roleService.getRolesFromGuild(commandForServer.getAllowedRoles());
|
||||
InsufficientPermissionException exception = new InsufficientPermissionException(allowedRoles);
|
||||
return ConditionResult.builder().result(false).exception(exception).build();
|
||||
InsufficientPermissionConditionDetail exception = new InsufficientPermissionConditionDetail(allowedRoles);
|
||||
return ConditionResult.builder().result(false).conditionDetail(exception).build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package dev.sheldan.abstracto.core.command.condition;
|
||||
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
|
||||
public interface ConditionDetail extends Templatable {
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package dev.sheldan.abstracto.core.command.condition;
|
||||
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -11,6 +10,5 @@ import lombok.Setter;
|
||||
public class ConditionResult {
|
||||
private boolean result;
|
||||
private String reason;
|
||||
private Object additionalInfo;
|
||||
private AbstractoRunTimeException exception;
|
||||
private ConditionDetail conditionDetail;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.command.condition;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.exception.FeatureDisabledException;
|
||||
import dev.sheldan.abstracto.core.command.condition.detail.FeatureDisabledConditionDetail;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
||||
@@ -32,8 +32,8 @@ public class FeatureEnabledCondition implements CommandCondition {
|
||||
featureFlagValue = featureFlagService.getFeatureFlagValue(feature, context.getGuild().getIdLong());
|
||||
if(!featureFlagValue) {
|
||||
log.trace("Feature {} is disabled, disallows command {} to be executed in guild {}.", feature.getKey(), command.getConfiguration().getName(), context.getGuild().getId());
|
||||
FeatureDisabledException exception = new FeatureDisabledException(featureConfigService.getFeatureDisplayForFeature(command.getFeature()));
|
||||
return ConditionResult.builder().result(false).exception(exception).build();
|
||||
FeatureDisabledConditionDetail exception = new FeatureDisabledConditionDetail(featureConfigService.getFeatureDisplayForFeature(command.getFeature()));
|
||||
return ConditionResult.builder().result(false).conditionDetail(exception).build();
|
||||
}
|
||||
}
|
||||
return ConditionResult.builder().result(true).build();
|
||||
|
||||
@@ -4,7 +4,7 @@ import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.FeatureMode;
|
||||
import dev.sheldan.abstracto.core.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.command.condition.detail.IncorrectFeatureModeConditionDetail;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -25,7 +25,11 @@ public class FeatureModeCondition implements CommandCondition {
|
||||
return ConditionResult.builder().result(true).build();
|
||||
}
|
||||
}
|
||||
throw new IncorrectFeatureModeException(feature, command.getFeatureModeLimitations());
|
||||
return ConditionResult
|
||||
.builder()
|
||||
.result(false)
|
||||
.conditionDetail(new IncorrectFeatureModeConditionDetail(feature, command.getFeatureModeLimitations()))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.command.condition;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.exception.ImmuneUserException;
|
||||
import dev.sheldan.abstracto.core.command.condition.detail.ImmuneUserConditionDetail;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.command.models.database.ACommand;
|
||||
import dev.sheldan.abstracto.core.command.models.database.ACommandInAServer;
|
||||
@@ -43,8 +43,8 @@ public class ImmuneUserCondition implements CommandCondition {
|
||||
for (ARole role : commandForServer.getImmuneRoles()) {
|
||||
if (roleService.memberHasRole(member, role)) {
|
||||
log.trace("Member {} is immune against command {}, because of role {}.", member.getIdLong(), aCommand.getName(), role.getId());
|
||||
ImmuneUserException exception = new ImmuneUserException(roleService.getRoleFromGuild(role));
|
||||
return ConditionResult.builder().result(false).exception(exception).build();
|
||||
ImmuneUserConditionDetail exception = new ImmuneUserConditionDetail(roleService.getRoleFromGuild(role));
|
||||
return ConditionResult.builder().result(false).conditionDetail(exception).build();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package dev.sheldan.abstracto.core.command.condition.detail;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionDetail;
|
||||
|
||||
public class CommandDisabledDetail implements ConditionDetail {
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "command_disabled_condition";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return new Object();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package dev.sheldan.abstracto.core.command.condition.detail;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionDetail;
|
||||
import dev.sheldan.abstracto.core.command.models.condition.FeatureDisabledConditionDetailModel;
|
||||
import dev.sheldan.abstracto.core.config.FeatureConfig;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class FeatureDisabledConditionDetail implements ConditionDetail {
|
||||
|
||||
private final FeatureDisabledConditionDetailModel model;
|
||||
|
||||
public FeatureDisabledConditionDetail(FeatureConfig featureConfig) {
|
||||
this.model = FeatureDisabledConditionDetailModel.builder().featureConfig(featureConfig).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "feature_disabled_condition";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package dev.sheldan.abstracto.core.command.condition.detail;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionDetail;
|
||||
import dev.sheldan.abstracto.core.command.models.condition.ImmuneUserConditionDetailModel;
|
||||
import net.dv8tion.jda.api.entities.Role;
|
||||
|
||||
public class ImmuneUserConditionDetail implements ConditionDetail {
|
||||
|
||||
private final ImmuneUserConditionDetailModel model;
|
||||
|
||||
public ImmuneUserConditionDetail(Role role) {
|
||||
this.model = ImmuneUserConditionDetailModel.builder().role(role).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "immune_role_condition";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package dev.sheldan.abstracto.core.command.condition.detail;
|
||||
|
||||
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionDetail;
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.FeatureMode;
|
||||
import dev.sheldan.abstracto.core.models.exception.IncorrectFeatureModeModel;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class IncorrectFeatureModeConditionDetail implements ConditionDetail {
|
||||
|
||||
private final IncorrectFeatureModeModel model;
|
||||
|
||||
public IncorrectFeatureModeConditionDetail(FeatureEnum featureEnum, List<FeatureMode> requiredModes) {
|
||||
this.model = IncorrectFeatureModeModel.builder().featureEnum(featureEnum).requiredModes(requiredModes).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "incorrect_feature_mode_condition";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package dev.sheldan.abstracto.core.command.condition.detail;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionDetail;
|
||||
import dev.sheldan.abstracto.core.command.models.condition.InsufficientPermissionCondtionDetailModel;
|
||||
import net.dv8tion.jda.api.entities.Role;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InsufficientPermissionConditionDetail implements ConditionDetail {
|
||||
|
||||
private final InsufficientPermissionCondtionDetailModel model;
|
||||
|
||||
public InsufficientPermissionConditionDetail(List<Role> allowedRoles) {
|
||||
this.model = InsufficientPermissionCondtionDetailModel.builder().allowedRoles(allowedRoles).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "insufficient_role_condition";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package dev.sheldan.abstracto.core.command.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
|
||||
public class CommandDisabledException extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "command_disabled_exception";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return new Object();
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package dev.sheldan.abstracto.core.command.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.models.exception.FeatureDisabledExceptionModel;
|
||||
import dev.sheldan.abstracto.core.config.FeatureConfig;
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class FeatureDisabledException extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
private final FeatureDisabledExceptionModel model;
|
||||
|
||||
public FeatureDisabledException(FeatureConfig featureConfig) {
|
||||
super("Feature has been disabled");
|
||||
this.model = FeatureDisabledExceptionModel.builder().featureConfig(featureConfig).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "feature_disabled_exception";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package dev.sheldan.abstracto.core.command.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.models.exception.ImmuneUserExceptionModel;
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
import net.dv8tion.jda.api.entities.Role;
|
||||
|
||||
public class ImmuneUserException extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
private final transient ImmuneUserExceptionModel model;
|
||||
|
||||
public ImmuneUserException(Role role) {
|
||||
super("User is immune against the command");
|
||||
this.model = ImmuneUserExceptionModel.builder().role(role).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "immune_role_exception";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,18 @@
|
||||
package dev.sheldan.abstracto.core.exception;
|
||||
|
||||
package dev.sheldan.abstracto.core.command.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.FeatureMode;
|
||||
import dev.sheldan.abstracto.core.models.exception.IncorrectFeatureModeExceptionModel;
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.core.models.exception.IncorrectFeatureModeModel;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class IncorrectFeatureModeException extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
private final IncorrectFeatureModeExceptionModel model;
|
||||
private final IncorrectFeatureModeModel model;
|
||||
|
||||
public IncorrectFeatureModeException(FeatureEnum featureEnum, List<FeatureMode> requiredModes) {
|
||||
super("Incorrect feature mode for the command.");
|
||||
this.model = IncorrectFeatureModeExceptionModel.builder().featureEnum(featureEnum).requiredModes(requiredModes).build();
|
||||
this.model = IncorrectFeatureModeModel.builder().featureEnum(featureEnum).requiredModes(requiredModes).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1,28 +0,0 @@
|
||||
package dev.sheldan.abstracto.core.command.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.models.exception.InsufficientPermissionExceptionModel;
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
import net.dv8tion.jda.api.entities.Role;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InsufficientPermissionException extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
private final InsufficientPermissionExceptionModel model;
|
||||
|
||||
public InsufficientPermissionException(List<Role> allowedRoles) {
|
||||
super("Insufficient permissions, required role not given.");
|
||||
this.model = InsufficientPermissionExceptionModel.builder().allowedRoles(allowedRoles).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "insufficient_role_exception";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package dev.sheldan.abstracto.core.command.models.exception;
|
||||
package dev.sheldan.abstracto.core.command.models.condition;
|
||||
|
||||
import dev.sheldan.abstracto.core.config.FeatureConfig;
|
||||
import lombok.Builder;
|
||||
@@ -10,6 +10,6 @@ import java.io.Serializable;
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
public class FeatureDisabledExceptionModel implements Serializable {
|
||||
public class FeatureDisabledConditionDetailModel implements Serializable {
|
||||
private FeatureConfig featureConfig;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package dev.sheldan.abstracto.core.command.models.condition;
|
||||
|
||||
import dev.sheldan.abstracto.core.command.condition.ConditionDetail;
|
||||
import dev.sheldan.abstracto.core.models.GuildChannelMember;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class GenericConditionModel {
|
||||
private GuildChannelMember guildChannelMember;
|
||||
private ConditionDetail conditionDetail;
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package dev.sheldan.abstracto.core.command.models.exception;
|
||||
package dev.sheldan.abstracto.core.command.models.condition;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
@@ -8,6 +8,6 @@ import net.dv8tion.jda.api.entities.Role;
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class ImmuneUserExceptionModel {
|
||||
public class ImmuneUserConditionDetailModel {
|
||||
private Role role;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package dev.sheldan.abstracto.core.command.models.exception;
|
||||
package dev.sheldan.abstracto.core.command.models.condition;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
@@ -9,6 +9,6 @@ import java.util.List;
|
||||
|
||||
@Getter
|
||||
@Builder
|
||||
public class InsufficientPermissionExceptionModel implements Serializable {
|
||||
public class InsufficientPermissionCondtionDetailModel implements Serializable {
|
||||
private transient List<Role> allowedRoles;
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.config;
|
||||
|
||||
public interface FeatureEnum {
|
||||
import java.io.Serializable;
|
||||
|
||||
public interface FeatureEnum extends Serializable {
|
||||
String getKey();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package dev.sheldan.abstracto.core.config;
|
||||
|
||||
public interface FeatureMode {
|
||||
import java.io.Serializable;
|
||||
|
||||
public interface FeatureMode extends Serializable {
|
||||
String getKey();
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.util.List;
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class IncorrectFeatureModeExceptionModel implements Serializable {
|
||||
public class IncorrectFeatureModeModel implements Serializable {
|
||||
private List<FeatureMode> requiredModes;
|
||||
private FeatureEnum featureEnum;
|
||||
}
|
||||
@@ -15,6 +15,7 @@ public interface FeatureModeService {
|
||||
void disableFeatureModeForFeature(FeatureEnum featureEnum, AServer server, FeatureMode mode);
|
||||
boolean featureModeActive(FeatureEnum featureEnum, AServer server, FeatureMode mode);
|
||||
boolean featureModeActive(FeatureEnum featureEnum, Long serverId, FeatureMode mode);
|
||||
void validateActiveFeatureMode(Long serverId, FeatureEnum featureEnum, FeatureMode mode);
|
||||
FeatureMode getFeatureModeForKey(String key);
|
||||
List<FeatureMode> getAllAvailableFeatureModes();
|
||||
List<FeatureModeDisplay> getEffectiveFeatureModes(AServer server);
|
||||
|
||||
@@ -4,7 +4,6 @@ import dev.sheldan.abstracto.core.command.Command;
|
||||
import dev.sheldan.abstracto.core.command.execution.CommandContext;
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
import dev.sheldan.abstracto.core.config.FeatureMode;
|
||||
import dev.sheldan.abstracto.core.exception.IncorrectFeatureModeException;
|
||||
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.service.FeatureModeService;
|
||||
@@ -63,13 +62,13 @@ public class FeatureModeConditionTest {
|
||||
CommandTestUtilities.checkSuccessfulCondition(testUnit.shouldExecute(commandContext, command));
|
||||
}
|
||||
|
||||
@Test(expected = IncorrectFeatureModeException.class)
|
||||
@Test
|
||||
public void testLimitedCommand() {
|
||||
when(commandContext.getUserInitiatedContext()).thenReturn(userInitiatedServerContext);
|
||||
when(userInitiatedServerContext.getServer()).thenReturn(server);
|
||||
when(command.getFeature()).thenReturn(featureEnum);
|
||||
when(modeService.featureModeActive(featureEnum, server, featureMode)).thenReturn(false);
|
||||
when(command.getFeatureModeLimitations()).thenReturn(Arrays.asList(featureMode));
|
||||
testUnit.shouldExecute(commandContext, command);
|
||||
CommandTestUtilities.checkUnmetCondition(testUnit.shouldExecute(commandContext, command));
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,11 @@ public class CommandTestUtilities {
|
||||
Assert.assertTrue(result.isResult());
|
||||
}
|
||||
|
||||
public static void checkUnmetCondition(ConditionResult result) {
|
||||
Assert.assertFalse(result.isResult());
|
||||
Assert.assertNotNull(result.getConditionDetail());
|
||||
}
|
||||
|
||||
public static void executeNoParametersTest(Command com) {
|
||||
CommandContext context = CommandTestUtilities.getNoParameters();
|
||||
com.execute(context);
|
||||
|
||||
Reference in New Issue
Block a user