Skip to content

Commit 9e5988e

Browse files
authored
Merge pull request #401 from danthe1st/timeout-on-warn
timeout users when exceeding specific warn severity
2 parents 006382c + 5ea7131 commit 9e5988e

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

src/main/java/net/javadiscord/javabot/data/config/guild/ModerationConfig.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@ public class ModerationConfig extends GuildConfigItem {
5555
*/
5656
private int maxWarnSeverity = 100;
5757

58+
/**
59+
* The maximum total severity that a user can accrue from warnings before
60+
* being timeouted in the server.
61+
*/
62+
private int timeoutSeverity = 50;
63+
64+
/**
65+
* The duration (in hours) to timeout users when they exceeded {@link #timeoutSeverity}.
66+
*/
67+
private int warnTimeoutHours = 2;
68+
5869
/**
5970
* ID of the channel where direct user notifications should be sent to (using private threads).
6071
* @see net.javadiscord.javabot.systems.notification.UserNotificationService

src/main/java/net/javadiscord/javabot/systems/moderation/AutoMod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ private void handleSpam(@Nonnull Message msg, Member member) {
184184
}
185185
new ModerationService(notificationService, botConfig.get(member.getGuild()), warnRepository, asyncPool)
186186
.timeout(
187-
member,
187+
member.getUser(),
188188
"Automod: Spam",
189189
msg.getGuild().getSelfMember(),
190190
Duration.of(6, ChronoUnit.HOURS),

src/main/java/net/javadiscord/javabot/systems/moderation/ModerationService.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ public void warn(User user, WarnSeverity severity, String reason, Member warnedB
9393
if (!quiet && channel.getIdLong() != moderationConfig.getLogChannelId()) {
9494
channel.sendMessageEmbeds(warnEmbed).queue();
9595
}
96+
if (totalSeverity > moderationConfig.getTimeoutSeverity() && totalSeverity-severity.getWeight() <= moderationConfig.getTimeoutSeverity()) {
97+
timeout(user, "Too many warns", warnedBy, Duration.ofHours(moderationConfig.getWarnTimeoutHours()), channel, quiet);
98+
}
9699
if (totalSeverity > moderationConfig.getMaxWarnSeverity()) {
97100
ban(user, "Too many warns", warnedBy, channel, quiet);
98101
}
@@ -179,18 +182,18 @@ public List<Warn> getAllWarns(long userId) {
179182
/**
180183
* Adds a Timeout to the member.
181184
*
182-
* @param member The member to time out.
185+
* @param user The user to time out.
183186
* @param reason The reason for adding this Timeout.
184187
* @param timedOutBy The member who is responsible for adding this Timeout.
185188
* @param duration How long the Timeout should last.
186189
* @param channel The channel in which the Timeout was issued.
187190
* @param quiet If true, don't send a message in the channel.
188191
*/
189-
public void timeout(@Nonnull Member member, @Nonnull String reason, @Nonnull Member timedOutBy, @Nonnull Duration duration, @Nonnull MessageChannel channel, boolean quiet) {
190-
MessageEmbed timeoutEmbed = buildTimeoutEmbed(member, timedOutBy, reason, duration);
191-
member.getGuild().timeoutFor(member, duration).queue(s -> {
192-
notificationService.withUser(member.getUser(), timedOutBy.getGuild()).sendDirectMessage(c -> c.sendMessageEmbeds(timeoutEmbed));
193-
notificationService.withGuild(member.getGuild()).sendToModerationLog(c -> c.sendMessageEmbeds(timeoutEmbed));
192+
public void timeout(@Nonnull User user, @Nonnull String reason, @Nonnull Member timedOutBy, @Nonnull Duration duration, @Nonnull MessageChannel channel, boolean quiet) {
193+
MessageEmbed timeoutEmbed = buildTimeoutEmbed(user, timedOutBy, reason, duration);
194+
timedOutBy.getGuild().timeoutFor(user, duration).queue(s -> {
195+
notificationService.withUser(user, timedOutBy.getGuild()).sendDirectMessage(c -> c.sendMessageEmbeds(timeoutEmbed));
196+
notificationService.withGuild(timedOutBy.getGuild()).sendToModerationLog(c -> c.sendMessageEmbeds(timeoutEmbed));
194197
if (!quiet) channel.sendMessageEmbeds(timeoutEmbed).queue();
195198
}, ExceptionLogger::capture);
196199
}
@@ -359,8 +362,8 @@ public void kick(User user, String reason, Member kickedBy, MessageChannel chann
359362
.build();
360363
}
361364

362-
private @NotNull MessageEmbed buildTimeoutEmbed(@NotNull Member member, Member timedOutBy, String reason, Duration duration) {
363-
return buildModerationEmbed(member.getUser(), timedOutBy, reason)
365+
private @NotNull MessageEmbed buildTimeoutEmbed(@NotNull User user, Member timedOutBy, String reason, Duration duration) {
366+
return buildModerationEmbed(user, timedOutBy, reason)
364367
.setTitle("Timeout")
365368
.setColor(Responses.Type.ERROR.getColor())
366369
.addField("Ends", String.format("<t:%d:R>", Instant.now().plus(duration).getEpochSecond()), true)

src/main/java/net/javadiscord/javabot/systems/moderation/timeout/AddTimeoutSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ protected ReplyCallbackAction handleTimeoutCommand(@NotNull SlashCommandInteract
8080
return Responses.error(event, "Could not timeout %s; they're already timed out.", member.getAsMention());
8181
}
8282
ModerationService service = new ModerationService(notificationService, botConfig, event.getInteraction(), warnRepository, asyncPool);
83-
service.timeout(member, reasonOption.getAsString(), event.getMember(), duration, channel, quiet);
83+
service.timeout(member.getUser(), reasonOption.getAsString(), event.getMember(), duration, channel, quiet);
8484
return Responses.success(event, "User Timed Out", "%s has been timed out.", member.getAsMention());
8585
}
8686
}

0 commit comments

Comments
 (0)