diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/HoneyPotRoleAddedListener.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/HoneyPotRoleAddedListener.java index 645685775..e0ddaa32e 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/HoneyPotRoleAddedListener.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/listener/HoneyPotRoleAddedListener.java @@ -4,19 +4,28 @@ import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.config.ListenerPriority; import dev.sheldan.abstracto.core.listener.DefaultListenerResult; import dev.sheldan.abstracto.core.listener.sync.jda.RoleAddedListener; +import dev.sheldan.abstracto.core.models.ConditionContextInstance; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.models.listener.RoleAddedModel; import dev.sheldan.abstracto.core.models.template.display.MemberDisplay; import dev.sheldan.abstracto.core.models.template.display.RoleDisplay; +import dev.sheldan.abstracto.core.service.ConditionService; import dev.sheldan.abstracto.core.service.ConfigService; +import dev.sheldan.abstracto.core.service.SystemCondition; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.templating.service.TemplateService; import dev.sheldan.abstracto.moderation.config.feature.HoneyPotFeatureConfig; import dev.sheldan.abstracto.moderation.config.feature.ModerationFeatureDefinition; import dev.sheldan.abstracto.moderation.model.listener.HoneyPotReasonModel; import dev.sheldan.abstracto.moderation.service.BanService; import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.Member; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.HashMap; +import java.util.Map; + @Component @Slf4j public class HoneyPotRoleAddedListener implements RoleAddedListener { @@ -30,8 +39,20 @@ public class HoneyPotRoleAddedListener implements RoleAddedListener { @Autowired private TemplateService templateService; + @Autowired + private ConditionService conditionService; + + @Autowired + private UserInServerManagementService userInServerManagementService; + private static final String HONEYPOT_BAN_REASON_TEMPLATE = "honeypot_ban_reason"; + private static final String LEVEL_CONDITION_USER_ID_PARAMETER = "userId"; + private static final String LEVEL_CONDITION_LEVEL_PARAMETER = "level"; + private static final String LEVEL_CONDITION_SERVER_PARAMETER = "serverId"; + + private static final String LEVEL_CONDITION_NAME = "HAS_LEVEL"; + @Override public DefaultListenerResult execute(RoleAddedModel model) { Long roleId = configService.getLongValueOrConfigDefault(HoneyPotFeatureConfig.HONEYPOT_ROLE_ID, model.getServerId()); @@ -40,24 +61,47 @@ public class HoneyPotRoleAddedListener implements RoleAddedListener { return DefaultListenerResult.IGNORED; } if(roleId.equals(model.getRoleId())) { - log.info("Banning user {} in guild {} due to role {}.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), model.getRoleId()); - HoneyPotReasonModel reasonModel = HoneyPotReasonModel - .builder() - .memberDisplay(MemberDisplay.fromMember(model.getTargetMember())) - .roleDisplay(RoleDisplay.fromRole(model.getRole())) - .build(); - String banReason = templateService.renderTemplate(HONEYPOT_BAN_REASON_TEMPLATE, reasonModel); - banService.banUserWithNotification(model.getTargetMember().getUser(), banReason, model.getTargetMember().getGuild().getSelfMember(), null).thenAccept(banResult -> { - log.info("Banned user {} in guild {} due to role {}.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), model.getRoleId()); - }).exceptionally(throwable -> { - log.error("Failed to ban user {} in guild {} due to role {}.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), model.getRoleId(), throwable); - return null; - }); + Integer levelToSkipBan = configService.getLongValueOrConfigDefault(HoneyPotFeatureConfig.HONEYPOT_IGNORED_LEVEL, model.getServerId()).intValue(); + boolean allowed = userHasLevel(model.getTargetMember(), levelToSkipBan); + if(allowed) { + log.info("User {} in server {} has at least level {} and will not get banned by honey pot.", + model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), levelToSkipBan); + } else { + log.info("Banning user {} in guild {} due to role {}.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), model.getRoleId()); + HoneyPotReasonModel reasonModel = HoneyPotReasonModel + .builder() + .memberDisplay(MemberDisplay.fromMember(model.getTargetMember())) + .roleDisplay(RoleDisplay.fromRole(model.getRole())) + .build(); + String banReason = templateService.renderTemplate(HONEYPOT_BAN_REASON_TEMPLATE, reasonModel); + banService.banUserWithNotification(model.getTargetMember().getUser(), banReason, model.getTargetMember().getGuild().getSelfMember(), null).thenAccept(banResult -> { + log.info("Banned user {} in guild {} due to role {}.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), model.getRoleId()); + }).exceptionally(throwable -> { + log.error("Failed to ban user {} in guild {} due to role {}.", model.getTargetUser().getUserId(), model.getTargetUser().getServerId(), model.getRoleId(), throwable); + return null; + }); + } return DefaultListenerResult.PROCESSED; } return DefaultListenerResult.IGNORED; } + private boolean userHasLevel(Member member, Integer level) { + log.info("Checking if member {} is ignored to click on the honeypot in server {}.", member.getIdLong(),member.getGuild().getIdLong()); + Map parameters = new HashMap<>(); + AUserInAServer userInAServer = userInServerManagementService.loadOrCreateUser(member); + parameters.put(LEVEL_CONDITION_USER_ID_PARAMETER, userInAServer.getUserInServerId()); + parameters.put(LEVEL_CONDITION_LEVEL_PARAMETER, level); + parameters.put(LEVEL_CONDITION_SERVER_PARAMETER, member.getGuild().getIdLong()); + ConditionContextInstance contextInstance = ConditionContextInstance + .builder() + .conditionName(LEVEL_CONDITION_NAME) + .parameters(parameters) + .build(); + SystemCondition.Result result = conditionService.checkConditions(contextInstance); + return SystemCondition.Result.isSuccessful(result); + } + @Override public FeatureDefinition getFeature() { return ModerationFeatureDefinition.HONEYPOT; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation-config.properties b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation-config.properties index 96d281956..c4f28bb56 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation-config.properties +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation-config.properties @@ -98,5 +98,8 @@ abstracto.featureModes.notifyMemberWarningDecays.enabled=true abstracto.systemConfigs.honeypotRoleId.name=honeypotRoleId abstracto.systemConfigs.honeypotRoleId.longValue=0 +abstracto.systemConfigs.honeyPotIgnoredLevel.name=honeyPotIgnoredLevel +abstracto.systemConfigs.honeyPotIgnoredLevel.longValue=100 + abstracto.featureFlags.honeypot.featureName=honeypot abstracto.featureFlags.honeypot.enabled=false diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/feature/HoneyPotFeatureConfig.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/feature/HoneyPotFeatureConfig.java index 08650522f..c6fa1f6e1 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/feature/HoneyPotFeatureConfig.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/feature/HoneyPotFeatureConfig.java @@ -11,6 +11,7 @@ import java.util.List; public class HoneyPotFeatureConfig implements FeatureConfig { public static final String HONEYPOT_ROLE_ID = "honeypotRoleId"; + public static final String HONEYPOT_IGNORED_LEVEL = "honeypotIgnoredLevel"; @Override public FeatureDefinition getFeature() { @@ -19,6 +20,6 @@ public class HoneyPotFeatureConfig implements FeatureConfig { @Override public List getRequiredSystemConfigKeys() { - return Arrays.asList(HONEYPOT_ROLE_ID); + return Arrays.asList(HONEYPOT_ROLE_ID, HONEYPOT_IGNORED_LEVEL); } } diff --git a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/SystemCondition.java b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/SystemCondition.java index 07f89af1e..b9d90f2b4 100644 --- a/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/SystemCondition.java +++ b/abstracto-application/core/core-int/src/main/java/dev/sheldan/abstracto/core/service/SystemCondition.java @@ -18,5 +18,9 @@ public interface SystemCondition { public static boolean consideredSuccessful(Result result) { return result == Result.SUCCESSFUL || result == Result.IGNORED; } + + public static boolean isSuccessful(Result result) { + return result == Result.SUCCESSFUL; + } } }