From e2da800d84e025382f8e67724487c7a84c7fbc64 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Wed, 10 Mar 2021 01:10:27 +0100 Subject: [PATCH] [AB-124] adding admin mode --- .../core/commands/config/SetAdminMode.java | 51 +++++++++++++++++++ .../core/service/ChannelServiceBean.java | 2 +- .../core/service/ServerServiceBean.java | 50 ++++++++++++++++++ .../ServerManagementServiceBean.java | 2 +- .../1.0-core/core-seedData/command.xml | 6 +++ .../1.0-core/core-tables/server.xml | 3 ++ .../AbstractConditionableCommand.java | 5 +- .../command/condition/AdminModeCondition.java | 31 +++++++++++ .../condition/detail/AdminModeDetail.java | 15 ++++++ .../core/models/database/AServer.java | 4 ++ .../abstracto/core/service/ServerService.java | 14 +++++ .../src/main/docs/asciidoc/modules/core.adoc | 3 ++ 12 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/SetAdminMode.java create mode 100644 abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ServerServiceBean.java create mode 100644 abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AdminModeCondition.java create mode 100644 abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/detail/AdminModeDetail.java create mode 100644 abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ServerService.java diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/SetAdminMode.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/SetAdminMode.java new file mode 100644 index 000000000..a3e7c8a29 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/config/SetAdminMode.java @@ -0,0 +1,51 @@ +package dev.sheldan.abstracto.core.commands.config; + +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.features.CoreFeatures; +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.service.ServerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class SetAdminMode extends AbstractConditionableCommand { + + @Autowired + private ServerService serverService; + + @Override + public CommandResult execute(CommandContext commandContext) { + Boolean newState = (Boolean) commandContext.getParameters().getParameters().get(0); + serverService.setAdminModeTo(commandContext.getGuild().getIdLong(), newState); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + Parameter valueToSet = Parameter.builder().name("value").type(Boolean.class).templated(true).build(); + List parameters = Arrays.asList(valueToSet); + HelpInfo helpInfo = HelpInfo.builder().templated(true).hasExample(true).build(); + return CommandConfiguration.builder() + .name("setAdminMode") + .module(ConfigModuleInterface.CONFIG) + .parameters(parameters) + .templated(true) + .supportsEmbedException(true) + .help(helpInfo) + .causesReaction(true) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return CoreFeatures.CORE_FEATURE; + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java index a3482676f..811bcf71a 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ChannelServiceBean.java @@ -390,7 +390,7 @@ public class ChannelServiceBean implements ChannelService { public AChannel getFakeChannelFromTextChannel(TextChannel textChannel) { AServer server = AServer .builder() - .id(textChannel.getIdLong()) + .id(textChannel.getGuild().getIdLong()) .fake(true) .build(); return AChannel diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ServerServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ServerServiceBean.java new file mode 100644 index 000000000..c37de0c9a --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/ServerServiceBean.java @@ -0,0 +1,50 @@ +package dev.sheldan.abstracto.core.service; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import net.dv8tion.jda.api.entities.Guild; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ServerServiceBean implements ServerService { + + @Autowired + private ServerManagementService serverManagementService; + + @Override + public boolean adminModeActive(Long id) { + return serverManagementService.loadServer(id).getAdminMode(); + } + + @Override + public boolean adminModeActive(Guild guild) { + return adminModeActive(guild.getIdLong()); + } + + @Override + public void setAdminModeTo(Long id, Boolean newState) { + AServer server = serverManagementService.loadServer(id); + server.setAdminMode(newState); + } + + @Override + public void setAdminModeTo(Guild guild, Boolean newState) { + setAdminModeTo(guild.getIdLong(), newState); + } + + @Override + public void setAdminModeTo(AServer server, Boolean newState) { + server.setAdminMode(newState); + } + + @Override + public void activateAdminMode(Long id) { + setAdminModeTo(id, true); + } + + @Override + public void deactivateAdminMode(Long id) { + setAdminModeTo(id, false); + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java index a831db063..ae2b9a638 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/ServerManagementServiceBean.java @@ -26,7 +26,7 @@ public class ServerManagementServiceBean implements ServerManagementService { @Override public AServer createServer(Long id) { - AServer newServer = AServer.builder().id(id).build(); + AServer newServer = AServer.builder().id(id).adminMode(false).build(); log.info("Creating server with id {}.", id); return repository.save(newServer); } diff --git a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-seedData/command.xml b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-seedData/command.xml index b4a3be192..0ead4c85c 100644 --- a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-seedData/command.xml +++ b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-seedData/command.xml @@ -97,6 +97,12 @@ + + + + + + diff --git a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/server.xml b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/server.xml index c81ad94b0..7d1976e21 100644 --- a/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/server.xml +++ b/abstracto-application/core/core-impl/src/main/resources/migrations/1.0-core/core-tables/server.xml @@ -14,6 +14,9 @@ + + + diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AbstractConditionableCommand.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AbstractConditionableCommand.java index 8c7221e87..298701d8d 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AbstractConditionableCommand.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AbstractConditionableCommand.java @@ -29,10 +29,13 @@ public abstract class AbstractConditionableCommand implements ConditionalCommand @Autowired private FeatureModeCondition featureModeCondition; + @Autowired + private AdminModeCondition adminModeCondition; + @Override public List getConditions() { - return new ArrayList<>(Arrays.asList(featureEnabledCondition, commandDisabledCondition, commandDisallowedCondition, featureModeCondition)); + return new ArrayList<>(Arrays.asList(adminModeCondition, featureEnabledCondition, commandDisabledCondition, commandDisallowedCondition, featureModeCondition)); } protected void checkParameters(CommandContext context) { diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AdminModeCondition.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AdminModeCondition.java new file mode 100644 index 000000000..addcdeb87 --- /dev/null +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/AdminModeCondition.java @@ -0,0 +1,31 @@ +package dev.sheldan.abstracto.core.command.condition; + +import dev.sheldan.abstracto.core.command.Command; +import dev.sheldan.abstracto.core.command.condition.detail.AdminModeDetail; +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.service.ServerService; +import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.Permission; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class AdminModeCondition implements CommandCondition { + + @Autowired + private ServerService service; + + @Override + public ConditionResult shouldExecute(CommandContext context, Command command) { + boolean adminModeActive = service.adminModeActive(context.getGuild()); + if(adminModeActive){ + if(context.getAuthor().hasPermission(Permission.ADMINISTRATOR)) { + return ConditionResult.builder().result(true).build(); + } else { + return ConditionResult.builder().result(false).conditionDetail(new AdminModeDetail()).build(); + } + } + return ConditionResult.builder().result(true).build(); + } +} diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/detail/AdminModeDetail.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/detail/AdminModeDetail.java new file mode 100644 index 000000000..c81bd6c7c --- /dev/null +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/command/condition/detail/AdminModeDetail.java @@ -0,0 +1,15 @@ +package dev.sheldan.abstracto.core.command.condition.detail; + +import dev.sheldan.abstracto.core.command.condition.ConditionDetail; + +public class AdminModeDetail implements ConditionDetail { + @Override + public String getTemplateName() { + return "admin_mode_enabled_condition"; + } + + @Override + public Object getTemplateModel() { + return new Object(); + } +} diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/models/database/AServer.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/models/database/AServer.java index c6e4edd35..14a472125 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/models/database/AServer.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/models/database/AServer.java @@ -28,6 +28,10 @@ public class AServer implements SnowFlake, Serializable { @Column(name = "updated") private Instant updated; + @Setter + @Column(name = "admin_mode") + private Boolean adminMode; + @Transient private boolean fake; diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ServerService.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ServerService.java new file mode 100644 index 000000000..33ff9ee04 --- /dev/null +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/ServerService.java @@ -0,0 +1,14 @@ +package dev.sheldan.abstracto.core.service; + +import dev.sheldan.abstracto.core.models.database.AServer; +import net.dv8tion.jda.api.entities.Guild; + +public interface ServerService { + boolean adminModeActive(Long id); + boolean adminModeActive(Guild guild); + void setAdminModeTo(Long id, Boolean newState); + void setAdminModeTo(Guild guild, Boolean newState); + void setAdminModeTo(AServer server, Boolean newState); + void activateAdminMode(Long id); + void deactivateAdminMode(Long id); +} diff --git a/abstracto-application/documentation/src/main/docs/asciidoc/modules/core.adoc b/abstracto-application/documentation/src/main/docs/asciidoc/modules/core.adoc index 0f601ea49..6d5c0ec3b 100644 --- a/abstracto-application/documentation/src/main/docs/asciidoc/modules/core.adoc +++ b/abstracto-application/documentation/src/main/docs/asciidoc/modules/core.adoc @@ -42,6 +42,9 @@ Changing a post target:: * Description: Changes the given post target identified by `key` to the given channel. All messages using this post target will be send to this channel from now on. If neither `key` nor `channel` is given, this will print the currently available post targets and the channels they point to, if set. * Example: `posttarget banLog #general` to log the bans in the #general channel. +Changing admin mode:: +* Usage: `setAdminMode ` +* Description: Changes the admin modes on this server to the given value. Admin mode means, that **all** commands in the current server, can only be executed by members who have the ADMINISTRATOR permission. Listing the features:: * Usage: `features` * Description: Lists the available features and whether or not they are enabled in this server.