From 473959dda4a715b6d0d56f67798079ad055849c9 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 9 Oct 2021 12:32:46 -0700 Subject: [PATCH] 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