mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-04-05 00:53:04 +00:00
[AB-xxx] refactoring handling of bans and mutes: commands actively log, the reason for this is that the command is the only place who actually knows how executed the command. the event itself only sees the bot performing the action
adding event based logging of kicks
This commit is contained in:
@@ -17,6 +17,11 @@ public class ListenerExecutorConfig {
|
||||
return executorService.setupExecutorFor("memberTimeoutListener");
|
||||
}
|
||||
|
||||
@Bean(name = "memberKickedListenerExecutor")
|
||||
public TaskExecutor memberKickedListenerExecutor() {
|
||||
return executorService.setupExecutorFor("memberKickedListener");
|
||||
}
|
||||
|
||||
@Bean(name = "joinListenerExecutor")
|
||||
public TaskExecutor joinListenerExecutor() {
|
||||
return executorService.setupExecutorFor("joinListener");
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
package dev.sheldan.abstracto.core.listener.async.jda;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.ListenerService;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.models.listener.MemberKickedModel;
|
||||
import dev.sheldan.abstracto.core.models.listener.MemberTimeoutUpdatedModel;
|
||||
import dev.sheldan.abstracto.core.service.UserService;
|
||||
import dev.sheldan.abstracto.core.utils.CompletableFutureMap;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.audit.ActionType;
|
||||
import net.dv8tion.jda.api.audit.AuditLogChange;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.User;
|
||||
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
|
||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.core.task.TaskExecutor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class AsyncMemberKickedListenerBean extends ListenerAdapter {
|
||||
@Autowired(required = false)
|
||||
private List<AsyncMemberKickedListener> listenerList;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("memberKickedListenerExecutor")
|
||||
private TaskExecutor memberKickedTaskExecutor;
|
||||
|
||||
@Autowired
|
||||
private ListenerService listenerService;
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@Override
|
||||
public void onGuildAuditLogEntryCreate(@Nonnull GuildAuditLogEntryCreateEvent event) {
|
||||
if(listenerList == null) return;
|
||||
if(event.getEntry().getType().equals(ActionType.KICK)) {
|
||||
log.info("Handling kick audit log entry created for user {} in server {}.", event.getEntry().getTargetIdLong(), event.getGuild().getIdLong());
|
||||
CompletableFutureMap<Long, User> longUserCompletableFutureMap = userService.retrieveUsersMapped(Arrays.asList(event.getEntry().getTargetIdLong(), event.getEntry().getUserIdLong()));
|
||||
longUserCompletableFutureMap.getMainFuture().thenAccept(avoid -> {
|
||||
User kickedUser = longUserCompletableFutureMap.getElement(event.getEntry().getTargetIdLong());
|
||||
User kickingUser = longUserCompletableFutureMap.getElement(event.getEntry().getUserIdLong());
|
||||
MemberKickedModel model = getModel(event, kickedUser, kickingUser);
|
||||
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, memberKickedTaskExecutor));
|
||||
}).exceptionally(throwable -> {
|
||||
log.warn("Failed to fetch users {} or {} for kicked event.", event.getEntry().getTargetIdLong(), event.getEntry().getUserIdLong(), throwable);
|
||||
MemberKickedModel model = getModel(event, null, null);
|
||||
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, memberKickedTaskExecutor));
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private MemberKickedModel getModel(GuildAuditLogEntryCreateEvent event, User kickedUser, User kickingUser) {
|
||||
ServerUser kickededServerUser = ServerUser
|
||||
.builder()
|
||||
.serverId(event.getGuild().getIdLong())
|
||||
.userId(event.getEntry().getTargetIdLong())
|
||||
.build();
|
||||
ServerUser kickingServerUser = ServerUser
|
||||
.builder()
|
||||
.serverId(event.getGuild().getIdLong())
|
||||
.userId(event.getEntry().getUserIdLong())
|
||||
.build();
|
||||
return MemberKickedModel
|
||||
.builder()
|
||||
.kickedServerUser(kickededServerUser)
|
||||
.kickingServerUser(kickingServerUser)
|
||||
.kickedUser(kickedUser)
|
||||
.kickingUser(kickingUser)
|
||||
.guild(event.getGuild())
|
||||
.reason(event.getEntry().getReason())
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -44,14 +44,15 @@ public class AsyncMemberTimeoutListenerBean extends ListenerAdapter {
|
||||
if(event.getEntry().getType().equals(ActionType.MEMBER_UPDATE)) {
|
||||
AuditLogChange memberTimeoutChange = event.getEntry().getChangeByKey(AuditLogKey.MEMBER_TIME_OUT);
|
||||
if(memberTimeoutChange != null) {
|
||||
CompletableFuture<Member> memberInstanceFuture = memberService.retrieveMemberInServer(ServerUser.fromId(event.getGuild().getIdLong(), event.getEntry().getTargetIdLong()));
|
||||
memberInstanceFuture.whenComplete((member, throwable) -> {
|
||||
executeListeners(memberTimeoutChange, event, member);
|
||||
CompletableFuture<Member> targetMemberFuture = memberService.retrieveMemberInServer(ServerUser.fromId(event.getGuild().getIdLong(), event.getEntry().getTargetIdLong()));
|
||||
CompletableFuture<Member> mutingMemberFuture = memberService.retrieveMemberInServer(ServerUser.fromId(event.getGuild().getIdLong(), event.getEntry().getUserIdLong()));
|
||||
CompletableFuture.allOf(targetMemberFuture, mutingMemberFuture).whenComplete((avoid, throwable) -> {
|
||||
executeListeners(memberTimeoutChange, event, targetMemberFuture.join(), mutingMemberFuture.join());
|
||||
}).exceptionally(throwable -> {
|
||||
Long memberId = event.getEntry().getTargetIdLong();
|
||||
Long serverId = event.getGuild().getIdLong();
|
||||
log.warn("Failed to load member {} for member update audit log in server {}.", memberId, serverId, throwable);
|
||||
executeListeners(memberTimeoutChange, event, null);
|
||||
executeListeners(memberTimeoutChange, event, null, null);
|
||||
return null;
|
||||
});
|
||||
|
||||
@@ -59,21 +60,23 @@ public class AsyncMemberTimeoutListenerBean extends ListenerAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
private void executeListeners(AuditLogChange change, GuildAuditLogEntryCreateEvent event, Member member) {
|
||||
private void executeListeners(AuditLogChange change, GuildAuditLogEntryCreateEvent event, Member mutedMember, Member mutingMember) {
|
||||
DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;
|
||||
OffsetDateTime timeoutAfter = change.getNewValue() != null ? OffsetDateTime.parse(change.getNewValue(), timeFormatter) : null;
|
||||
OffsetDateTime timeoutBefore = change.getOldValue() != null ? OffsetDateTime.parse(change.getOldValue(), timeFormatter) : null;
|
||||
String reason = event.getEntry().getReason();
|
||||
Long serverId = event.getGuild().getIdLong();
|
||||
MemberTimeoutUpdatedModel model = MemberTimeoutUpdatedModel
|
||||
.builder()
|
||||
.oldTimeout(timeoutBefore)
|
||||
.newTimeout(timeoutAfter)
|
||||
.responsibleUserId(event.getEntry().getUserIdLong())
|
||||
.member(member)
|
||||
.mutedMember(mutedMember)
|
||||
.mutingMember(mutingMember)
|
||||
.reason(reason)
|
||||
.guild(event.getGuild())
|
||||
.user(member != null ? member.getUser() : null)
|
||||
.timeoutUser(ServerUser.fromId(event.getGuild().getIdLong(), event.getEntry().getTargetIdLong()))
|
||||
.mutingUser(ServerUser.fromId(serverId, event.getEntry().getUserIdLong()))
|
||||
.mutedUser(ServerUser.fromId(serverId, event.getEntry().getTargetIdLong()))
|
||||
.build();
|
||||
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, memberTimeoutExecutor));
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.listener.async.jda;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.ListenerService;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserBannedModel;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserBannedListenerModel;
|
||||
import dev.sheldan.abstracto.core.service.UserService;
|
||||
import dev.sheldan.abstracto.core.utils.CompletableFutureMap;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -45,18 +45,18 @@ public class AsyncUserBannedListenerBean extends ListenerAdapter {
|
||||
longUserCompletableFutureMap.getMainFuture().thenAccept(avoid -> {
|
||||
User bannedUser = longUserCompletableFutureMap.getElement(event.getEntry().getTargetIdLong());
|
||||
User banningUser = longUserCompletableFutureMap.getElement(event.getEntry().getUserIdLong());
|
||||
UserBannedModel model = getModel(event, bannedUser, banningUser);
|
||||
UserBannedListenerModel model = getModel(event, bannedUser, banningUser);
|
||||
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, leaveListenerExecutor));
|
||||
}).exceptionally(throwable -> {
|
||||
log.warn("Failed to fetch users {} or {} for banned event.", event.getEntry().getTargetIdLong(), event.getEntry().getUserIdLong(), throwable);
|
||||
UserBannedModel model = getModel(event, null, null);
|
||||
UserBannedListenerModel model = getModel(event, null, null);
|
||||
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, leaveListenerExecutor));
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private UserBannedModel getModel(GuildAuditLogEntryCreateEvent event, User bannedUser, User banningUser) {
|
||||
private UserBannedListenerModel getModel(GuildAuditLogEntryCreateEvent event, User bannedUser, User banningUser) {
|
||||
ServerUser bannedServerUser = ServerUser
|
||||
.builder()
|
||||
.serverId(event.getGuild().getIdLong())
|
||||
@@ -67,7 +67,7 @@ public class AsyncUserBannedListenerBean extends ListenerAdapter {
|
||||
.serverId(event.getGuild().getIdLong())
|
||||
.userId(event.getEntry().getUserIdLong())
|
||||
.build();
|
||||
return UserBannedModel
|
||||
return UserBannedListenerModel
|
||||
.builder()
|
||||
.bannedServerUser(bannedServerUser)
|
||||
.banningUser(banningUser)
|
||||
|
||||
@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.listener.async.jda;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.ListenerService;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserUnBannedModel;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserUnBannedListenerModel;
|
||||
import dev.sheldan.abstracto.core.service.UserService;
|
||||
import dev.sheldan.abstracto.core.utils.CompletableFutureMap;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -44,18 +44,18 @@ public class AsyncUserUnBannedListenerBean extends ListenerAdapter {
|
||||
longUserCompletableFutureMap.getMainFuture().thenAccept(avoid -> {
|
||||
User unBannedUser = longUserCompletableFutureMap.getElement(event.getEntry().getTargetIdLong());
|
||||
User unBanningUser = longUserCompletableFutureMap.getElement(event.getEntry().getUserIdLong());
|
||||
UserUnBannedModel model = getModel(event, unBannedUser, unBanningUser);
|
||||
UserUnBannedListenerModel model = getModel(event, unBannedUser, unBanningUser);
|
||||
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, leaveListenerExecutor));
|
||||
}).exceptionally(throwable -> {
|
||||
log.warn("Failed to fetch users {} or {} for unbanned event.", event.getEntry().getTargetIdLong(), event.getEntry().getUserIdLong(), throwable);
|
||||
UserUnBannedModel model = getModel(event, null, null);
|
||||
UserUnBannedListenerModel model = getModel(event, null, null);
|
||||
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, leaveListenerExecutor));
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private UserUnBannedModel getModel(GuildAuditLogEntryCreateEvent event, User unBannedUser, User unBanningUser) {
|
||||
private UserUnBannedListenerModel getModel(GuildAuditLogEntryCreateEvent event, User unBannedUser, User unBanningUser) {
|
||||
ServerUser unBannedServerUser = ServerUser
|
||||
.builder()
|
||||
.serverId(event.getGuild().getIdLong())
|
||||
@@ -66,7 +66,7 @@ public class AsyncUserUnBannedListenerBean extends ListenerAdapter {
|
||||
.serverId(event.getGuild().getIdLong())
|
||||
.userId(event.getEntry().getUserIdLong())
|
||||
.build();
|
||||
return UserUnBannedModel
|
||||
return UserUnBannedListenerModel
|
||||
.builder()
|
||||
.unBannedServerUser(unBannedServerUser)
|
||||
.unBanningUser(unBanningUser)
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package dev.sheldan.abstracto.core.listener.async.jda;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
|
||||
import dev.sheldan.abstracto.core.models.listener.MemberKickedModel;
|
||||
|
||||
public interface AsyncMemberKickedListener extends FeatureAwareListener<MemberKickedModel, DefaultListenerResult> {
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.listener.async.jda;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserBannedModel;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserBannedListenerModel;
|
||||
|
||||
public interface AsyncUserBannedListener extends FeatureAwareListener<UserBannedModel, DefaultListenerResult> {
|
||||
public interface AsyncUserBannedListener extends FeatureAwareListener<UserBannedListenerModel, DefaultListenerResult> {
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.core.listener.async.jda;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserUnBannedModel;
|
||||
import dev.sheldan.abstracto.core.models.listener.UserUnBannedListenerModel;
|
||||
|
||||
public interface AsyncUserUnBannedListener extends FeatureAwareListener<UserUnBannedModel, DefaultListenerResult> {
|
||||
public interface AsyncUserUnBannedListener extends FeatureAwareListener<UserUnBannedListenerModel, DefaultListenerResult> {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package dev.sheldan.abstracto.core.models.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.User;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class MemberKickedModel implements FeatureAwareListenerModel {
|
||||
private ServerUser kickedServerUser;
|
||||
private ServerUser kickingServerUser;
|
||||
private Guild guild;
|
||||
private String reason;
|
||||
private Long responsibleUserId;
|
||||
private User kickedUser;
|
||||
private User kickingUser;
|
||||
@Override
|
||||
public Long getServerId() {
|
||||
return guild.getIdLong();
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,6 @@ import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.User;
|
||||
|
||||
import java.time.OffsetDateTime;
|
||||
|
||||
@@ -15,14 +14,15 @@ import java.time.OffsetDateTime;
|
||||
@Setter
|
||||
@Builder
|
||||
public class MemberTimeoutUpdatedModel implements FeatureAwareListenerModel {
|
||||
private ServerUser timeoutUser;
|
||||
private User user;
|
||||
private ServerUser mutedUser;
|
||||
private ServerUser mutingUser;
|
||||
private Guild guild;
|
||||
private String reason;
|
||||
private Long responsibleUserId;
|
||||
private OffsetDateTime oldTimeout;
|
||||
private OffsetDateTime newTimeout;
|
||||
private Member member;
|
||||
private Member mutedMember;
|
||||
private Member mutingMember;
|
||||
@Override
|
||||
public Long getServerId() {
|
||||
return guild.getIdLong();
|
||||
|
||||
@@ -11,7 +11,7 @@ import net.dv8tion.jda.api.entities.User;
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class UserBannedModel implements FeatureAwareListenerModel {
|
||||
public class UserBannedListenerModel implements FeatureAwareListenerModel {
|
||||
private ServerUser bannedServerUser;
|
||||
private ServerUser banningServerUser;
|
||||
private User bannedUser;
|
||||
@@ -11,7 +11,7 @@ import net.dv8tion.jda.api.entities.User;
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class UserUnBannedModel implements FeatureAwareListenerModel {
|
||||
public class UserUnBannedListenerModel implements FeatureAwareListenerModel {
|
||||
private ServerUser unBannedServerUser;
|
||||
private ServerUser unBanningServerUser;
|
||||
private User unBannedUser;
|
||||
@@ -15,6 +15,7 @@ public class MemberDisplay {
|
||||
private String memberMention;
|
||||
private String name;
|
||||
private Long userId;
|
||||
private String discriminator;
|
||||
private Long serverId;
|
||||
|
||||
public static MemberDisplay fromMember(Member member) {
|
||||
@@ -22,6 +23,7 @@ public class MemberDisplay {
|
||||
.builder()
|
||||
.memberMention(member.getAsMention())
|
||||
.name(member.getEffectiveName())
|
||||
.discriminator(member.getUser().getDiscriminator())
|
||||
.serverId(member.getGuild().getIdLong())
|
||||
.userId(member.getIdLong())
|
||||
.build();
|
||||
|
||||
Reference in New Issue
Block a user