[AB-xxx] reworking mute logging to use audit log events instead of active logging and member update events

This commit is contained in:
Sheldan
2024-05-04 20:35:56 +02:00
parent bc3d16b40e
commit ca45137cc6
6 changed files with 118 additions and 299 deletions

View File

@@ -3,8 +3,13 @@ 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.MemberTimeoutUpdatedModel;
import dev.sheldan.abstracto.core.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateTimeOutEvent;
import net.dv8tion.jda.api.audit.ActionType;
import net.dv8tion.jda.api.audit.AuditLogChange;
import net.dv8tion.jda.api.audit.AuditLogKey;
import net.dv8tion.jda.api.entities.Member;
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;
@@ -12,7 +17,10 @@ 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.List;
import java.util.concurrent.CompletableFuture;
@Component
@Slf4j
@@ -27,23 +35,46 @@ public class AsyncMemberTimeoutListenerBean extends ListenerAdapter {
@Autowired
private ListenerService listenerService;
@Autowired
private MemberService memberService;
@Override
public void onGuildMemberUpdateTimeOut(@Nonnull GuildMemberUpdateTimeOutEvent event) {
public void onGuildAuditLogEntryCreate(@Nonnull GuildAuditLogEntryCreateEvent event) {
if(listenerList == null) return;
MemberTimeoutUpdatedModel model = getModel(event);
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, memberTimeoutExecutor));
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);
}).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);
return null;
});
}
}
}
private MemberTimeoutUpdatedModel getModel(GuildMemberUpdateTimeOutEvent event) {
return MemberTimeoutUpdatedModel
.builder()
.oldTimeout(event.getOldTimeOutEnd())
.newTimeout(event.getNewTimeOutEnd())
.member(event.getMember())
.event(event)
.timeoutUser(ServerUser.fromMember(event.getMember()))
.guild(event.getGuild())
.user(event.getUser())
.build();
}
private void executeListeners(AuditLogChange change, GuildAuditLogEntryCreateEvent event, Member member) {
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();
MemberTimeoutUpdatedModel model = MemberTimeoutUpdatedModel
.builder()
.oldTimeout(timeoutBefore)
.newTimeout(timeoutAfter)
.responsibleUserId(event.getEntry().getUserIdLong())
.member(member)
.reason(reason)
.guild(event.getGuild())
.user(member != null ? member.getUser() : null)
.timeoutUser(ServerUser.fromId(event.getGuild().getIdLong(), event.getEntry().getTargetIdLong()))
.build();
listenerList.forEach(leaveListener -> listenerService.executeFeatureAwareListener(leaveListener, model, memberTimeoutExecutor));
}
}