Add QueueHolder API
This commit is contained in:
@@ -3,6 +3,7 @@ package us.ajg0702.queue.api;
|
|||||||
import us.ajg0702.queue.api.events.utils.EventReceiver;
|
import us.ajg0702.queue.api.events.utils.EventReceiver;
|
||||||
import us.ajg0702.queue.api.premium.Logic;
|
import us.ajg0702.queue.api.premium.Logic;
|
||||||
import us.ajg0702.queue.api.premium.LogicGetter;
|
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.spigot.AjQueueSpigotAPI;
|
||||||
import us.ajg0702.queue.api.util.QueueLogger;
|
import us.ajg0702.queue.api.util.QueueLogger;
|
||||||
import us.ajg0702.utils.common.Config;
|
import us.ajg0702.utils.common.Config;
|
||||||
@@ -12,6 +13,8 @@ import java.util.concurrent.ExecutorService;
|
|||||||
|
|
||||||
public abstract class AjQueueAPI {
|
public abstract class AjQueueAPI {
|
||||||
|
|
||||||
|
public static QueueHolderRegistry queueHolderRegistry = new QueueHolderRegistry();
|
||||||
|
|
||||||
public static AjQueueAPI INSTANCE;
|
public static AjQueueAPI INSTANCE;
|
||||||
public static AjQueueSpigotAPI SPIGOT_INSTANCE;
|
public static AjQueueSpigotAPI SPIGOT_INSTANCE;
|
||||||
|
|
||||||
@@ -121,6 +124,10 @@ public abstract class AjQueueAPI {
|
|||||||
*/
|
*/
|
||||||
public abstract void shutdown();
|
public abstract void shutdown();
|
||||||
|
|
||||||
|
public static QueueHolderRegistry getQueueHolderRegistry() {
|
||||||
|
return queueHolderRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract <E> void listen(Class<E> event, EventReceiver<E> handler);
|
public abstract <E> void listen(Class<E> event, EventReceiver<E> handler);
|
||||||
|
|
||||||
public abstract ExecutorService getServersUpdateExecutor();
|
public abstract ExecutorService getServersUpdateExecutor();
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
package us.ajg0702.queue.api;
|
|
||||||
|
|
||||||
public interface QueueHolder {
|
|
||||||
boolean isAvailable();
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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<QueuePlayer> getAllPlayers();
|
||||||
|
}
|
||||||
@@ -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<String, Class<? extends QueueHolder>> holders = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a QueueHolder that can be used
|
||||||
|
* @param holder The QueueHolder to register
|
||||||
|
*/
|
||||||
|
public void register(String identifier, Class<? extends QueueHolder> 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<? extends QueueHolder> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package us.ajg0702.queue.api.queues;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import us.ajg0702.queue.api.players.AdaptedPlayer;
|
import us.ajg0702.queue.api.players.AdaptedPlayer;
|
||||||
import us.ajg0702.queue.api.players.QueuePlayer;
|
import us.ajg0702.queue.api.players.QueuePlayer;
|
||||||
|
import us.ajg0702.queue.api.queueholders.QueueHolder;
|
||||||
import us.ajg0702.queue.api.server.AdaptedServer;
|
import us.ajg0702.queue.api.server.AdaptedServer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -17,7 +18,9 @@ public interface QueueServer {
|
|||||||
/**
|
/**
|
||||||
* Get the players who are queued.
|
* Get the players who are queued.
|
||||||
* @return 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<QueuePlayer> getQueue();
|
ImmutableList<QueuePlayer> getQueue();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -219,6 +222,12 @@ public interface QueueServer {
|
|||||||
*/
|
*/
|
||||||
Balancer getBalancer();
|
Balancer getBalancer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the QueueHolder for this queue
|
||||||
|
* @return the QueueHolder that holds the queue
|
||||||
|
*/
|
||||||
|
QueueHolder getQueueHolder();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* elliot is bad
|
* elliot is bad
|
||||||
|
|||||||
@@ -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<QueuePlayer> 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<QueuePlayer> getAllPlayers() {
|
||||||
|
return ImmutableList.copyOf(queue);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -200,6 +200,8 @@ public class QueueMain extends AjQueueAPI {
|
|||||||
|
|
||||||
constructMessages();
|
constructMessages();
|
||||||
|
|
||||||
|
getQueueHolderRegistry().register("default", DefaultQueueHolder.class);
|
||||||
|
|
||||||
logic = logicGetter.constructLogic();
|
logic = logicGetter.constructLogic();
|
||||||
aliasManager = logicGetter.constructAliasManager(config);
|
aliasManager = logicGetter.constructAliasManager(config);
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
package us.ajg0702.queue.common.queues;
|
package us.ajg0702.queue.common.queues;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import us.ajg0702.queue.api.AjQueueAPI;
|
||||||
import us.ajg0702.queue.api.events.PositionChangeEvent;
|
import us.ajg0702.queue.api.events.PositionChangeEvent;
|
||||||
import us.ajg0702.queue.api.players.AdaptedPlayer;
|
import us.ajg0702.queue.api.players.AdaptedPlayer;
|
||||||
import us.ajg0702.queue.api.players.QueuePlayer;
|
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.Balancer;
|
||||||
import us.ajg0702.queue.api.queues.QueueServer;
|
import us.ajg0702.queue.api.queues.QueueServer;
|
||||||
import us.ajg0702.queue.api.server.AdaptedServer;
|
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 us.ajg0702.utils.common.Messages;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
|
||||||
|
|
||||||
public class QueueServerImpl implements QueueServer {
|
public class QueueServerImpl implements QueueServer {
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@ public class QueueServerImpl implements QueueServer {
|
|||||||
|
|
||||||
private final List<AdaptedServer> servers;
|
private final List<AdaptedServer> servers;
|
||||||
|
|
||||||
private final List<QueuePlayer> queue = new CopyOnWriteArrayList<>();
|
private final QueueHolder queueHolder = AjQueueAPI.getQueueHolderRegistry().getQueueHolder(this);
|
||||||
|
|
||||||
private List<Integer> supportedProtocols = new ArrayList<>();
|
private List<Integer> supportedProtocols = new ArrayList<>();
|
||||||
|
|
||||||
@@ -123,7 +124,7 @@ public class QueueServerImpl implements QueueServer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableList<QueuePlayer> getQueue() {
|
public ImmutableList<QueuePlayer> getQueue() {
|
||||||
return ImmutableList.copyOf(queue);
|
return ImmutableList.copyOf(queueHolder.getAllPlayers());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -248,7 +249,7 @@ public class QueueServerImpl implements QueueServer {
|
|||||||
@Override
|
@Override
|
||||||
public void removePlayer(QueuePlayer player) {
|
public void removePlayer(QueuePlayer player) {
|
||||||
main.getQueueManager().getSendingAttempts().remove(player);
|
main.getQueueManager().getSendingAttempts().remove(player);
|
||||||
queue.remove(player);
|
queueHolder.removePlayer(player);
|
||||||
positionChange();
|
positionChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,12 +267,12 @@ public class QueueServerImpl implements QueueServer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addPlayer(QueuePlayer player, int position) {
|
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) {
|
if(position >= 0) {
|
||||||
queue.add(position, player);
|
queueHolder.addPlayer(player, position);
|
||||||
} else {
|
} else {
|
||||||
queue.add(player);
|
queueHolder.addPlayer(player);
|
||||||
}
|
}
|
||||||
positionChange();
|
positionChange();
|
||||||
}
|
}
|
||||||
@@ -328,12 +329,7 @@ public class QueueServerImpl implements QueueServer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public QueuePlayer findPlayer(String player) {
|
public QueuePlayer findPlayer(String player) {
|
||||||
for(QueuePlayer queuePlayer : queue) {
|
return queueHolder.findPlayer(player);
|
||||||
if(queuePlayer.getName().equalsIgnoreCase(player)) {
|
|
||||||
return queuePlayer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public QueuePlayer findPlayer(AdaptedPlayer player) {
|
public QueuePlayer findPlayer(AdaptedPlayer player) {
|
||||||
@@ -341,12 +337,7 @@ public class QueueServerImpl implements QueueServer {
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public QueuePlayer findPlayer(UUID uuid) {
|
public QueuePlayer findPlayer(UUID uuid) {
|
||||||
for(QueuePlayer queuePlayer : queue) {
|
return queueHolder.findPlayer(uuid);
|
||||||
if(queuePlayer.getUniqueId().toString().equals(uuid.toString())) {
|
|
||||||
return queuePlayer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -369,9 +360,14 @@ public class QueueServerImpl implements QueueServer {
|
|||||||
return balancer;
|
return balancer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public QueueHolder getQueueHolder() {
|
||||||
|
return queueHolder;
|
||||||
|
}
|
||||||
|
|
||||||
private void positionChange() {
|
private void positionChange() {
|
||||||
main.getTaskManager().runNow(
|
main.getTaskManager().runNow(
|
||||||
() -> queue.forEach(queuePlayer -> {
|
() -> queueHolder.getAllPlayers().forEach(queuePlayer -> {
|
||||||
if(((QueuePlayerImpl) queuePlayer).lastPosition != queuePlayer.getPosition()) {
|
if(((QueuePlayerImpl) queuePlayer).lastPosition != queuePlayer.getPosition()) {
|
||||||
main.call(new PositionChangeEvent(queuePlayer));
|
main.call(new PositionChangeEvent(queuePlayer));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -290,6 +290,11 @@ require-queueserver-permission: false
|
|||||||
# Default: 10
|
# Default: 10
|
||||||
max-tries: 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?
|
# Should we enable the ajqueue.make-room permission?
|
||||||
# The make-room permission will force there to be room in a server.
|
# 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
|
# 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!
|
# This is ONLY here so that they can be moved to messages.yml. Please edit these in messages.yml!
|
||||||
|
|||||||
Reference in New Issue
Block a user