Skip to content

Commit

Permalink
Add QueueHolder API
Browse files Browse the repository at this point in the history
  • Loading branch information
ajgeiss0702 committed Oct 21, 2023
1 parent 6886417 commit d769e4a
Show file tree
Hide file tree
Showing 9 changed files with 237 additions and 27 deletions.
7 changes: 7 additions & 0 deletions api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java
Expand Up @@ -3,6 +3,7 @@
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;
Expand All @@ -12,6 +13,8 @@

public abstract class AjQueueAPI {

public static QueueHolderRegistry queueHolderRegistry = new QueueHolderRegistry();

public static AjQueueAPI INSTANCE;
public static AjQueueSpigotAPI SPIGOT_INSTANCE;

Expand Down Expand Up @@ -121,6 +124,10 @@ public static AjQueueSpigotAPI getSpigotInstance() {
*/
public abstract void shutdown();

public static QueueHolderRegistry getQueueHolderRegistry() {
return queueHolderRegistry;
}

public abstract <E> void listen(Class<E> event, EventReceiver<E> handler);

public abstract ExecutorService getServersUpdateExecutor();
Expand Down
6 changes: 0 additions & 6 deletions api/src/main/java/us/ajg0702/queue/api/QueueHolder.java

This file was deleted.

@@ -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);
}
}
}
Expand Up @@ -3,6 +3,7 @@
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;
Expand All @@ -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<QueuePlayer> getQueue();

/**
Expand Down Expand Up @@ -219,6 +222,12 @@ default boolean isOnline() {
*/
Balancer getBalancer();

/**
* Gets the QueueHolder for this queue
* @return the QueueHolder that holds the queue
*/
QueueHolder getQueueHolder();


/**
* elliot is bad
Expand Down
@@ -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);
}
}
2 changes: 2 additions & 0 deletions common/src/main/java/us/ajg0702/queue/common/QueueMain.java
Expand Up @@ -200,6 +200,8 @@ public QueueMain(Implementation implementation, QueueLogger logger, PlatformMeth

constructMessages();

getQueueHolderRegistry().register("default", DefaultQueueHolder.class);

logic = logicGetter.constructLogic();
aliasManager = logicGetter.constructAliasManager(config);

Expand Down
@@ -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;
Expand All @@ -17,7 +19,6 @@
import us.ajg0702.utils.common.Messages;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class QueueServerImpl implements QueueServer {

Expand All @@ -27,7 +28,7 @@ public class QueueServerImpl implements QueueServer {

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<>();

Expand Down Expand Up @@ -123,7 +124,7 @@ public QueueServerImpl(String name, QueueMain main, List<AdaptedServer> servers,

@Override
public ImmutableList<QueuePlayer> getQueue() {
return ImmutableList.copyOf(queue);
return ImmutableList.copyOf(queueHolder.getAllPlayers());
}

@Override
Expand Down Expand Up @@ -248,7 +249,7 @@ public boolean isPaused() {
@Override
public void removePlayer(QueuePlayer player) {
main.getQueueManager().getSendingAttempts().remove(player);
queue.remove(player);
queueHolder.removePlayer(player);
positionChange();
}

Expand All @@ -266,12 +267,12 @@ public void addPlayer(QueuePlayer player) {

@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();
}
Expand Down Expand Up @@ -328,25 +329,15 @@ public boolean isGroup() {

@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) {
return findPlayer(player.getUniqueId());
}
@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
Expand All @@ -369,9 +360,14 @@ public Balancer getBalancer() {
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));
}
Expand Down

0 comments on commit d769e4a

Please sign in to comment.