Add API events system

This commit is contained in:
ajgeiss0702
2023-06-08 17:00:49 -07:00
parent 2414c698ed
commit 0899bf88ed
17 changed files with 306 additions and 6 deletions
@@ -5,6 +5,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.jetbrains.annotations.NotNull;
import us.ajg0702.queue.api.EventHandler;
import us.ajg0702.queue.api.events.SuccessfulSendEvent;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.queues.QueueServer;
@@ -87,6 +88,9 @@ public class EventHandlerImpl implements EventHandler {
server.removePlayer(player);
server.setLastSentTime(System.currentTimeMillis());
main.getQueueManager().getSendingAttempts().remove(queuePlayer);
main.getTaskManager().runNow(() -> {
main.call(new SuccessfulSendEvent(queuePlayer, player.getCurrentServer()));
});
}
}
@@ -2,6 +2,8 @@ package us.ajg0702.queue.common;
import org.spongepowered.configurate.ConfigurateException;
import us.ajg0702.queue.api.*;
import us.ajg0702.queue.api.events.Event;
import us.ajg0702.queue.api.events.utils.EventReceiver;
import us.ajg0702.queue.api.premium.Logic;
import us.ajg0702.queue.api.premium.LogicGetter;
import us.ajg0702.queue.api.util.QueueLogger;
@@ -12,7 +14,8 @@ import us.ajg0702.utils.common.Messages;
import us.ajg0702.utils.common.Updater;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.regex.Pattern;
@@ -124,6 +127,31 @@ public class QueueMain extends AjQueueAPI {
updater.shutdown();
}
private final Map<Class<?>, ArrayList<EventReceiver<Event>>> listeners = new ConcurrentHashMap<>();
@SuppressWarnings("unchecked")
@Override
public <E> void listen(Class<E> event, EventReceiver<E> handler) {
if(!Arrays.asList(event.getInterfaces()).contains(Event.class)) {
throw new IllegalArgumentException("You can only listen to ajQueue events!");
}
List<EventReceiver<Event>> existingList = listeners.computeIfAbsent(event, (k) -> new ArrayList<>());
existingList.add((e) -> handler.execute((E) e));
}
public void call(Event event) {
List<EventReceiver<Event>> list = listeners.computeIfAbsent(event.getClass(), (k) -> new ArrayList<>());
list.forEach(eventReceiver -> {
try {
eventReceiver.execute(event);
} catch(Exception e) {
logger.severe("An external plugin threw an error while handling an event (this is probably not the fault of ajQueue!)", e);
}
});
}
@Override
public ExecutorService getServersUpdateExecutor() {
return taskManager.getServersUpdateExecutor();
@@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.title.Title;
import us.ajg0702.queue.api.QueueManager;
import us.ajg0702.queue.api.events.PreQueueEvent;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.premium.Logic;
@@ -208,6 +209,14 @@ public class QueueManagerImpl implements QueueManager {
}
}
PreQueueEvent preQueueEvent = new PreQueueEvent(player, server);
main.call(preQueueEvent);
if(preQueueEvent.isCancelled()) return false;
// Player should be added!
ImmutableList<QueuePlayer> list = server.getQueue();
QueuePlayer queuePlayer;
AdaptedServer ideal = server.getIdealServer(player);
@@ -1,5 +1,7 @@
package us.ajg0702.queue.common;
import us.ajg0702.queue.common.utils.QueueThreadFactory;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;
@@ -7,10 +9,9 @@ import java.util.concurrent.*;
public class TaskManager {
final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
final ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1);
final ExecutorService serversUpdateExecutor = Executors.newCachedThreadPool();
final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1, new QueueThreadFactory("GENERIC"));
final ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1, new QueueThreadFactory("UPDATE-EXECUTOR"));
final ExecutorService serversUpdateExecutor = Executors.newCachedThreadPool(new QueueThreadFactory("SERVER-UPDATE"));
final QueueMain main;
public TaskManager(QueueMain main) {
@@ -128,6 +129,10 @@ public class TaskManager {
return executor.schedule(runnable, delay, unit);
}
public Future<?> runNow(Runnable runnable) {
return executor.submit(runnable);
}
private ScheduledFuture<?> scheduleAtFixedRate(ScheduledExecutorService executor, Runnable command, long initialDelay, long period, TimeUnit unit) {
return executor.scheduleAtFixedRate(() -> {
@@ -1,6 +1,7 @@
package us.ajg0702.queue.common.queues;
import com.google.common.collect.ImmutableList;
import us.ajg0702.queue.api.events.PositionChangeEvent;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.queues.Balancer;
@@ -203,6 +204,7 @@ public class QueueServerImpl implements QueueServer {
public synchronized void removePlayer(QueuePlayer player) {
main.getQueueManager().getSendingAttempts().remove(player);
queue.remove(player);
positionChange();
}
@Override
@@ -226,6 +228,7 @@ public class QueueServerImpl implements QueueServer {
} else {
queue.add(player);
}
positionChange();
}
@Override
@@ -316,4 +319,10 @@ public class QueueServerImpl implements QueueServer {
return balancer;
}
private void positionChange() {
main.getTaskManager().runNow(
() -> queue.forEach(queuePlayer -> main.call(new PositionChangeEvent(queuePlayer)))
);
}
}
@@ -0,0 +1,21 @@
package us.ajg0702.queue.common.utils;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
public class QueueThreadFactory implements ThreadFactory {
private final String name;
private final AtomicInteger i = new AtomicInteger(0);
public QueueThreadFactory(String name) {
this.name = name;
}
@Override
public Thread newThread(@NotNull Runnable runnable) {
return new Thread(runnable, "AJQUEUE-" + name + "-" + i.incrementAndGet());
}
}