diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Ban.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Ban.java index 6e2422f75..79f552197 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Ban.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Ban.java @@ -52,7 +52,7 @@ public class Ban implements Command { public CommandConfiguration getConfiguration() { List parameters = new ArrayList<>(); parameters.add(Parameter.builder().name("user").type(Member.class).optional(false).build()); - parameters.add(Parameter.builder().name("reason").type(String.class).optional(false).remainder(true).build()); + parameters.add(Parameter.builder().name("reason").type(String.class).optional(true).remainder(true).build()); HelpInfo helpInfo = HelpInfo.builder().usageTemplate("ban_usage").longHelpTemplate("ban_long_help").build(); return CommandConfiguration.builder() .name("ban") diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Kick.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Kick.java new file mode 100644 index 000000000..bb692a7d0 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/command/Kick.java @@ -0,0 +1,63 @@ +package dev.sheldan.abstracto.moderation.command; + +import dev.sheldan.abstracto.command.Command; +import dev.sheldan.abstracto.command.HelpInfo; +import dev.sheldan.abstracto.command.execution.CommandConfiguration; +import dev.sheldan.abstracto.command.execution.CommandContext; +import dev.sheldan.abstracto.command.execution.Parameter; +import dev.sheldan.abstracto.command.execution.Result; +import dev.sheldan.abstracto.moderation.Moderation; +import dev.sheldan.abstracto.moderation.models.BanLog; +import dev.sheldan.abstracto.moderation.models.KickLogModel; +import dev.sheldan.abstracto.moderation.service.KickServiceBean; +import dev.sheldan.abstracto.templating.TemplateService; +import net.dv8tion.jda.api.entities.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class Kick implements Command { + + @Autowired + private TemplateService templateService; + + @Autowired + private KickServiceBean kickService; + @Override + public Result execute(CommandContext commandContext) { + + List parameters = commandContext.getParameters().getParameters(); + Member member = (Member) parameters.get(0); + String defaultReason = templateService.renderTemplate("ban_default_reason", null); + String reason = parameters.size() == 2 ? (String) parameters.get(1) : defaultReason; + kickService.kickMember(member, reason); + KickLogModel kickLogModel = KickLogModel + .parentBuilder() + .commandTemplateContext(commandContext.getCommandTemplateContext()) + .kickedUser(member) + .kickingUser(commandContext.getAuthor()) + .reason(reason) + .build(); + kickService.sendKickLog(kickLogModel); + return Result.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("user").type(Member.class).optional(false).build()); + parameters.add(Parameter.builder().name("reason").type(String.class).optional(true).remainder(true).build()); + HelpInfo helpInfo = HelpInfo.builder().usageTemplate("kick_usage").longHelpTemplate("kick_long_help").build(); + return CommandConfiguration.builder() + .name("kick") + .module(Moderation.MODERATION) + .descriptionTemplate("kick_help_description") + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java index 27157f66e..29db5a796 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/BanServiceBean.java @@ -39,6 +39,6 @@ public class BanServiceBean implements BanService { @Override public void sendBanLog(BanLog banLog) { String warnLogMessage = templateService.renderTemplate(BAN_LOG_TEMPLATE, banLog); - postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.WARN_LOG, banLog.getServer().getId()); + postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.BAN_LOG, banLog.getServer().getId()); } } diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java new file mode 100644 index 000000000..6cbc29ffa --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/KickServiceBean.java @@ -0,0 +1,43 @@ +package dev.sheldan.abstracto.moderation.service; + +import dev.sheldan.abstracto.core.models.PostTarget; +import dev.sheldan.abstracto.core.service.Bot; +import dev.sheldan.abstracto.core.service.PostTargetService; +import dev.sheldan.abstracto.moderation.models.KickLogModel; +import dev.sheldan.abstracto.templating.TemplateService; +import lombok.extern.slf4j.Slf4j; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class KickServiceBean implements KickService { + + public static final String KICK_LOG_TEMPLATE = "kick_log"; + @Autowired + private Bot bot; + + @Autowired + private TemplateService templateService; + + @Autowired + private PostTargetService postTargetService; + + @Override + public void kickMember(Member member, String reason) { + Guild guildById = bot.getInstance().getGuildById(member.getGuild().getIdLong()); + if(guildById != null) { + guildById.kick(member, reason).queue(); + } else { + log.warn("Failed to kick member {} from guild {}. Guild was not found.", member.getId(), member.getGuild().getId()); + } + } + + @Override + public void sendKickLog(KickLogModel kickLogModel) { + String warnLogMessage = templateService.renderTemplate(KICK_LOG_TEMPLATE, kickLogModel); + postTargetService.sendTextInPostTarget(warnLogMessage, PostTarget.WARN_LOG, kickLogModel.getServer().getId()); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_default_reason_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_default_reason_en_US.ftl new file mode 100644 index 000000000..56f334261 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_default_reason_en_US.ftl @@ -0,0 +1 @@ +default reason \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_help_description_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_help_description_en_US.ftl new file mode 100644 index 000000000..8224af7d2 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_help_description_en_US.ftl @@ -0,0 +1 @@ +Kicks the user with the given reason \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_log_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_log_en_US.ftl new file mode 100644 index 000000000..b0599670e --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_log_en_US.ftl @@ -0,0 +1 @@ +User ${kickedUser.effectiveName} (${kickedUser.asMention}) has been kicked with reason: ${reason}. \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_long_help_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_long_help_en_US.ftl new file mode 100644 index 000000000..54d81d855 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_long_help_en_US.ftl @@ -0,0 +1 @@ +Kicks the user with the given reason. \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_notification_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_notification_en_US.ftl new file mode 100644 index 000000000..24407e480 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_notification_en_US.ftl @@ -0,0 +1 @@ +You were kicked from the server ${serverName} for the following reason: ${warning.reason}. \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_usage_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_usage_en_US.ftl new file mode 100644 index 000000000..2d9c9cda1 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/kick/kick_usage_en_US.ftl @@ -0,0 +1 @@ +kick \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/KickLogModel.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/KickLogModel.java new file mode 100644 index 000000000..20f19ff08 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/KickLogModel.java @@ -0,0 +1,21 @@ +package dev.sheldan.abstracto.moderation.models; + +import dev.sheldan.abstracto.command.execution.CommandTemplateContext; +import lombok.Builder; +import lombok.Getter; +import net.dv8tion.jda.api.entities.Member; + +@Getter +public class KickLogModel extends CommandTemplateContext { + private String reason; + private Member kickingUser; + private Member kickedUser; + + @Builder(builderMethodName = "parentBuilder") + public KickLogModel(CommandTemplateContext commandTemplateContext, Member kickedUser, Member kickingUser, String reason) { + super(commandTemplateContext); + this.kickedUser = kickedUser; + this.kickingUser = kickingUser; + this.reason = reason; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/KickService.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/KickService.java new file mode 100644 index 000000000..414a8e86a --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/KickService.java @@ -0,0 +1,9 @@ +package dev.sheldan.abstracto.moderation.service; + +import dev.sheldan.abstracto.moderation.models.KickLogModel; +import net.dv8tion.jda.api.entities.Member; + +public interface KickService { + void kickMember(Member member, String reason); + void sendKickLog(KickLogModel kickLogModel); +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/SetPostTargetCommand.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/SetPostTargetCommand.java index 20d0dd1c1..20e5e400e 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/SetPostTargetCommand.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/channels/SetPostTargetCommand.java @@ -28,7 +28,6 @@ public class SetPostTargetCommand implements Command { private ChannelManagementService channelManagementService; @Override - @Transactional public Result execute(CommandContext commandContext) { GuildChannel channel = (GuildChannel) commandContext.getParameters().getParameters().get(1); String targetName = (String) commandContext.getParameters().getParameters().get(0); diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/PostTarget.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/PostTarget.java index bdf271661..822f22768 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/PostTarget.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/models/PostTarget.java @@ -36,6 +36,8 @@ public class PostTarget { public static String JOIN_LOG = "joinlog"; public static String LEAVE_LOG = "leavelog"; public static String WARN_LOG = "warnlog"; + public static String KICK_LOG = "kicklog"; + public static String BAN_LOG = "banlog"; - public static List AVAILABLE_POST_TARGETS = Arrays.asList(JOIN_LOG, LEAVE_LOG, WARN_LOG); + public static List AVAILABLE_POST_TARGETS = Arrays.asList(JOIN_LOG, LEAVE_LOG, WARN_LOG, KICK_LOG, BAN_LOG); }