Skip to content

Commit d3e4fcd

Browse files
committed
log moderative actions without bot commands
1 parent e4832e4 commit d3e4fcd

File tree

2 files changed

+98
-3
lines changed

2 files changed

+98
-3
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package net.discordjug.javabot.systems.moderation;
2+
3+
import java.time.Duration;
4+
import java.time.ZonedDateTime;
5+
import java.util.concurrent.ExecutorService;
6+
7+
import lombok.RequiredArgsConstructor;
8+
import net.discordjug.javabot.data.config.BotConfig;
9+
import net.discordjug.javabot.systems.moderation.warn.dao.WarnRepository;
10+
import net.discordjug.javabot.systems.notification.NotificationService;
11+
import net.dv8tion.jda.api.audit.AuditLogChange;
12+
import net.dv8tion.jda.api.audit.AuditLogEntry;
13+
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
14+
import net.dv8tion.jda.api.hooks.ListenerAdapter;
15+
16+
/**
17+
* Logs moderative actions that did not use bot commands.
18+
*/
19+
@RequiredArgsConstructor
20+
public class DiscordModerationLogListener extends ListenerAdapter{
21+
22+
private final NotificationService notificationService;
23+
private final BotConfig botConfig;
24+
private final WarnRepository warnRepository;
25+
private final ExecutorService asyncPool;
26+
27+
@Override
28+
public void onGuildAuditLogEntryCreate(GuildAuditLogEntryCreateEvent event) {
29+
30+
ModerationService moderationService = new ModerationService(notificationService, botConfig.get(event.getGuild()), warnRepository, asyncPool);
31+
32+
AuditLogEntry entry = event.getEntry();
33+
long targetUserId = entry.getTargetIdLong();
34+
long moderatorUserId = entry.getUserIdLong();
35+
if (moderatorUserId == event.getJDA().getSelfUser().getIdLong()) {
36+
return;
37+
}
38+
event.getJDA().retrieveUserById(targetUserId).queue(targetUser -> {
39+
event.getGuild().retrieveMemberById(moderatorUserId).queue(moderator -> {
40+
String reason = entry.getReason();
41+
if (reason == null) {
42+
reason = "<no reason provided>";
43+
}
44+
switch(entry.getType()) {
45+
case KICK -> moderationService.sendKickGuildNotification(targetUser, reason, moderator);
46+
case BAN -> moderationService.sendBanGuildNotification(targetUser, reason, moderator);
47+
case UNBAN -> moderationService.sendUnbanGuildNotification(targetUser, reason, moderator);
48+
case MEMBER_UPDATE -> {
49+
if (entry.getChanges().containsKey("communication_disabled_until")) {
50+
AuditLogChange change = entry.getChangeByKey("communication_disabled_until");
51+
if (change.getNewValue()!=null) {
52+
ZonedDateTime timeoutRemovalTimestamp = java.time.ZonedDateTime.parse(change.getNewValue());
53+
moderationService.sendTimeoutGuildNotification(targetUser, reason, moderator, Duration.between(ZonedDateTime.now(), timeoutRemovalTimestamp));
54+
}else {
55+
moderationService.sendRemoveTimeoutGuildNotification(targetUser, reason, moderator);
56+
}
57+
}
58+
}
59+
default -> {}
60+
}
61+
});
62+
});
63+
64+
}
65+
66+
}

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

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public void timeout(@Nonnull User user, @Nonnull String reason, @Nonnull Member
210210
* @param quiet If true, don't send a message in the channel.
211211
*/
212212
public void removeTimeout(Member member, String reason, Member removedBy, MessageChannel channel, boolean quiet) {
213-
MessageEmbed removeTimeoutEmbed = buildTimeoutRemovedEmbed(member, removedBy, reason);
213+
MessageEmbed removeTimeoutEmbed = buildTimeoutRemovedEmbed(member.getUser(), removedBy, reason);
214214
removedBy.getGuild().removeTimeout(member).queue(s -> {
215215
notificationService.withUser(member.getUser(), removedBy.getGuild()).sendDirectMessage(c -> c.sendMessageEmbeds(removeTimeoutEmbed));
216216
notificationService.withGuild(member.getGuild()).sendToModerationLog(c -> c.sendMessageEmbeds(removeTimeoutEmbed));
@@ -291,6 +291,35 @@ public void kick(User user, String reason, Member kickedBy, MessageChannel chann
291291
}, ExceptionLogger::capture);
292292
}
293293

294+
public void sendKickGuildNotification(User user, String reason, Member moderator) {
295+
sendGuildNotification(moderator.getGuild(), buildKickEmbed(user, moderator, reason));
296+
}
297+
298+
public void sendBanGuildNotification(User user, String reason, Member moderator) {
299+
sendGuildNotification(moderator.getGuild(), buildBanEmbed(user, moderator, reason));
300+
}
301+
302+
public void sendUnbanGuildNotification(User user, String reason, Member moderator) {
303+
sendGuildNotification(moderator.getGuild(), buildUnbanEmbed(user.getIdLong(), reason, moderator));
304+
}
305+
306+
public void sendTimeoutGuildNotification(User user, String reason, Member moderator, Duration duration) {
307+
sendGuildNotification(moderator.getGuild(), buildTimeoutEmbed(user, moderator, reason, duration));
308+
}
309+
310+
public void sendRemoveTimeoutGuildNotification(User user, String reason, Member moderator) {
311+
sendGuildNotification(moderator.getGuild(), buildTimeoutRemovedEmbed(user, moderator, reason));
312+
}
313+
314+
private void sendGuildNotification(Guild guild, MessageEmbed embed) {
315+
MessageEmbed newEmbed = new EmbedBuilder(embed)
316+
.addField("Source", "This action was executed manually without a bot command.", false)
317+
.build();
318+
notificationService
319+
.withGuild(guild)
320+
.sendToModerationLog(c -> c.sendMessageEmbeds(newEmbed));
321+
}
322+
294323
private @NotNull EmbedBuilder buildModerationEmbed(@NotNull User user, @NotNull Member moderator, String reason) {
295324
return new EmbedBuilder()
296325
.setAuthor(UserUtils.getUserTag(moderator.getUser()), null, moderator.getEffectiveAvatarUrl())
@@ -372,8 +401,8 @@ public void kick(User user, String reason, Member kickedBy, MessageChannel chann
372401
.build();
373402
}
374403

375-
private @NotNull MessageEmbed buildTimeoutRemovedEmbed(@NotNull Member member, Member timedOutBy, String reason) {
376-
return buildModerationEmbed(member.getUser(), timedOutBy, reason)
404+
private @NotNull MessageEmbed buildTimeoutRemovedEmbed(@NotNull User user, Member timedOutBy, String reason) {
405+
return buildModerationEmbed(user, timedOutBy, reason)
377406
.setTitle("Timeout Removed")
378407
.setColor(Responses.Type.SUCCESS.getColor())
379408
.build();

0 commit comments

Comments
 (0)