From 4d91663e201e300573070c21c11815a592752135 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 7 Oct 2021 19:19:26 -0700 Subject: [PATCH 01/11] add warning if ajqueue is running on spigot without a proxy --- .../queue/common/EventHandlerImpl.java | 4 ++++ .../us/ajg0702/queue/spigot/Commands.java | 4 ++++ .../us/ajg0702/queue/spigot/SpigotMain.java | 21 ++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java index aac4a69..238baa9 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -33,6 +33,10 @@ public class EventHandlerImpl implements EventHandler { try { String subchannel = in.readUTF(); + if(subchannel.equals("ack")) { + main.getPlatformMethods().sendPluginMessage(recievingPlayer, "ack", "yes, im here"); + } + if(subchannel.equals("queue")) { String rawData = in.readUTF(); String[] args = new String[1]; diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java index c4a0368..cbd9460 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java @@ -17,6 +17,10 @@ public class Commands implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if(!pl.hasProxy()) { + sender.sendMessage(color("&cajQueue must also be installed on the proxy!&7 If it has been installed on the proxy, make sure it loaded correctly and try relogging.")); + return true; + } Player player = null; if(sender instanceof Player) { player = (Player) sender; diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java b/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java index 76eb6fb..78124c9 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java @@ -9,6 +9,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.plugin.java.JavaPlugin; @@ -26,6 +27,8 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List Placeholders placeholders; ConfigFile config; + + boolean hasProxy = false; @SuppressWarnings("ConstantConditions") public void onEnable() { @@ -74,7 +77,11 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List getLogger().info("Spigot side enabled! v"+getDescription().getVersion()); } - + + public boolean hasProxy() { + return hasProxy; + } + final HashMap queuebatch = new HashMap<>(); @Override @@ -85,6 +92,10 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List String subchannel = in.readUTF(); + if(subchannel.equals("ack")) { + hasProxy = true; + } + if(subchannel.equals("inqueueevent")) { String playername = in.readUTF(); Player p = Bukkit.getPlayer(playername); @@ -180,6 +191,14 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List placeholders.cleanCache(); } + @EventHandler + public void onJoin(PlayerJoinEvent e) { + if(hasProxy) return; + Bukkit.getScheduler().runTask(this, () -> { + sendMessage(e.getPlayer(), "ack", ""); + }); + } + @EventHandler(priority = EventPriority.HIGH) public void onServerPing(ServerListPingEvent e) { if(!config.getBoolean("take-over-motd-for-whitelist")) return; From 74ee9fcf0e1d682141e798b26e3c7fda9d2a8ca5 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 8 Oct 2021 14:58:41 -0700 Subject: [PATCH 02/11] add canJoinFull method --- .../us/ajg0702/queue/api/commands/ICommandSender.java | 1 + .../java/us/ajg0702/queue/api/queues/QueueServer.java | 9 ++++++++- .../main/java/us/ajg0702/queue/commands/BaseCommand.java | 1 + .../java/us/ajg0702/queue/common/QueueManagerImpl.java | 8 ++------ .../us/ajg0702/queue/common/queues/QueueServerImpl.java | 5 +++++ 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java b/api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java index 9bc925a..041aa1d 100644 --- a/api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java +++ b/api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.api.commands; import net.kyori.adventure.audience.Audience; import us.ajg0702.queue.api.util.Handle; +@SuppressWarnings("BooleanMethodIsAlwaysInverted") public interface ICommandSender extends Handle, Audience { boolean hasPermission(String permission); boolean isPlayer(); 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 d860358..14f558d 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 @@ -13,7 +13,7 @@ import java.util.UUID; /** * Represents a server or a group that can be queued for */ -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "BooleanMethodIsAlwaysInverted"}) public interface QueueServer { /** @@ -232,6 +232,13 @@ public interface QueueServer { */ void setSupportedProtocols(List list); + /** + * Checks if the player can join this server even if its full + * @param player The player + * @return If the player can join this server if its full + */ + boolean canJoinFull(AdaptedPlayer player); + /** * elliot is bad diff --git a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java index 6125c07..dcb0be2 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java @@ -54,6 +54,7 @@ public class BaseCommand implements IBaseCommand { sender.sendMessage(Component.text("Unimplemented command")); } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public boolean checkPermission(ICommandSender sender) { if(getPermission() != null && !sender.hasPermission(getPermission())) { sender.sendMessage(getMessages().getComponent("noperm")); diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index ff68ca4..2dff0d1 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -528,11 +528,7 @@ public class QueueManagerImpl implements QueueManager { AdaptedPlayer player = p.getPlayer(); if(player == null) continue; - boolean bypassFull = - p.getPlayer().hasPermission("ajqueue.joinfull") || - p.getPlayer().hasPermission("ajqueue.joinfullserver."+server.getName()); - - if(server.isFull() && !bypassFull) continue; + if(server.isFull() && !server.canJoinFull(p.getPlayer())) continue; AdaptedServer selected = server.getIdealServer(player); if(selected == null) { @@ -578,7 +574,7 @@ public class QueueManagerImpl implements QueueManager { if(!server.canAccess(nextPlayer)) continue; - if(server.isFull() && !nextPlayer.hasPermission("ajqueue.joinfull")) continue; + if(server.isFull() && !server.canJoinFull(nextPlayer)) continue; if(main.getConfig().getBoolean("enable-bypasspaused-permission")) { if(server.isPaused() && !nextPlayer.hasPermission("ajqueue.bypasspaused")) continue; 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 0047a6c..7b515c4 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 @@ -428,4 +428,9 @@ public class QueueServerImpl implements QueueServer { public void setSupportedProtocols(List list) { supportedProtocols = new ArrayList<>(list); } + + @Override + public boolean canJoinFull(AdaptedPlayer player) { + return player.hasPermission("ajqueue.joinfull") || player.hasPermission("ajqueue.joinfullserver."+name); + } } From 5bb2d1eecdbf39d29958e000925488252b9644cd Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 8 Oct 2021 14:59:04 -0700 Subject: [PATCH 03/11] fix full bypass permission not being checking in isJoinable --- .../ajg0702/queue/common/queues/QueueServerImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 7b515c4..d10dc10 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 @@ -253,12 +253,16 @@ public class QueueServerImpl implements QueueServer { @Override public boolean isJoinable(AdaptedPlayer p) { - if(p != null && isWhitelisted() && !whitelistedUUIDs.contains(p.getUniqueId())) { - return false; + if(p != null) { + if (isWhitelisted() && !whitelistedUUIDs.contains(p.getUniqueId())) { + return false; + } + if (isFull() && !canJoinFull(p)) { + return false; + } } return isOnline() && canAccess(p) && - !isFull() && !isPaused(); } From 46c06b596a18f84be92d7bcfff7e65386204b9fc Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 8 Oct 2021 15:01:34 -0700 Subject: [PATCH 04/11] add ajqueue.joinfullandbypass permission --- .../java/us/ajg0702/queue/common/queues/QueueServerImpl.java | 5 ++++- .../src/main/java/us/ajg0702/queue/logic/PremiumLogic.java | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) 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 d10dc10..c6179a0 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 @@ -435,6 +435,9 @@ public class QueueServerImpl implements QueueServer { @Override public boolean canJoinFull(AdaptedPlayer player) { - return player.hasPermission("ajqueue.joinfull") || player.hasPermission("ajqueue.joinfullserver."+name); + return + player.hasPermission("ajqueue.joinfull") || + player.hasPermission("ajqueue.joinfullserver."+name) || + player.hasPermission("ajqueue.joinfullandbypass"); } } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java index eb1c545..6605b60 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -39,6 +39,7 @@ public class PremiumLogic implements Logic { if( player.hasPermission("ajqueue.bypass") || player.hasPermission("ajqueue.serverbypass."+server.getName()) || + player.hasPermission("ajqueue.joinfullandbypass") || permissionGetter.hasContextBypass(player, server.getName()) ) { if(debug) { From 7c12c8f33e552b9fa42458fc6c0787b6ac62a59c Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 11:29:35 -0700 Subject: [PATCH 05/11] add ajqueue.joinfullandbypassserver. --- .../java/us/ajg0702/queue/common/queues/QueueServerImpl.java | 1 + premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java | 1 + 2 files changed, 2 insertions(+) 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 c6179a0..2573a49 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 @@ -438,6 +438,7 @@ public class QueueServerImpl implements QueueServer { return player.hasPermission("ajqueue.joinfull") || player.hasPermission("ajqueue.joinfullserver."+name) || + player.hasPermission("ajqueue.joinfullandbypassserver."+name) || player.hasPermission("ajqueue.joinfullandbypass"); } } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java index 6605b60..4e34411 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -39,6 +39,7 @@ public class PremiumLogic implements Logic { if( player.hasPermission("ajqueue.bypass") || player.hasPermission("ajqueue.serverbypass."+server.getName()) || + player.hasPermission("ajqueue.joinfullandbypassserver."+server.getName()) || player.hasPermission("ajqueue.joinfullandbypass") || permissionGetter.hasContextBypass(player, server.getName()) ) { From 5d76c2defbad42cd3895ebd2be190a3536c26b5b Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 11:30:29 -0700 Subject: [PATCH 06/11] wip: balancer modes --- .../java/us/ajg0702/queue/api/queues/Balancer.java | 8 ++++++++ .../java/us/ajg0702/queue/api/queues/QueueServer.java | 6 ++++++ .../us/ajg0702/queue/common/QueueManagerImpl.java | 4 +++- common/src/main/resources/config.yml | 11 ++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 api/src/main/java/us/ajg0702/queue/api/queues/Balancer.java diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/Balancer.java b/api/src/main/java/us/ajg0702/queue/api/queues/Balancer.java new file mode 100644 index 0000000..331aec4 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/queues/Balancer.java @@ -0,0 +1,8 @@ +package us.ajg0702.queue.api.queues; + +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; + +public interface Balancer { + AdaptedServer getIdealServer(AdaptedPlayer player); +} 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 d860358..275a071 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 @@ -232,6 +232,12 @@ public interface QueueServer { */ void setSupportedProtocols(List list); + /** + * Gets the balancer this server is using + * @return The balancer this server is using + */ + Balancer getBalancer(); + /** * elliot is bad diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index ff68ca4..3485013 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -116,7 +116,9 @@ public class QueueManagerImpl implements QueueManager { return false; } - if(player.getServerName().equals(server.getName())) { + List notInServers = new ArrayList<>(server.getServers()); + notInServers.removeIf(adaptedServer -> !adaptedServer.getName().equals(player.getServerName())); + if(notInServers.size() > 0) { player.sendMessage(msgs.getComponent("errors.already-connected", "SERVER:"+server.getAlias())); return false; } diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 7ddcf6b..213c1f8 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -267,4 +267,13 @@ enable-updater: true # For example, if survival is in this list, then if a player executes /survival # then they will be put in the queue for survival # This works for both servers and groups -slash-servers: [] \ No newline at end of file +slash-servers: [] + +# What balancer should we use? +# If a group is not specified here, then the default one is used +# Example entry: - bedwars: minigame +# Balancers: +# default - Will send the player to the server in the group with the least number of players +# minigame - Will send the player to the server with the most players, until that server is full, which it will then send to the next full server +balancer-types: + - bedwars: minigame \ No newline at end of file From 473959dda4a715b6d0d56f67798079ad055849c9 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 12:32:46 -0700 Subject: [PATCH 07/11] finish minigame balancer --- .../queue/common/queues/QueueServerImpl.java | 69 +++++++++++-------- .../queues/balancers/DefaultBalancer.java | 55 +++++++++++++++ .../queues/balancers/MinigameBalancer.java | 56 +++++++++++++++ .../ajg0702/queue/common/utils/Debugger.java | 11 +++ common/src/main/resources/config.yml | 12 ++-- 5 files changed, 169 insertions(+), 34 deletions(-) create mode 100644 common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/utils/Debugger.java 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 2573a49..80d9bc8 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,13 +1,18 @@ package us.ajg0702.queue.common.queues; import com.google.common.collect.ImmutableList; +import jdk.nashorn.internal.runtime.Debug; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.Balancer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServerPing; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.common.players.QueuePlayerImpl; +import us.ajg0702.queue.common.queues.balancers.DefaultBalancer; +import us.ajg0702.queue.common.queues.balancers.MinigameBalancer; +import us.ajg0702.queue.common.utils.Debugger; import us.ajg0702.utils.common.GenUtils; import us.ajg0702.utils.common.Messages; @@ -30,6 +35,32 @@ public class QueueServerImpl implements QueueServer { this.servers = servers; this.main = main; + List types = main.getConfig().getStringList("balancer-types"); + for(String type : types) { + int colon = type.indexOf(":"); + if(colon == -1) continue; + String groupName = type.substring(0, colon); + String balancerType = type.substring(colon+1); + + if(groupName.equals(name)) { + boolean valid = true; + switch(balancerType.toLowerCase(Locale.ROOT)) { + case "minigame": + balancer = new MinigameBalancer(this, main); + break; + default: + balancerType = "default"; + balancer = new DefaultBalancer(this, main); + } + Debugger.debug("Using "+balancerType.toLowerCase(Locale.ROOT)+" balancer for "+name); + break; + } + } + if(balancer == null) { + balancer = new DefaultBalancer(this, main); + Debugger.debug("Using default balancer for "+name); + } + for(QueuePlayer queuePlayer : previousPlayers) { if(queuePlayer.getPlayer() == null) { addPlayer( @@ -64,6 +95,8 @@ public class QueueServerImpl implements QueueServer { private List supportedProtocols = new ArrayList<>(); + private Balancer balancer; + private int playerCount; private int maxPlayers; @@ -386,36 +419,7 @@ public class QueueServerImpl implements QueueServer { @Override public AdaptedServer getIdealServer(AdaptedPlayer player) { - HashMap serverInfos = pings; - AdaptedServer selected = null; - int selectednum = 0; - if(serverInfos.keySet().size() == 1) { - selected = serverInfos.keySet().iterator().next(); - } else { - for(AdaptedServer si : serverInfos.keySet()) { - AdaptedServerPing sp = serverInfos.get(si); - if(sp == null) continue; - int online = sp.getPlayerCount(); - if(selected == null) { - selected = si; - selectednum = online; - continue; - } - if(selectednum > online && main.getQueueManager().findServer(si.getName()).isJoinable(player)) { - selected = si; - selectednum = online; - } - } - } - if(selected == null && serverInfos.size() > 0) { - selected = serverInfos.keySet().iterator().next(); - } - if(selected == null) { - main.getLogger().warning("Unable to find ideal server, using random server from group."); - int r = GenUtils.randomInt(0, getServers().size()-1); - selected = getServers().get(r); - } - return selected; + return getBalancer().getIdealServer(player); } @Override @@ -433,6 +437,11 @@ public class QueueServerImpl implements QueueServer { supportedProtocols = new ArrayList<>(list); } + @Override + public Balancer getBalancer() { + return balancer; + } + @Override public boolean canJoinFull(AdaptedPlayer player) { return diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java new file mode 100644 index 0000000..bc69203 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java @@ -0,0 +1,55 @@ +package us.ajg0702.queue.common.queues.balancers; + +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.queues.Balancer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.AdaptedServerPing; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.GenUtils; + +import java.util.HashMap; + +public class DefaultBalancer implements Balancer { + + private final QueueServer server; + private final QueueMain main; + public DefaultBalancer(QueueServer server, QueueMain main) { + this.server = server; + this.main = main; + } + + @Override + public AdaptedServer getIdealServer(AdaptedPlayer player) { + HashMap serverInfos = server.getLastPings(); + AdaptedServer selected = null; + int selectednum = 0; + if(serverInfos.keySet().size() == 1) { + selected = serverInfos.keySet().iterator().next(); + } else { + for(AdaptedServer si : serverInfos.keySet()) { + AdaptedServerPing sp = serverInfos.get(si); + if(sp == null) continue; + int online = sp.getPlayerCount(); + if(selected == null) { + selected = si; + selectednum = online; + continue; + } + if(selectednum > online && main.getQueueManager().findServer(si.getName()).isJoinable(player)) { + selected = si; + selectednum = online; + } + } + } + if(selected == null && serverInfos.size() > 0) { + selected = serverInfos.keySet().iterator().next(); + } + if(selected == null) { + main.getLogger().warning("Unable to find ideal server, using random server from group."); + int r = GenUtils.randomInt(0, server.getServers().size()-1); + selected = server.getServers().get(r); + } + return selected; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java new file mode 100644 index 0000000..7de6107 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java @@ -0,0 +1,56 @@ +package us.ajg0702.queue.common.queues.balancers; + +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.queues.Balancer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.AdaptedServerPing; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.GenUtils; + +import java.util.HashMap; + +public class MinigameBalancer implements Balancer { + + private final QueueServer server; + private final QueueMain main; + public MinigameBalancer(QueueServer server, QueueMain main) { + this.server = server; + this.main = main; + } + + @Override + public AdaptedServer getIdealServer(AdaptedPlayer player) { + HashMap serverInfos = server.getLastPings(); + AdaptedServer selected = null; + int selectednum = 0; + if(serverInfos.keySet().size() == 1) { + selected = serverInfos.keySet().iterator().next(); + } else { + for(AdaptedServer si : serverInfos.keySet()) { + AdaptedServerPing sp = serverInfos.get(si); + if(sp == null) continue; + int online = sp.getPlayerCount(); + int max = sp.getMaxPlayers(); + if(selected == null) { + selected = si; + selectednum = online; + continue; + } + if(selectednum < online && online < max && main.getQueueManager().findServer(si.getName()).isJoinable(player)) { + selected = si; + selectednum = online; + } + } + } + if(selected == null && serverInfos.size() > 0) { + selected = serverInfos.keySet().iterator().next(); + } + if(selected == null) { + main.getLogger().warning("Unable to find ideal server, using random server from group."); + int r = GenUtils.randomInt(0, server.getServers().size()-1); + selected = server.getServers().get(r); + } + return selected; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/utils/Debugger.java b/common/src/main/java/us/ajg0702/queue/common/utils/Debugger.java new file mode 100644 index 0000000..46a78c8 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/utils/Debugger.java @@ -0,0 +1,11 @@ +package us.ajg0702.queue.common.utils; + +import us.ajg0702.queue.api.AjQueueAPI; + +public class Debugger { + public static void debug(String message) { + AjQueueAPI api = AjQueueAPI.getInstance(); + if(!api.getConfig().getBoolean("debug")) return; + api.getLogger().info("[debug] "+message); + } +} diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 213c1f8..420910b 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Dont touch this number please -config-version: 29 +config-version: 30 # This is the main config for ajQueue. @@ -271,9 +271,13 @@ slash-servers: [] # What balancer should we use? # If a group is not specified here, then the default one is used -# Example entry: - bedwars: minigame +# Example entry: - "bedwars:minigame" # Balancers: # default - Will send the player to the server in the group with the least number of players -# minigame - Will send the player to the server with the most players, until that server is full, which it will then send to the next full server +# minigame - Will send the player to the server with the most players, until that server is full, which it will then send to the next server balancer-types: - - bedwars: minigame \ No newline at end of file + - "bedwars:minigame" + + +# Should we print some extra stuff to the console that might help diagnose some issues? +debug: false \ No newline at end of file From 34e5176430c557d3b994b96eb29c8937d7c168ee Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 13:35:00 -0700 Subject: [PATCH 08/11] finish minigame balancer --- .../queue/common/queues/QueueServerImpl.java | 1 + .../queues/balancers/MinigameBalancer.java | 43 ++++++++----------- 2 files changed, 20 insertions(+), 24 deletions(-) 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 80d9bc8..5397493 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 @@ -419,6 +419,7 @@ public class QueueServerImpl implements QueueServer { @Override public AdaptedServer getIdealServer(AdaptedPlayer player) { + Debugger.debug(getBalancer().toString()); return getBalancer().getIdealServer(player); } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java index 7de6107..c74123d 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java @@ -6,9 +6,8 @@ import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServerPing; import us.ajg0702.queue.common.QueueMain; -import us.ajg0702.utils.common.GenUtils; -import java.util.HashMap; +import java.util.*; public class MinigameBalancer implements Balancer { @@ -22,35 +21,31 @@ public class MinigameBalancer implements Balancer { @Override public AdaptedServer getIdealServer(AdaptedPlayer player) { HashMap serverInfos = server.getLastPings(); - AdaptedServer selected = null; - int selectednum = 0; if(serverInfos.keySet().size() == 1) { - selected = serverInfos.keySet().iterator().next(); + return serverInfos.keySet().iterator().next(); } else { - for(AdaptedServer si : serverInfos.keySet()) { - AdaptedServerPing sp = serverInfos.get(si); + + List> servers = new ArrayList<>(serverInfos.entrySet()); + servers.sort(Comparator.comparingInt(o -> { + @SuppressWarnings("unchecked") + Map.Entry e = (Map.Entry) o; + return e.getValue().getPlayerCount(); + }).reversed()); + LinkedHashMap sortedServers = new LinkedHashMap<>(); + for(Map.Entry entry : servers) { + sortedServers.put(entry.getKey(), entry.getValue()); + } + + for(AdaptedServer si : sortedServers.keySet()) { + AdaptedServerPing sp = sortedServers.get(si); if(sp == null) continue; int online = sp.getPlayerCount(); int max = sp.getMaxPlayers(); - if(selected == null) { - selected = si; - selectednum = online; - continue; - } - if(selectednum < online && online < max && main.getQueueManager().findServer(si.getName()).isJoinable(player)) { - selected = si; - selectednum = online; + if(online < max) { + return si; } } + return new ArrayList(sortedServers.keySet().size()).get(sortedServers.keySet().size()-1); } - if(selected == null && serverInfos.size() > 0) { - selected = serverInfos.keySet().iterator().next(); - } - if(selected == null) { - main.getLogger().warning("Unable to find ideal server, using random server from group."); - int r = GenUtils.randomInt(0, server.getServers().size()-1); - selected = server.getServers().get(r); - } - return selected; } } From 088ef52d42020a4725bffe2efaaca1f448383ad7 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 14:04:32 -0700 Subject: [PATCH 09/11] fix error in minigame balancer --- .../queue/common/queues/balancers/MinigameBalancer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java index c74123d..12cf2cc 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java @@ -29,7 +29,9 @@ public class MinigameBalancer implements Balancer { servers.sort(Comparator.comparingInt(o -> { @SuppressWarnings("unchecked") Map.Entry e = (Map.Entry) o; - return e.getValue().getPlayerCount(); + AdaptedServerPing value = e.getValue(); + if(value == null) return -1; + return value.getPlayerCount(); }).reversed()); LinkedHashMap sortedServers = new LinkedHashMap<>(); for(Map.Entry entry : servers) { From c8a60ff18ec2f57d97d8e88240f748a032674e77 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 14:05:21 -0700 Subject: [PATCH 10/11] add some checks for if server is offline, not full --- .../java/us/ajg0702/queue/common/queues/QueueServerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 5397493..2eb8fec 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 @@ -144,7 +144,7 @@ public class QueueServerImpl implements QueueServer { return msgs.getString("status.offline.whitelisted"); } - if(isFull()) { + if(isFull() && !canJoinFull(p)) { return msgs.getString("status.offline.full"); } @@ -327,6 +327,7 @@ public class QueueServerImpl implements QueueServer { @Override public boolean isFull() { + if(!isOnline()) return false; return playerCount >= maxPlayers; } @@ -445,6 +446,7 @@ public class QueueServerImpl implements QueueServer { @Override public boolean canJoinFull(AdaptedPlayer player) { + if(player == null) return true; return player.hasPermission("ajqueue.joinfull") || player.hasPermission("ajqueue.joinfullserver."+name) || From 2a4acefc958c87f6e00f293aa9fcb749741b469c Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 18:12:56 -0700 Subject: [PATCH 11/11] 2.1.0 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index a3c1695..fbe3034 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ repositories { } allprojects { - version = "2.0.10" + version = "2.1.0" group = "us.ajg0702" plugins.apply("java")