Move server ping cache storage to the AdaptedServer instance
This commit is contained in:
@@ -3,6 +3,7 @@ package us.ajg0702.queue.commands.commands.manage.debug;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import us.ajg0702.queue.api.commands.ICommandSender;
|
||||
import us.ajg0702.queue.api.queues.QueueServer;
|
||||
import us.ajg0702.queue.api.server.AdaptedServer;
|
||||
import us.ajg0702.queue.commands.SubCommand;
|
||||
import us.ajg0702.queue.common.QueueMain;
|
||||
import us.ajg0702.utils.common.Messages;
|
||||
@@ -48,7 +49,7 @@ public class Whitelist extends SubCommand {
|
||||
sender.sendMessage(main.getMessages().toComponent("<red>Not enough args!"));
|
||||
return;
|
||||
}
|
||||
QueueServer server = main.getQueueManager().findServer(args[0]);
|
||||
AdaptedServer server = main.getPlatformMethods().getServer(args[0]);
|
||||
if(server == null) {
|
||||
sender.sendMessage(main.getMessages().toComponent("<red>Server not found"));
|
||||
return;
|
||||
|
||||
@@ -37,7 +37,7 @@ public class QueueManagerImpl implements QueueManager {
|
||||
|
||||
public List<QueueServer> buildServers() {
|
||||
List<QueueServer> result = new ArrayList<>();
|
||||
List<AdaptedServer> servers = main.getPlatformMethods().getServers();
|
||||
List<? extends AdaptedServer> servers = main.getPlatformMethods().getServers();
|
||||
|
||||
for(AdaptedServer server : servers) {
|
||||
QueueServer previousServer = main.getQueueManager().findServer(server.getName());
|
||||
@@ -49,9 +49,6 @@ public class QueueManagerImpl implements QueueManager {
|
||||
if(previousServer != null) {
|
||||
queueServer.setPaused(previousServer.isPaused());
|
||||
queueServer.setLastSentTime(previousServer.getLastSentTime());
|
||||
queueServer.setOnline(previousServer.isOnline());
|
||||
queueServer.setWhitelisted(previousServer.isWhitelisted());
|
||||
queueServer.setWhitelistedPlayers(previousServer.getWhitelistedPlayers());
|
||||
}
|
||||
result.add(queueServer);
|
||||
}
|
||||
@@ -162,12 +159,13 @@ public class QueueManagerImpl implements QueueManager {
|
||||
|
||||
ImmutableList<QueuePlayer> list = server.getQueue();
|
||||
QueuePlayer queuePlayer;
|
||||
AdaptedServer ideal = server.getIdealServer(player);
|
||||
if(main.isPremium()) {
|
||||
queuePlayer = main.getLogic().priorityLogic(server, player);
|
||||
queuePlayer = main.getLogic().priorityLogic(server, player, ideal);
|
||||
} else {
|
||||
int priority = player.hasPermission("ajqueue.priority") ||
|
||||
player.hasPermission("ajqueue.serverpriority."+server.getName()) ? 1 : 0;
|
||||
priority = Math.max(priority, Logic.getUnJoinablePriorities(server, player) > 0 ? 1 : 0);
|
||||
priority = Math.max(priority, Logic.getUnJoinablePriorities(server, ideal, player) > 0 ? 1 : 0);
|
||||
int maxOfflineTime = player.hasPermission("ajqueue.stayqueued") ? 60 : 0;
|
||||
queuePlayer = new QueuePlayerImpl(player, server, priority, maxOfflineTime);
|
||||
if(
|
||||
@@ -327,7 +325,7 @@ public class QueueManagerImpl implements QueueManager {
|
||||
groupServers.add(found.getServers().get(0));
|
||||
}
|
||||
|
||||
if(servers.size() == 0) {
|
||||
if(groupServers.size() == 0) {
|
||||
main.getLogger().warning("Server group '"+groupName+"' has no servers! Ignoring it.");
|
||||
continue;
|
||||
}
|
||||
@@ -349,7 +347,6 @@ public class QueueManagerImpl implements QueueManager {
|
||||
if(!main.getConfig().getBoolean("send-actionbar")) return;
|
||||
|
||||
for(QueueServer server : servers) {
|
||||
String status = server.getStatusString();
|
||||
for(QueuePlayer queuePlayer : server.getQueue()) {
|
||||
|
||||
int pos = queuePlayer.getPosition();
|
||||
@@ -361,6 +358,8 @@ public class QueueManagerImpl implements QueueManager {
|
||||
AdaptedPlayer player = queuePlayer.getPlayer();
|
||||
if(player == null) continue;
|
||||
|
||||
String status = server.getStatusString(player);
|
||||
|
||||
QueueServer singleServer = getSingleServer(player);
|
||||
if(singleServer == null || !singleServer.equals(server)) continue;
|
||||
|
||||
@@ -512,8 +511,8 @@ public class QueueManagerImpl implements QueueManager {
|
||||
+((ThreadPoolExecutor) pool).getActiveCount()+" threads");
|
||||
}
|
||||
try {
|
||||
for(QueueServer server : servers) {
|
||||
pool.submit(server::updatePing);
|
||||
for(AdaptedServer server : main.getPlatformMethods().getServers()) {
|
||||
pool.submit(() -> server.ping(main.getConfig().getBoolean("pinger-debug"), main.getLogger()));
|
||||
}
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
@@ -556,22 +555,25 @@ public class QueueManagerImpl implements QueueManager {
|
||||
server.removePlayer(queuePlayer);
|
||||
}
|
||||
}
|
||||
|
||||
if(!server.isOnline()) continue;
|
||||
if(server.getQueue().size() == 0) continue;
|
||||
|
||||
if(main.getConfig().getBoolean("send-all-when-back-online") && server.justWentOnline() && server.isOnline()) {
|
||||
if(!server.isGroup() && main.getConfig().getBoolean("send-all-when-back-online") && server.getServers().get(0).justWentOnline()) {
|
||||
for(QueuePlayer p : server.getQueue()) {
|
||||
|
||||
AdaptedPlayer player = p.getPlayer();
|
||||
if(player == null) continue;
|
||||
|
||||
if(server.isFull() && !server.canJoinFull(p.getPlayer())) continue;
|
||||
|
||||
AdaptedServer selected = server.getIdealServer(player);
|
||||
|
||||
if(selected == null) {
|
||||
main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'!");
|
||||
main.getLogger().severe("Could not find ideal server for server '"+server.getName()+"'!");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(selected.isFull() && !selected.canJoinFull(p.getPlayer())) continue;
|
||||
|
||||
player.sendMessage(msgs.getComponent("status.sending-now", "SERVER:"+server.getAlias()));
|
||||
player.connect(selected);
|
||||
}
|
||||
@@ -606,11 +608,17 @@ public class QueueManagerImpl implements QueueManager {
|
||||
|
||||
if(nextPlayer == null) continue; // None of the players in the queue are online
|
||||
|
||||
if(server.isWhitelisted() && !server.getWhitelistedPlayers().contains(nextPlayer.getUniqueId())) continue;
|
||||
AdaptedServer selected = server.getIdealServer(nextPlayer);
|
||||
if(selected == null) {
|
||||
main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(selected.isWhitelisted() && !selected.getWhitelistedPlayers().contains(nextPlayer.getUniqueId())) continue;
|
||||
|
||||
if(!server.canAccess(nextPlayer)) continue;
|
||||
|
||||
if(server.isFull() && !server.canJoinFull(nextPlayer)) continue;
|
||||
if(selected.isFull() && !selected.canJoinFull(nextPlayer)) continue;
|
||||
|
||||
if(main.getConfig().getBoolean("enable-bypasspaused-permission")) {
|
||||
if(server.isPaused() && !nextPlayer.hasPermission("ajqueue.bypasspaused")) continue;
|
||||
@@ -648,17 +656,11 @@ public class QueueManagerImpl implements QueueManager {
|
||||
sendingNowAntiSpam.put(nextPlayer, System.currentTimeMillis());
|
||||
}
|
||||
|
||||
AdaptedServer selected = server.getIdealServer(nextPlayer);
|
||||
if(selected == null) {
|
||||
main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'");
|
||||
continue;
|
||||
}
|
||||
|
||||
server.setLastSentTime(System.currentTimeMillis());
|
||||
nextPlayer.connect(selected);
|
||||
server.addPlayer(selected);
|
||||
if(main.getConfig().getBoolean("debug")) {
|
||||
Debug.info(selected.getName()+" player count is now set to "+ server.getLastPings().get(selected).getPlayerCount());
|
||||
}
|
||||
selected.addPlayer();
|
||||
Debug.info(selected.getName()+" player count is now set to "+ selected.getPlayerCount());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,20 @@ public class QueueServerImpl implements QueueServer {
|
||||
|
||||
private final String name;
|
||||
|
||||
private final QueueMain main;
|
||||
|
||||
private final List<AdaptedServer> servers;
|
||||
|
||||
private final List<QueuePlayer> queue = new ArrayList<>();
|
||||
|
||||
private List<Integer> supportedProtocols = new ArrayList<>();
|
||||
|
||||
private Balancer balancer;
|
||||
|
||||
private boolean paused;
|
||||
|
||||
private long lastSentTime = 0;
|
||||
|
||||
public QueueServerImpl(String name, QueueMain main, AdaptedServer server, List<QueuePlayer> previousPlayers) {
|
||||
this(name, main, Collections.singletonList(server), previousPlayers);
|
||||
}
|
||||
@@ -81,40 +95,6 @@ public class QueueServerImpl implements QueueServer {
|
||||
}
|
||||
}
|
||||
|
||||
private final QueueMain main;
|
||||
|
||||
private final HashMap<AdaptedServer, AdaptedServerPing> pings = new HashMap<>();
|
||||
|
||||
private final List<AdaptedServer> servers;
|
||||
|
||||
private final List<QueuePlayer> queue = new ArrayList<>();
|
||||
|
||||
private List<Integer> supportedProtocols = new ArrayList<>();
|
||||
|
||||
private Balancer balancer;
|
||||
|
||||
|
||||
private int playerCount;
|
||||
private int maxPlayers;
|
||||
|
||||
private boolean online;
|
||||
|
||||
private boolean paused;
|
||||
|
||||
|
||||
private long lastUpdate = 0;
|
||||
|
||||
private int offlineTime = 0;
|
||||
|
||||
private long lastSentTime = 0;
|
||||
|
||||
private long lastOffline;
|
||||
|
||||
|
||||
boolean whitelisted = false;
|
||||
List<UUID> whitelistedUUIDs = new ArrayList<>();
|
||||
|
||||
|
||||
@Override
|
||||
public ImmutableList<QueuePlayer> getQueue() {
|
||||
return ImmutableList.copyOf(queue);
|
||||
@@ -123,12 +103,13 @@ public class QueueServerImpl implements QueueServer {
|
||||
@Override
|
||||
public String getStatusString(AdaptedPlayer p) {
|
||||
Messages msgs = main.getMessages();
|
||||
AdaptedServer server = getIdealServer(p);
|
||||
|
||||
if(getOfflineTime() > main.getConfig().getInt("offline-time")) {
|
||||
if(server.getOfflineTime() > main.getConfig().getInt("offline-time")) {
|
||||
return msgs.getString("status.offline.offline");
|
||||
}
|
||||
|
||||
if(!isOnline()) {
|
||||
if(!server.isOnline()) {
|
||||
return msgs.getString("status.offline.restarting");
|
||||
}
|
||||
|
||||
@@ -136,11 +117,11 @@ public class QueueServerImpl implements QueueServer {
|
||||
return msgs.getString("status.offline.paused");
|
||||
}
|
||||
|
||||
if(p != null && isWhitelisted() && !getWhitelistedPlayers().contains(p.getUniqueId())) {
|
||||
if(p != null && server.isWhitelisted() && !server.getWhitelistedPlayers().contains(p.getUniqueId())) {
|
||||
return msgs.getString("status.offline.whitelisted");
|
||||
}
|
||||
|
||||
if(isFull() && !canJoinFull(p)) {
|
||||
if(server.isFull() && !server.canJoinFull(p)) {
|
||||
return msgs.getString("status.offline.full");
|
||||
}
|
||||
|
||||
@@ -159,11 +140,12 @@ public class QueueServerImpl implements QueueServer {
|
||||
|
||||
@Override
|
||||
public String getStatus(AdaptedPlayer p) {
|
||||
if(getOfflineTime() > main.getConfig().getInt("offline-time")) {
|
||||
AdaptedServer server = getIdealServer(p);
|
||||
if(server.getOfflineTime() > main.getConfig().getInt("offline-time")) {
|
||||
return "offline";
|
||||
}
|
||||
|
||||
if(!isOnline()) {
|
||||
if(!server.isOnline()) {
|
||||
return "restarting";
|
||||
}
|
||||
|
||||
@@ -171,11 +153,11 @@ public class QueueServerImpl implements QueueServer {
|
||||
return "paused";
|
||||
}
|
||||
|
||||
if(p != null && isWhitelisted() && !getWhitelistedPlayers().contains(p.getUniqueId())) {
|
||||
if(p != null && server.isWhitelisted() && !server.getWhitelistedPlayers().contains(p.getUniqueId())) {
|
||||
return "whitelisted";
|
||||
}
|
||||
|
||||
if(isFull() && !canJoinFull(p)) {
|
||||
if(server.isFull() && !server.canJoinFull(p)) {
|
||||
return "full";
|
||||
}
|
||||
|
||||
@@ -188,101 +170,7 @@ public class QueueServerImpl implements QueueServer {
|
||||
|
||||
@Override
|
||||
public String getStatus() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePing() {
|
||||
boolean pingerDebug = main.getConfig().getBoolean("pinger-debug");
|
||||
HashMap<AdaptedServer, CompletableFuture<AdaptedServerPing>> pingsFutures = new HashMap<>();
|
||||
for(AdaptedServer server : servers) {
|
||||
if(pingerDebug) {
|
||||
main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] sending ping");
|
||||
}
|
||||
pingsFutures.put(server, server.ping());
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for(AdaptedServer server : pingsFutures.keySet()) {
|
||||
CompletableFuture<AdaptedServerPing> futurePing = pingsFutures.get(server);
|
||||
AdaptedServerPing ping = null;
|
||||
try {
|
||||
ping = futurePing.get(5, TimeUnit.SECONDS);
|
||||
} catch (Exception e) {
|
||||
if(pingerDebug) {
|
||||
main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] offline:");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if(ping != null && pingerDebug) {
|
||||
main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] online. motd: "+ping.getPlainDescription()+" players: "+ping.getPlayerCount()+"/"+ping.getMaxPlayers());
|
||||
} else if(ping == null && pingerDebug) {
|
||||
main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] offline (unknown)");
|
||||
}
|
||||
|
||||
pings.put(server, ping);
|
||||
i++;
|
||||
if(i == servers.size()) {
|
||||
int onlineCount = 0;
|
||||
playerCount = 0;
|
||||
maxPlayers = 0;
|
||||
for(AdaptedServer pingedServer : pings.keySet()) {
|
||||
AdaptedServerPing serverPing = pings.get(pingedServer);
|
||||
if(serverPing == null || serverPing.getPlainDescription() == null) {
|
||||
if(serverPing != null) {
|
||||
pings.put(pingedServer, null);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if(serverPing.getPlainDescription().contains("ajQueue;whitelisted=")) {
|
||||
if(servers.size() > 1) continue;
|
||||
|
||||
setWhitelisted(true);
|
||||
List<UUID> uuids = new ArrayList<>();
|
||||
for(String uuid : serverPing.getPlainDescription().substring(20).split(",")) {
|
||||
if(uuid.isEmpty()) continue;
|
||||
UUID parsedUUID;
|
||||
try {
|
||||
parsedUUID = UUID.fromString(uuid);
|
||||
} catch(IllegalArgumentException e) {
|
||||
main.getLogger().warn("UUID '"+uuid+"' in whitelist of "+getName()+" is invalid! "+e.getMessage());
|
||||
continue;
|
||||
}
|
||||
uuids.add(parsedUUID);
|
||||
}
|
||||
setWhitelistedPlayers(uuids);
|
||||
} else {
|
||||
setWhitelisted(false);
|
||||
}
|
||||
onlineCount++;
|
||||
playerCount += serverPing.getPlayerCount();
|
||||
maxPlayers += serverPing.getMaxPlayers();
|
||||
}
|
||||
online = onlineCount > 0;
|
||||
|
||||
if(lastUpdate == -1) {
|
||||
lastUpdate = System.currentTimeMillis();
|
||||
offlineTime = 0;
|
||||
} else {
|
||||
int timesincelast = (int) Math.round((System.currentTimeMillis() - lastUpdate*1.0)/1000);
|
||||
lastUpdate = System.currentTimeMillis();
|
||||
if(!online) {
|
||||
offlineTime += timesincelast;
|
||||
} else {
|
||||
offlineTime = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(pingerDebug) {
|
||||
main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] Finished");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOfflineTime() {
|
||||
return offlineTime;
|
||||
return getStatus(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -294,39 +182,11 @@ public class QueueServerImpl implements QueueServer {
|
||||
this.lastSentTime = lastSentTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWhitelisted() {
|
||||
return whitelisted;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWhitelisted(boolean whitelisted) {
|
||||
this.whitelisted = whitelisted;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImmutableList<UUID> getWhitelistedPlayers() {
|
||||
return ImmutableList.copyOf(whitelistedUUIDs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void setWhitelistedPlayers(List<UUID> whitelistedPlayers) {
|
||||
whitelistedUUIDs = whitelistedPlayers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isJoinable(AdaptedPlayer p) {
|
||||
if(p != null) {
|
||||
if (isWhitelisted() && !whitelistedUUIDs.contains(p.getUniqueId())) {
|
||||
return false;
|
||||
}
|
||||
if (isFull() && !canJoinFull(p)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return isOnline() &&
|
||||
canAccess(p) &&
|
||||
!isPaused();
|
||||
AdaptedServer server = getIdealServer(p);
|
||||
if(server == null) return false;
|
||||
return server.isJoinable(p) && !isPaused();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -339,28 +199,6 @@ public class QueueServerImpl implements QueueServer {
|
||||
return paused;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOnline() {
|
||||
if(System.currentTimeMillis()-lastOffline <= (main.getConfig().getInt("wait-after-online")*1000) && online) {
|
||||
return false;
|
||||
}
|
||||
if(!online) {
|
||||
lastOffline = System.currentTimeMillis();
|
||||
}
|
||||
return online;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean justWentOnline() {
|
||||
return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && online;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFull() {
|
||||
if(!isOnline()) return false;
|
||||
return playerCount >= maxPlayers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void removePlayer(QueuePlayer player) {
|
||||
main.getQueueManager().getSendingAttempts().remove(player);
|
||||
@@ -460,15 +298,9 @@ public class QueueServerImpl implements QueueServer {
|
||||
|
||||
@Override
|
||||
public AdaptedServer getIdealServer(AdaptedPlayer player) {
|
||||
Debug.info(getBalancer().toString());
|
||||
return getBalancer().getIdealServer(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashMap<AdaptedServer, AdaptedServerPing> getLastPings() {
|
||||
return new HashMap<>(pings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Integer> getSupportedProtocols() {
|
||||
return new ArrayList<>(supportedProtocols);
|
||||
@@ -484,26 +316,4 @@ public class QueueServerImpl implements QueueServer {
|
||||
return balancer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canJoinFull(AdaptedPlayer player) {
|
||||
if(player == null) return true;
|
||||
return
|
||||
player.hasPermission("ajqueue.joinfull") ||
|
||||
player.hasPermission("ajqueue.joinfullserver."+name) ||
|
||||
player.hasPermission("ajqueue.joinfullandbypassserver."+name) ||
|
||||
player.hasPermission("ajqueue.joinfullandbypass") ||
|
||||
(main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, name))
|
||||
;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPlayer(AdaptedServer server) {
|
||||
if(!pings.containsKey(server)) throw new IllegalArgumentException("Server is not in this group!");
|
||||
pings.get(server).addPlayer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOnline(boolean online) {
|
||||
this.online = online;
|
||||
}
|
||||
}
|
||||
|
||||
+13
-12
@@ -6,9 +6,11 @@ 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.utils.Debug;
|
||||
import us.ajg0702.utils.common.GenUtils;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class DefaultBalancer implements Balancer {
|
||||
|
||||
@@ -21,29 +23,28 @@ public class DefaultBalancer implements Balancer {
|
||||
|
||||
@Override
|
||||
public AdaptedServer getIdealServer(AdaptedPlayer player) {
|
||||
HashMap<AdaptedServer, AdaptedServerPing> serverInfos = server.getLastPings();
|
||||
List<AdaptedServer> servers = server.getServers();
|
||||
AdaptedServer selected = null;
|
||||
int selectednum = 0;
|
||||
if(serverInfos.keySet().size() == 1) {
|
||||
selected = serverInfos.keySet().iterator().next();
|
||||
if(servers.size() == 1) {
|
||||
selected = servers.get(0);
|
||||
} else {
|
||||
for(AdaptedServer si : serverInfos.keySet()) {
|
||||
AdaptedServerPing sp = serverInfos.get(si);
|
||||
if(sp == null) continue;
|
||||
int online = sp.getPlayerCount();
|
||||
for(AdaptedServer sv : servers) {
|
||||
if(!sv.isOnline()) continue;
|
||||
int online = sv.getPlayerCount();
|
||||
if(selected == null) {
|
||||
selected = si;
|
||||
selected = sv;
|
||||
selectednum = online;
|
||||
continue;
|
||||
}
|
||||
if(selectednum > online && main.getQueueManager().findServer(si.getName()).isJoinable(player)) {
|
||||
selected = si;
|
||||
if(selectednum > online && main.getQueueManager().findServer(sv.getName()).isJoinable(player)) {
|
||||
selected = sv;
|
||||
selectednum = online;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(selected == null && serverInfos.size() > 0) {
|
||||
selected = serverInfos.keySet().iterator().next();
|
||||
if(selected == null && servers.size() > 0) {
|
||||
selected = servers.get(0);
|
||||
}
|
||||
if(selected == null) {
|
||||
main.getLogger().warning("Unable to find ideal server, using random server from group.");
|
||||
|
||||
+10
-21
@@ -20,34 +20,23 @@ public class MinigameBalancer implements Balancer {
|
||||
|
||||
@Override
|
||||
public AdaptedServer getIdealServer(AdaptedPlayer player) {
|
||||
HashMap<AdaptedServer, AdaptedServerPing> serverInfos = server.getLastPings();
|
||||
if(serverInfos.keySet().size() == 1) {
|
||||
return serverInfos.keySet().iterator().next();
|
||||
List<AdaptedServer> servers = server.getServers();
|
||||
if(servers.size() == 1) {
|
||||
return servers.get(0);
|
||||
} else {
|
||||
|
||||
List<Map.Entry<AdaptedServer, AdaptedServerPing>> servers = new ArrayList<>(serverInfos.entrySet());
|
||||
servers.sort(Comparator.comparingInt(o -> {
|
||||
@SuppressWarnings("unchecked")
|
||||
Map.Entry<AdaptedServer, AdaptedServerPing> e = (Map.Entry<AdaptedServer, AdaptedServerPing>) o;
|
||||
AdaptedServerPing value = e.getValue();
|
||||
if(value == null) return -1;
|
||||
return value.getPlayerCount();
|
||||
}).reversed());
|
||||
LinkedHashMap<AdaptedServer, AdaptedServerPing> sortedServers = new LinkedHashMap<>();
|
||||
for(Map.Entry<AdaptedServer, AdaptedServerPing> entry : servers) {
|
||||
sortedServers.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
List<AdaptedServer> svs = new ArrayList<>(servers);
|
||||
svs.sort(Comparator.comparingInt(o -> ((AdaptedServer)o).getPlayerCount()).reversed());
|
||||
|
||||
for(AdaptedServer si : sortedServers.keySet()) {
|
||||
AdaptedServerPing sp = sortedServers.get(si);
|
||||
if(sp == null) continue;
|
||||
int online = sp.getPlayerCount();
|
||||
int max = sp.getMaxPlayers();
|
||||
for(AdaptedServer si : svs) {
|
||||
if(!si.isOnline()) continue;
|
||||
int online = si.getPlayerCount();
|
||||
int max = si.getMaxPlayers();
|
||||
if(online < max) {
|
||||
return si;
|
||||
}
|
||||
}
|
||||
return new ArrayList<AdaptedServer>(sortedServers.keySet().size()).get(sortedServers.keySet().size()-1);
|
||||
return svs.get(svs.size()-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import us.ajg0702.queue.api.players.AdaptedPlayer;
|
||||
import us.ajg0702.queue.api.players.QueuePlayer;
|
||||
import us.ajg0702.queue.api.premium.PermissionGetter;
|
||||
import us.ajg0702.queue.api.queues.QueueServer;
|
||||
import us.ajg0702.queue.api.server.AdaptedServer;
|
||||
|
||||
public class FreeLogic implements Logic {
|
||||
@Override
|
||||
@@ -13,7 +14,7 @@ public class FreeLogic implements Logic {
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) {
|
||||
public QueuePlayer priorityLogic(QueueServer queueServer, AdaptedPlayer player, AdaptedServer server) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user