Common should be done

This commit is contained in:
ajgeiss0702
2021-07-08 10:29:06 -07:00
parent ff9a2965c1
commit 18d0c72b89
4 changed files with 211 additions and 38 deletions
@@ -4,7 +4,9 @@ import com.google.common.collect.ImmutableList;
import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServer;
import us.ajg0702.queue.api.server.AdaptedServerPing;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@@ -48,7 +50,7 @@ public interface QueueServer {
* Gets how long since the last person was sent * Gets how long since the last person was sent
* @return The number of miliseconds since the last person was sent * @return The number of miliseconds since the last person was sent
*/ */
int getLastSentTime(); long getLastSentTime();
@@ -190,8 +192,19 @@ public interface QueueServer {
QueuePlayer findPlayer(AdaptedPlayer player); QueuePlayer findPlayer(AdaptedPlayer player);
/**
* Gets the most ideal server in this group to join
* @param player The player that would be joining
* @return The ideal server to join
*/
AdaptedServer getIdealServer(AdaptedPlayer player); AdaptedServer getIdealServer(AdaptedPlayer player);
/**
* Gets the last server pings
* @return The last server pings for this server/group
*/
HashMap<AdaptedServer, AdaptedServerPing> getLastPings();
/** /**
* elliot is bad * elliot is bad
@@ -12,6 +12,12 @@ public interface AdaptedServer {
*/ */
AdaptedServerInfo getServerInfo(); AdaptedServerInfo getServerInfo();
/**
* Gets the server's name
* @return the server's name
*/
String getName();
/** /**
* Pings the server and gets info back * Pings the server and gets info back
* @return A CompletableFuture with the ServerPing * @return A CompletableFuture with the ServerPing
@@ -1,9 +1,6 @@
package us.ajg0702.queue.common; package us.ajg0702.queue.common;
import us.ajg0702.queue.api.AliasManager; import us.ajg0702.queue.api.*;
import us.ajg0702.queue.api.Logic;
import us.ajg0702.queue.api.PlatformMethods;
import us.ajg0702.queue.api.ServerBuilder;
import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Config;
import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.Messages;
@@ -55,4 +52,9 @@ public class QueueMain {
public ServerBuilder getServerBuilder() { public ServerBuilder getServerBuilder() {
return serverBuilder; return serverBuilder;
} }
private QueueManager queueManager;
public QueueManager getQueueManager() {
return queueManager;
}
} }
@@ -5,28 +5,62 @@ import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.queues.QueueServer;
import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServer;
import us.ajg0702.queue.api.server.AdaptedServerInfo;
import us.ajg0702.queue.api.server.AdaptedServerPing;
import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.common.QueueMain;
import us.ajg0702.utils.common.GenUtils;
import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.Messages;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class QueueServerImpl implements QueueServer { public class QueueServerImpl implements QueueServer {
public QueueServerImpl(QueueMain main, AdaptedServer server) { private final String name;
this(main, Collections.singletonList(server));
public QueueServerImpl(String name, QueueMain main, AdaptedServer server) {
this(name, main, Collections.singletonList(server));
} }
public QueueServerImpl(QueueMain main, List<AdaptedServer> servers) { public QueueServerImpl(String name, QueueMain main, List<AdaptedServer> servers) {
this.name = name;
this.servers = servers; this.servers = servers;
this.main = main; this.main = main;
} }
QueueMain main; private final QueueMain main;
private List<AdaptedServer> servers; private HashMap<AdaptedServer, AdaptedServerPing> pings = new HashMap<>();
private final List<AdaptedServer> servers;
private final List<QueuePlayer> queue = new ArrayList<>(); private final List<QueuePlayer> queue = new ArrayList<>();
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 @Override
public ImmutableList<QueuePlayer> getQueue() { public ImmutableList<QueuePlayer> getQueue() {
return ImmutableList.copyOf(queue); return ImmutableList.copyOf(queue);
@@ -67,131 +101,249 @@ public class QueueServerImpl implements QueueServer {
@Override @Override
public void updatePing() { public void updatePing() {
HashMap<AdaptedServer, CompletableFuture<AdaptedServerPing>> pingsFutures = new HashMap<>();
for(AdaptedServer server : servers) {
if(main.getConfig().getBoolean("pinger-debug")) {
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 (InterruptedException | ExecutionException | TimeoutException e) {
if(main.getConfig().getBoolean("pinger-debug")) {
main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] sending ping");
}
}
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) {
continue;
}
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;
}
}
}
}
} }
@Override @Override
public int getOfflineTime() { public int getOfflineTime() {
return 0; return offlineTime;
} }
@Override @Override
public int getLastSentTime() { public long getLastSentTime() {
return 0; return lastSentTime;
} }
@Override @Override
public boolean isWhitelisted() { public boolean isWhitelisted() {
return false; return whitelisted;
} }
@Override @Override
public void setWhitelisted(boolean whitelisted) { public void setWhitelisted(boolean whitelisted) {
this.whitelisted = whitelisted;
} }
@Override @Override
public ImmutableList<UUID> getWhitelistedPlayers() { public ImmutableList<UUID> getWhitelistedPlayers() {
return null; return ImmutableList.copyOf(whitelistedUUIDs);
} }
@Override @Override
public void setWhitelistedPlayers(List<UUID> whitelistedPlayers) { public synchronized void setWhitelistedPlayers(List<UUID> whitelistedPlayers) {
whitelistedUUIDs = whitelistedPlayers;
} }
@Override @Override
public boolean isJoinable(AdaptedPlayer p) { public boolean isJoinable(AdaptedPlayer p) {
return false; return (!whitelisted || whitelistedUUIDs.contains(p.getUniqueId())) &&
this.isOnline() &&
this.canAccess(p) &&
!this.isFull() &&
!this.isPaused();
} }
@Override @Override
public void setPaused(boolean paused) { public synchronized void setPaused(boolean paused) {
this.paused = paused;
} }
@Override @Override
public boolean isPaused() { public boolean isPaused() {
return false; return paused;
} }
@Override @Override
public boolean isOnline() { public boolean isOnline() {
if(System.currentTimeMillis()-lastOffline <= (main.getConfig().getInt("wait-after-online")*1000) && online) {
return false; return false;
} }
if(!online) {
lastOffline = System.currentTimeMillis();
}
return online;
}
@Override @Override
public boolean justWentOnline() { public boolean justWentOnline() {
return false; return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && online;
} }
@Override @Override
public boolean isFull() { public boolean isFull() {
return false; return playerCount >= maxPlayers;
} }
@Override @Override
public void removePlayer(QueuePlayer player) { public synchronized void removePlayer(QueuePlayer player) {
queue.remove(player);
} }
@Override @Override
public void removePlayer(AdaptedPlayer player) { public void removePlayer(AdaptedPlayer player) {
QueuePlayer queuePlayer = findPlayer(player);
if(queuePlayer == null) return;
removePlayer(queuePlayer);
} }
@Override @Override
public void addPlayer(QueuePlayer player) { public synchronized void addPlayer(QueuePlayer player) {
addPlayer(player, -1);
} }
@Override @Override
public void addPlayer(QueuePlayer player, int position) { public void addPlayer(QueuePlayer player, int position) {
if(!player.getQueueServer().equals(this) || queue.contains(player)) return;
if(position > 0) {
queue.add(position, player);
} else {
queue.add(player);
}
} }
@Override @Override
public void sendPlayer() { public void sendPlayer() {
main.getQueueManager().sendPlayers(this);
} }
@Override @Override
public String getName() { public String getName() {
return null; return name;
} }
@Override @Override
public boolean canAccess(AdaptedPlayer ply) { public boolean canAccess(AdaptedPlayer ply) {
if(ply == null) return true;
for(AdaptedServer si : servers) {
if(si.canAccess(ply)) {
return true;
}
}
return false; return false;
} }
@Override @Override
public String getAlias() { public String getAlias() {
return null; return main.getAliasManager().getAlias(getName());
} }
@Override @Override
public ImmutableList<AdaptedServer> getServers() { public ImmutableList<AdaptedServer> getServers() {
return null; return ImmutableList.copyOf(servers);
} }
@Override @Override
public ImmutableList<String> getServerNames() { public ImmutableList<String> getServerNames() {
return null; List<String> names = new ArrayList<>();
for(AdaptedServer server : servers) {
names.add(server.getName());
}
return ImmutableList.copyOf(names);
} }
@Override @Override
public boolean isGroup() { public boolean isGroup() {
return false; return servers.size() > 1;
} }
@Override @Override
public QueuePlayer findPlayer(AdaptedPlayer player) { public QueuePlayer findPlayer(AdaptedPlayer player) {
for(QueuePlayer queuePlayer : queue) {
AdaptedPlayer queuedPlayer = queuePlayer.getPlayer();
if(queuedPlayer == null) continue;
if(queuedPlayer.getUniqueId().equals(player.getUniqueId())) {
return queuePlayer;
}
}
return null; return null;
} }
@Override @Override
public AdaptedServer getIdealServer(AdaptedPlayer player) { public AdaptedServer getIdealServer(AdaptedPlayer player) {
return null; HashMap<AdaptedServer, AdaptedServerPing> 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;
}
@Override
public HashMap<AdaptedServer, AdaptedServerPing> getLastPings() {
return new HashMap<>(pings);
} }
} }