Skip to content

Commit

Permalink
⚡ Added checker for events related to audit logs
Browse files Browse the repository at this point in the history
  • Loading branch information
ItsTheSky committed May 17, 2024
1 parent c26745a commit a3a077e
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 5 deletions.
18 changes: 16 additions & 2 deletions src/main/java/info/itsthesky/disky/api/events/DiSkyEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@
import ch.njol.skript.log.SkriptLogger;
import info.itsthesky.disky.DiSky;
import info.itsthesky.disky.core.SkriptUtils;
import net.dv8tion.jda.api.audit.ActionType;
import net.dv8tion.jda.api.audit.AuditLogEntry;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
import org.bukkit.event.Event;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
Expand Down Expand Up @@ -71,6 +75,10 @@ protected Predicate<D> checker() {
return e -> true;
}

protected Predicate<GuildAuditLogEntryCreateEvent> logChecker() {
return e -> true;
}

@Override
@SuppressWarnings("unchecked")
public boolean init(Literal<?> @NotNull [] exprs, int matchedPattern, @NotNull SkriptParser.ParseResult parser) {
Expand Down Expand Up @@ -124,7 +132,7 @@ public void afterParse(@NotNull Config config) {
@SuppressWarnings("unchecked")
public void register(@NotNull Trigger t) {
trigger = t;
listener = new EventListener<>(jdaClass, JDAEvent -> {
listener = new EventListener<>(jdaClass, (JDAEvent, auditLogEntryCreateEvent) -> {
if (check(JDAEvent)) {

/* !? */
Expand All @@ -138,14 +146,16 @@ public void register(@NotNull Trigger t) {
event = eventWorkaround;

event.setJDAEvent(JDAEvent);
event.setLogEvent(auditLogEntryCreateEvent);

SkriptUtils.sync(() -> {
if (getTrigger() != null) {
getTrigger().execute(event);
}
});

}
}, checker());
}, checker(), logChecker(), getLogType());
EventListener.addListener(listener);
}

Expand Down Expand Up @@ -188,6 +198,10 @@ public boolean check(D event) {
return bot == null || bot.equalsIgnoreCase(DiSky.getManager().getJDAName(event.getJDA()));
}

public @Nullable ActionType getLogType() {
return null;
}

public Class<? extends Event> getBukkitClass() {
return bukkitClass;
}
Expand Down
50 changes: 47 additions & 3 deletions src/main/java/info/itsthesky/disky/api/events/EventListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@

import info.itsthesky.disky.DiSky;
import info.itsthesky.disky.managers.BotManager;
import net.dv8tion.jda.api.audit.ActionType;
import net.dv8tion.jda.api.events.GenericEvent;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;

Expand All @@ -18,13 +22,26 @@ public class EventListener<T> extends ListenerAdapter {
public final static ArrayList<EventListener<?>> listeners = new ArrayList<>();
public boolean enabled = true;
private final Class<T> clazz;
private final Consumer<T> consumer;
private final BiConsumer<T, GuildAuditLogEntryCreateEvent> consumer;
private final Predicate<T> checker;

public EventListener(Class<T> paramClass, Consumer<T> consumer, Predicate<T> checker) {
private final boolean isWaitingLogEvent;
private final @Nullable ActionType logType;
private final Predicate<GuildAuditLogEntryCreateEvent> logChecker;

private @Nullable T lastEvent;

public EventListener(Class<T> paramClass,
BiConsumer<T, GuildAuditLogEntryCreateEvent> consumer,
Predicate<T> checker, Predicate<GuildAuditLogEntryCreateEvent> logChecker,
@Nullable ActionType actionType) {
this.clazz = paramClass;
this.consumer = consumer;
this.checker = checker;
this.logChecker = logChecker;

this.isWaitingLogEvent = actionType != null;
this.logType = actionType;
}

public static void addListener(EventListener<?> listener) {
Expand All @@ -38,14 +55,41 @@ public static void removeListener(EventListener<?> listener) {
DiSky.getManager().execute(bot -> bot.getInstance().removeEventListener(listener));
}

@Override
public void onGuildAuditLogEntryCreate(GuildAuditLogEntryCreateEvent event) {
DiSky.debug("received log event " + event.getEntry().getType() + " by DiSky.");
if (isWaitingLogEvent && event.getEntry().getType() == logType) {
DiSky.debug("Log event " + event.getEntry().getType() + " received by DiSky. Is there last event? " + (lastEvent != null) + ".");
if (lastEvent != null) {
if (logChecker.test(event)) {
consumer.accept(lastEvent, event);
lastEvent = null;
}
} else {
DiSky.getInstance().getLogger().severe("The last event is null, but the log event is waiting for it! " +
"(ActionType: " + event.getEntry().getType() + ", Event: " + event + ")");
}
}
}

@SuppressWarnings("unchecked")
@Override
public void onGenericEvent(@NotNull GenericEvent event) {
if (enabled && clazz.isInstance(event)) {
DiSky.debug("Event " + event.getClass().getSimpleName() + " received by DiSky. Is it valid? " + checker.test((T) event) + "." + hash());
if (!checker.test((T) event))
return;
consumer.accept((T) event);
DiSky.debug("- Event is valid, executing consumer (is waiting for log event: " + isWaitingLogEvent + ")");
if (isWaitingLogEvent) {
lastEvent = (T) event;
} else {
consumer.accept((T) event, null);
}
}
}

private String hash() {
return " [class hash: " + this.hashCode() + "]";
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package info.itsthesky.disky.api.events;

import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;

import java.util.HashMap;
import java.util.Map;

Expand All @@ -9,6 +11,7 @@
public class SimpleDiSkyEvent<D extends net.dv8tion.jda.api.events.Event> extends BukkitEvent {

private D JDAEvent;
private GuildAuditLogEntryCreateEvent logEvent;
private Map<Class<?>, Object> valueMap = new HashMap<>();

public SimpleDiSkyEvent(boolean async) {
Expand All @@ -25,6 +28,14 @@ public void setJDAEvent(D JDAEvent) {
this.JDAEvent = JDAEvent;
}

public GuildAuditLogEntryCreateEvent getLogEvent() {
return logEvent;
}

public void setLogEvent(GuildAuditLogEntryCreateEvent logEvent) {
this.logEvent = logEvent;
}

public Map<Class<?>, Object> getValueMap() {
return valueMap;
}
Expand Down

0 comments on commit a3a077e

Please sign in to comment.