Skip to content

Commit

Permalink
Added skip-queue-server-if-possible feature
Browse files Browse the repository at this point in the history
  • Loading branch information
ajgeiss0702 committed Nov 3, 2023
1 parent e811d07 commit 88b61ac
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 14 deletions.
3 changes: 3 additions & 0 deletions api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import us.ajg0702.utils.common.Config;
import us.ajg0702.utils.common.Messages;

import java.util.Map;
import java.util.concurrent.ExecutorService;

public abstract class AjQueueAPI {
Expand Down Expand Up @@ -122,6 +123,8 @@ public static AjQueueSpigotAPI getSpigotInstance() {
*/
public abstract ProtocolNameManager getProtocolNameManager();

public abstract Map<String, String> getQueueServers();

/**
* Tells ajQueue to shut down.
*/
Expand Down
7 changes: 5 additions & 2 deletions api/src/main/java/us/ajg0702/queue/api/EventHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package us.ajg0702.queue.api;

import net.kyori.adventure.text.Component;
import org.jetbrains.annotations.Nullable;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.server.AdaptedServer;

Expand All @@ -16,8 +17,10 @@ public interface EventHandler {
* Called when a player joins a server or switches between servers
* @param player the player
*/
void
onPlayerJoinServer(AdaptedPlayer player);
void onPlayerJoinServer(AdaptedPlayer player);

void onServerKick(AdaptedPlayer player, AdaptedServer from, Component reason, boolean moving);

@Nullable
AdaptedServer changeTargetServer(AdaptedPlayer player, AdaptedServer initialChoice);
}
15 changes: 12 additions & 3 deletions api/src/main/java/us/ajg0702/queue/api/QueueManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,31 @@ public interface QueueManager {
* Adds a player to a queue
* @param player The player to be added
* @param server The server or group to add the player to
* @return True if adding was successfull, false if not.
* @return True if adding was successful, false if not.
*/
boolean addToQueue(AdaptedPlayer player, QueueServer server);

/**
* Adds a player to a queue
* @param player The player to be added
* @param serverName The name of the server or group to add the player too
* @return True if adding was successfull, false if not.
* @return True if adding was successful, false if not.
*/
@SuppressWarnings("UnusedReturnValue")
boolean addToQueue(AdaptedPlayer player, String serverName);

/**
* Checks if a player would be sent instantly if they were to join the queue right now
* @param player the player to check
* @param queueServer The QueueServer to check for
* @return if the player would be sent instantly if they join the queue now
*/
boolean canSendInstantly(AdaptedPlayer player, QueueServer queueServer);


/**
* Gets a list of QueueServers (servers and groups)
* @return A list of QueueServerss
* @return A list of QueueServers
*/
ImmutableList<QueueServer> getServers();

Expand Down
23 changes: 23 additions & 0 deletions common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import us.ajg0702.queue.api.EventHandler;
import us.ajg0702.queue.api.events.SuccessfulSendEvent;
import us.ajg0702.queue.api.players.AdaptedPlayer;
Expand All @@ -18,6 +19,7 @@

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class EventHandlerImpl implements EventHandler {
Expand Down Expand Up @@ -213,4 +215,25 @@ public void onServerKick(AdaptedPlayer player, @NotNull AdaptedServer from, Comp
}
}
}

@Override
public @Nullable AdaptedServer changeTargetServer(AdaptedPlayer player, AdaptedServer initialChoice) {

if(!main.getConfig().getBoolean("skip-queue-server-if-possible")) return null;

Map<String, String> queueServers = main.getQueueServers();

String toName = queueServers.get(initialChoice.getName());

// don't change if initial target server isn't a queue-server
if(toName == null) return null;

QueueServer to = main.getQueueManager().findServer(toName);

if(!main.getQueueManager().canSendInstantly(player, to)) return null;

Debug.info("Skipping queue-server " + initialChoice.getName() + " for " + player.getName() + " because they would be sent instantly! (skip-queue-server-if-possible)");

return to.getIdealServer(player);
}
}
19 changes: 19 additions & 0 deletions common/src/main/java/us/ajg0702/queue/common/QueueMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
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.queues.QueueServer;
import us.ajg0702.queue.api.util.QueueLogger;
import us.ajg0702.queue.common.utils.Debug;
import us.ajg0702.queue.common.utils.LogConverter;
import us.ajg0702.queue.logic.LogicGetterImpl;
import us.ajg0702.utils.common.Config;
Expand Down Expand Up @@ -114,6 +116,23 @@ public ProtocolNameManager getProtocolNameManager() {
return protocolNameManager;
}

@Override
public Map<String, String> getQueueServers() {
List<String> rawQueueServers = getConfig().getStringList("queue-servers");
Map<String, String> r = new HashMap<>();
for(String rawQueueServer : rawQueueServers) {
if(!rawQueueServer.contains(":")) continue;
String[] parts = rawQueueServer.split(":");
String fromName = parts[0];
String toName = parts[1];
QueueServer toServer = getQueueManager().findServer(toName);
if(toServer == null) continue;

r.put(fromName, toName);
}
return r;
}

private Updater updater;
public Updater getUpdater() {
return updater;
Expand Down
24 changes: 16 additions & 8 deletions common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ public boolean addToQueue(AdaptedPlayer player, QueueServer server) {

// Player should be added!

ImmutableList<QueuePlayer> list = server.getQueue();
List<QueuePlayer> list = server.getQueueHolder().getAllPlayers();
QueuePlayer queuePlayer;
AdaptedServer ideal = server.getIdealServer(player);
if(main.isPremium()) {
Expand Down Expand Up @@ -249,20 +249,15 @@ public boolean addToQueue(AdaptedPlayer player, QueueServer server) {
}
}

list = server.getQueue();
list = server.getQueueHolder().getAllPlayers();

int pos = queuePlayer.getPosition();
int len = list.size();

boolean sendInstant = server.isJoinable(player);
boolean sendInstantp = list.size() <= 1 && server.isJoinable(player);
boolean timeGood = !main.getConfig().getBoolean("check-last-player-sent-time") || server.getLastSentTime() > Math.floor(main.getTimeBetweenPlayers() * 1000);
boolean alwaysSendInstantly = main.getConfig().getStringList("send-instantly").contains(server.getName());
boolean sentInstantly = canSendInstantly(player, server);
boolean hasBypass = main.getLogic().hasAnyBypass(player, server.getName());

boolean sentInstantly = alwaysSendInstantly || (sendInstant && (sendInstantp && timeGood)) || hasBypass;

Debug.info("should send instantly (" + sentInstantly + "): " + alwaysSendInstantly + " || (" + sendInstant + " && (" + sendInstantp + " && " + timeGood + ") && " + (!hasBypass) + ")");
if(sentInstantly) {
if(!hasBypass) {
sendPlayers(server);
Expand Down Expand Up @@ -316,6 +311,19 @@ public boolean addToQueue(AdaptedPlayer player, String serverName) {
return addToQueue(player, server);
}

@Override
public boolean canSendInstantly(AdaptedPlayer player, QueueServer queueServer) {
boolean isJoinable = queueServer.isJoinable(player);
boolean sizeGood = queueServer.getQueueHolder().getQueueSize() <= 1 && isJoinable;
boolean timeGood = !main.getConfig().getBoolean("check-last-player-sent-time") || queueServer.getLastSentTime() > Math.floor(main.getTimeBetweenPlayers() * 1000);
boolean alwaysSendInstantly = main.getConfig().getStringList("send-instantly").contains(queueServer.getName());
boolean hasBypass = main.getLogic().hasAnyBypass(player, queueServer.getName());

boolean sentInstantly = alwaysSendInstantly || (isJoinable && (sizeGood && timeGood)) || hasBypass;
Debug.info("should send instantly (" + sentInstantly + "): " + alwaysSendInstantly + " || (" + isJoinable + " && (" + sizeGood + " && " + timeGood + ") && " + (!hasBypass) + ")");
return sentInstantly;
}

@Override
public ImmutableList<QueueServer> getServers() {
return ImmutableList.copyOf(servers);
Expand Down
7 changes: 6 additions & 1 deletion common/src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ queue-servers:
# Default: 0
queue-server-delay: 0

# Before a player connects to a queue-server, check if they would be instantly sent to the target server.
# If they would, this option will bypass the queue-server completely and connect them directly to the target server.
skip-queue-server-if-possible: true


# Should we completely kick the user from the server if they are in a queue-server
# and are kicked from the server with one of the above reasons?
# Note this will do nothing on servers that aren't queue-servers
Expand Down Expand Up @@ -389,7 +394,7 @@ debug: false


# Don't touch this number please
config-version: 44
config-version: 45


# This is ONLY here so that they can be moved to messages.yml. Please edit these in messages.yml!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.*;
import net.md_5.bungee.api.plugin.Listener;
Expand All @@ -12,8 +13,11 @@
import org.bstats.bungeecord.Metrics;
import org.bstats.charts.SimplePie;
import org.checkerframework.checker.nullness.qual.NonNull;
import us.ajg0702.queue.api.AjQueueAPI;
import us.ajg0702.queue.api.Implementation;
import us.ajg0702.queue.api.commands.IBaseCommand;
import us.ajg0702.queue.api.server.AdaptedServer;
import us.ajg0702.queue.api.server.AdaptedServerInfo;
import us.ajg0702.queue.api.util.QueueLogger;
import us.ajg0702.queue.commands.BaseCommand;
import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand;
Expand Down Expand Up @@ -152,6 +156,15 @@ public void onKick(ServerKickEvent e) {
});
}

@EventHandler
public void onServerConnect(ServerConnectEvent e) {
AdaptedServer newServer = main.getEventHandler().changeTargetServer(new BungeePlayer(e.getPlayer()), new BungeeServer(e.getTarget()));

if(newServer == null) return;

e.setTarget((ServerInfo) newServer.getHandle());
}

@Override
public void unregisterCommand(String name) {
BungeeCommand bungeeCommand = commandMap.get(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,22 @@
import com.velocitypowered.api.event.connection.PluginMessageEvent;
import com.velocitypowered.api.event.player.KickedFromServerEvent;
import com.velocitypowered.api.event.player.ServerPostConnectEvent;
import com.velocitypowered.api.event.player.ServerPreConnectEvent;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import net.kyori.adventure.text.Component;
import org.bstats.charts.SimplePie;
import org.bstats.velocity.Metrics;
import org.slf4j.Logger;
import us.ajg0702.queue.api.Implementation;
import us.ajg0702.queue.api.commands.IBaseCommand;
import us.ajg0702.queue.api.server.AdaptedServer;
import us.ajg0702.queue.commands.BaseCommand;
import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand;
import us.ajg0702.queue.commands.commands.listqueues.ListCommand;
Expand Down Expand Up @@ -151,6 +154,19 @@ public void onKick(KickedFromServerEvent e) {
);
}

@Subscribe
public void onPreConnect(ServerPreConnectEvent e) {
RegisteredServer to = e.getResult().getServer().orElse(null);

if(to == null) return;

AdaptedServer newServer = main.getEventHandler().changeTargetServer(new VelocityPlayer(e.getPlayer()), new VelocityServer(to));

if(newServer == null) return;

e.setResult(ServerPreConnectEvent.ServerResult.allowed((RegisteredServer) newServer.getHandle()));
}

@Override
public void unregisterCommand(String name) {
commandManager.unregister(name);
Expand Down

0 comments on commit 88b61ac

Please sign in to comment.