Common should be done
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user