From d769e4a6d789ce658ca0f621f4539b9c3b8f4fb9 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 28 Aug 2023 18:24:59 -0700 Subject: [PATCH] Add QueueHolder API --- .../java/us/ajg0702/queue/api/AjQueueAPI.java | 7 ++ .../us/ajg0702/queue/api/QueueHolder.java | 6 -- .../queue/api/queueholders/QueueHolder.java | 84 +++++++++++++++++++ .../api/queueholders/QueueHolderRegistry.java | 44 ++++++++++ .../ajg0702/queue/api/queues/QueueServer.java | 9 ++ .../queue/common/DefaultQueueHolder.java | 69 +++++++++++++++ .../us/ajg0702/queue/common/QueueMain.java | 2 + .../queue/common/queues/QueueServerImpl.java | 36 ++++---- common/src/main/resources/config.yml | 7 +- 9 files changed, 237 insertions(+), 27 deletions(-) delete mode 100644 api/src/main/java/us/ajg0702/queue/api/QueueHolder.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolder.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolderRegistry.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/DefaultQueueHolder.java diff --git a/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java b/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java index c17d341..4e1d906 100644 --- a/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java +++ b/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.api; 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.queueholders.QueueHolderRegistry; import us.ajg0702.queue.api.spigot.AjQueueSpigotAPI; import us.ajg0702.queue.api.util.QueueLogger; import us.ajg0702.utils.common.Config; @@ -12,6 +13,8 @@ import java.util.concurrent.ExecutorService; public abstract class AjQueueAPI { + public static QueueHolderRegistry queueHolderRegistry = new QueueHolderRegistry(); + public static AjQueueAPI INSTANCE; public static AjQueueSpigotAPI SPIGOT_INSTANCE; @@ -121,6 +124,10 @@ public abstract class AjQueueAPI { */ public abstract void shutdown(); + public static QueueHolderRegistry getQueueHolderRegistry() { + return queueHolderRegistry; + } + public abstract void listen(Class event, EventReceiver handler); public abstract ExecutorService getServersUpdateExecutor(); diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueHolder.java b/api/src/main/java/us/ajg0702/queue/api/QueueHolder.java deleted file mode 100644 index a3ceb66..0000000 --- a/api/src/main/java/us/ajg0702/queue/api/QueueHolder.java +++ /dev/null @@ -1,6 +0,0 @@ -package us.ajg0702.queue.api; - -public interface QueueHolder { - boolean isAvailable(); - -} \ No newline at end of file diff --git a/api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolder.java b/api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolder.java new file mode 100644 index 0000000..d9cf7c6 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolder.java @@ -0,0 +1,84 @@ +package us.ajg0702.queue.api.queueholders; + +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; + +import java.util.List; +import java.util.UUID; + +public abstract class QueueHolder { + + private final QueueServer queueServer; + + public QueueHolder(QueueServer queueServer) { + this.queueServer = queueServer; + } + + /** + * Returns the identifier of this QueueHolder + * Used by the server owner in order to tell ajQueue to use this QueueHolder + * @return a string that is very unlikely to be re-used by another QueueHolder + */ + public abstract String getIdentifier(); + + + /** + * Adds a player to the end of the queue + * NOTE: Do not manually call this! Use the QueueManager to add players to queues + * @param player The QueuePlayer to add + */ + public abstract void addPlayer(QueuePlayer player); + + /** + * Adds a player to the specified position in the queue + * NOTE: Do not manually call this! Use the QueueManager to add players to queues + * @param player The QueuePlayer to add + * @param position The position to add them to + */ + public abstract void addPlayer(QueuePlayer player, int position); + + public void removePlayer(AdaptedPlayer player) { + removePlayer(player.getUniqueId()); + } + + public void removePlayer(UUID uuid) { + QueuePlayer player = findPlayer(uuid); + if(player == null) return; + removePlayer(player); + } + + /** + * Removes a player from the queue + * @param player The player to remove + */ + public abstract void removePlayer(QueuePlayer player); + + /** + * Finds the player with this uuid in this queue and returns the representative QueuePlayer + * @return The QueuePlayer representing the player, null if not found + */ + public abstract QueuePlayer findPlayer(UUID uuid); + + /** + * Finds the player with this username in this queue and returns the representative QueuePlayer + * @return The QueuePlayer representing the player, null if not found + */ + public abstract QueuePlayer findPlayer(String name); + + public QueuePlayer findPlayer(AdaptedPlayer player) { + return findPlayer(player.getUniqueId()); + } + + /** + * Returns the size of the queue + * @return The number of players in the queue + */ + public abstract int getQueueSize(); + + /** + * Get all players that are in the queue + * @return a list of players in the queue + */ + public abstract List getAllPlayers(); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolderRegistry.java b/api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolderRegistry.java new file mode 100644 index 0000000..5ac96d7 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/queueholders/QueueHolderRegistry.java @@ -0,0 +1,44 @@ +package us.ajg0702.queue.api.queueholders; + +import us.ajg0702.queue.api.AjQueueAPI; +import us.ajg0702.queue.api.queues.QueueServer; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class QueueHolderRegistry { + + private Map> holders = new ConcurrentHashMap<>(); + + /** + * Register a QueueHolder that can be used + * @param holder The QueueHolder to register + */ + public void register(String identifier, Class holder) { + holders.put(identifier, holder); + } + + public QueueHolder getQueueHolder(QueueServer queueServer) { + String queueHolderName = AjQueueAPI.getInstance().getConfig().getString("queue-holder"); + QueueHolder queueHolder = getQueueHolder(queueHolderName, queueServer); + if(queueHolder == null) { + AjQueueAPI.getInstance().getLogger().warn("Invalid queue-holder '" + queueHolderName + "'! Using the default one"); + return getQueueHolder("default", queueServer); + } + return queueHolder; + } + + public QueueHolder getQueueHolder(String identifier, QueueServer queueServer) { + Class holder = holders.get(identifier); + if(holder == null) return null; + try { + return holder.getConstructor(QueueServer.class).newInstance(queueServer); + } catch(NoSuchMethodException e) { + throw new IllegalArgumentException("QueueHolder " + identifier + " is missing the required constructor!"); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } +} diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index d8d135f..68c404d 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.api.queues; import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queueholders.QueueHolder; import us.ajg0702.queue.api.server.AdaptedServer; import java.util.List; @@ -17,7 +18,9 @@ public interface QueueServer { /** * Get the players who are queued. * @return The players who are queued + * @deprecated It is recommended to not use this method unless you absolutely have to. If you have to, use getQueueHolder().getAllPlayers() */ + @Deprecated ImmutableList getQueue(); /** @@ -219,6 +222,12 @@ public interface QueueServer { */ Balancer getBalancer(); + /** + * Gets the QueueHolder for this queue + * @return the QueueHolder that holds the queue + */ + QueueHolder getQueueHolder(); + /** * elliot is bad diff --git a/common/src/main/java/us/ajg0702/queue/common/DefaultQueueHolder.java b/common/src/main/java/us/ajg0702/queue/common/DefaultQueueHolder.java new file mode 100644 index 0000000..4fef9f5 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/DefaultQueueHolder.java @@ -0,0 +1,69 @@ +package us.ajg0702.queue.common; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queueholders.QueueHolder; +import us.ajg0702.queue.api.queues.QueueServer; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CopyOnWriteArrayList; + +public class DefaultQueueHolder extends QueueHolder { + + List queue = new CopyOnWriteArrayList<>(); + + public DefaultQueueHolder(QueueServer queueServer) { + super(queueServer); + } + + @Override + public String getIdentifier() { + return "default"; + } + + @Override + public void addPlayer(QueuePlayer player) { + queue.add(player); + } + + @Override + public void addPlayer(QueuePlayer player, int position) { + queue.add(position, player); + } + + @Override + public void removePlayer(QueuePlayer player) { + queue.remove(player); + } + + @Override + public QueuePlayer findPlayer(UUID uuid) { + for(QueuePlayer queuePlayer : queue) { + if(queuePlayer.getUniqueId().toString().equals(uuid.toString())) { + return queuePlayer; + } + } + return null; + } + + @Override + public QueuePlayer findPlayer(String name) { + for(QueuePlayer queuePlayer : queue) { + if(queuePlayer.getName().equalsIgnoreCase(name)) { + return queuePlayer; + } + } + return null; + } + + @Override + public int getQueueSize() { + return queue.size(); + } + + @Override + public List getAllPlayers() { + return ImmutableList.copyOf(queue); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 229fe71..3b0b5a0 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -200,6 +200,8 @@ public class QueueMain extends AjQueueAPI { constructMessages(); + getQueueHolderRegistry().register("default", DefaultQueueHolder.class); + logic = logicGetter.constructLogic(); aliasManager = logicGetter.constructAliasManager(config); diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index cbb3828..72561d1 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -1,9 +1,11 @@ package us.ajg0702.queue.common.queues; import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.AjQueueAPI; 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.queueholders.QueueHolder; import us.ajg0702.queue.api.queues.Balancer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; @@ -17,7 +19,6 @@ import us.ajg0702.queue.common.utils.Debug; import us.ajg0702.utils.common.Messages; import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; public class QueueServerImpl implements QueueServer { @@ -27,7 +28,7 @@ public class QueueServerImpl implements QueueServer { private final List servers; - private final List queue = new CopyOnWriteArrayList<>(); + private final QueueHolder queueHolder = AjQueueAPI.getQueueHolderRegistry().getQueueHolder(this); private List supportedProtocols = new ArrayList<>(); @@ -123,7 +124,7 @@ public class QueueServerImpl implements QueueServer { @Override public ImmutableList getQueue() { - return ImmutableList.copyOf(queue); + return ImmutableList.copyOf(queueHolder.getAllPlayers()); } @Override @@ -248,7 +249,7 @@ public class QueueServerImpl implements QueueServer { @Override public void removePlayer(QueuePlayer player) { main.getQueueManager().getSendingAttempts().remove(player); - queue.remove(player); + queueHolder.removePlayer(player); positionChange(); } @@ -266,12 +267,12 @@ public class QueueServerImpl implements QueueServer { @Override public void addPlayer(QueuePlayer player, int position) { - if(!player.getQueueServer().equals(this) || queue.contains(player)) return; + if(!player.getQueueServer().equals(this) || queueHolder.findPlayer(player.getUniqueId()) != null) return; if(position >= 0) { - queue.add(position, player); + queueHolder.addPlayer(player, position); } else { - queue.add(player); + queueHolder.addPlayer(player); } positionChange(); } @@ -328,12 +329,7 @@ public class QueueServerImpl implements QueueServer { @Override public QueuePlayer findPlayer(String player) { - for(QueuePlayer queuePlayer : queue) { - if(queuePlayer.getName().equalsIgnoreCase(player)) { - return queuePlayer; - } - } - return null; + return queueHolder.findPlayer(player); } @Override public QueuePlayer findPlayer(AdaptedPlayer player) { @@ -341,12 +337,7 @@ public class QueueServerImpl implements QueueServer { } @Override public QueuePlayer findPlayer(UUID uuid) { - for(QueuePlayer queuePlayer : queue) { - if(queuePlayer.getUniqueId().toString().equals(uuid.toString())) { - return queuePlayer; - } - } - return null; + return queueHolder.findPlayer(uuid); } @Override @@ -369,9 +360,14 @@ public class QueueServerImpl implements QueueServer { return balancer; } + @Override + public QueueHolder getQueueHolder() { + return queueHolder; + } + private void positionChange() { main.getTaskManager().runNow( - () -> queue.forEach(queuePlayer -> { + () -> queueHolder.getAllPlayers().forEach(queuePlayer -> { if(((QueuePlayerImpl) queuePlayer).lastPosition != queuePlayer.getPosition()) { main.call(new PositionChangeEvent(queuePlayer)); } diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index e53d287..846b3d1 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -290,6 +290,11 @@ require-queueserver-permission: false # Default: 10 max-tries: 10 +# What QueueHolder should we use? +# By default, the only QueueHolder available is 'default' +# But more may be available via addons (registered via the API) +queue-holder: default + # Should we enable the ajqueue.make-room permission? # The make-room permission will force there to be room in a server. @@ -377,7 +382,7 @@ debug: false # Don't touch this number please -config-version: 42 +config-version: 43 # This is ONLY here so that they can be moved to messages.yml. Please edit these in messages.yml!