Move server ping cache storage to the AdaptedServer instance

This commit is contained in:
ajgeiss0702
2022-08-15 13:41:32 -07:00
parent 6a99349718
commit 478f2cf78d
23 changed files with 549 additions and 409 deletions
@@ -2,6 +2,7 @@ package us.ajg0702.queue.platforms.bungeecord;
import us.ajg0702.queue.api.util.QueueLogger;
import java.util.logging.Level;
import java.util.logging.Logger;
public class BungeeLogger implements QueueLogger {
@@ -36,4 +37,29 @@ public class BungeeLogger implements QueueLogger {
public void severe(String message) {
logger.severe(message);
}
@Override
public void warn(String message, Throwable t) {
logger.log(Level.WARNING, message, t);
}
@Override
public void warning(String message, Throwable t) {
logger.log(Level.WARNING, message, t);
}
@Override
public void info(String message, Throwable t) {
logger.log(Level.INFO, message, t);
}
@Override
public void error(String message, Throwable t) {
logger.log(Level.SEVERE, message, t);
}
@Override
public void severe(String message, Throwable t) {
logger.log(Level.SEVERE, message, t);
}
}
@@ -113,18 +113,44 @@ public class BungeeMethods implements PlatformMethods {
@Override
public AdaptedServer getServer(String name) {
ServerInfo server = proxyServer.getServerInfo(name);
if(server == null) return null;
return new BungeeServer(server);
List<? extends AdaptedServer> servers = getServers();
for (AdaptedServer server : servers) {
if(server.getName().equals(name)) return server;
}
return null;
}
List<BungeeServer> serverList = new ArrayList<>();
@Override
public List<AdaptedServer> getServers() {
List<AdaptedServer> result = new ArrayList<>();
public List<? extends AdaptedServer> getServers() {
for (ServerInfo serverInfo : proxyServer.getServers().values()) {
boolean found = false;
for(BungeeServer sv : new ArrayList<>(serverList)) {
if(sv.getHandle().equals(serverInfo)) {
found = true;
break;
}
}
if(found) continue;
proxyServer.getServers().forEach((s, serverInfo) -> result.add(new BungeeServer(serverInfo)));
serverList.add(new BungeeServer(serverInfo, plugin.getMain()));
}
return result;
for(BungeeServer sv : new ArrayList<>(serverList)) {
boolean found = false;
for (ServerInfo serverInfo : proxyServer.getServers().values()) {
if(sv.getHandle().equals(serverInfo)) {
found = true;
break;
}
}
if(found) continue;
serverList.remove(sv);
}
return serverList;
}
@Override
@@ -145,7 +145,7 @@ public class BungeeQueue extends Plugin implements Listener, Implementation {
Component reason = BungeeComponentSerializer.get().deserialize(e.getKickReasonComponent());
main.getEventHandler().onServerKick(
new BungeePlayer(e.getPlayer()),
new BungeeServer(e.getKickedFrom()),
new BungeeServer(e.getKickedFrom(), main),
reason,
false
);
@@ -167,4 +167,8 @@ public class BungeeQueue extends Plugin implements Listener, Implementation {
getProxy().getPluginManager()
.registerCommand(this, bungeeCommand);
}
public QueueMain getMain() {
return main;
}
}
@@ -6,20 +6,33 @@ import us.ajg0702.queue.api.players.AdaptedPlayer;
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.api.util.QueueLogger;
import us.ajg0702.queue.common.QueueMain;
import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
public class BungeeServer implements AdaptedServer {
final ServerInfo handle;
final BungeeServerInfo serverInfo;
private final ServerInfo handle;
private final BungeeServerInfo serverInfo;
public BungeeServer(ServerInfo handle) {
private AdaptedServerPing lastPing = null;
private AdaptedServerPing lastSuccessfullPing = null;
private long lastOffline;
private int offlineTime = 0;
private final QueueMain main;
public BungeeServer(ServerInfo handle, QueueMain main) {
this.handle = handle;
serverInfo = new BungeeServerInfo(handle);
this.main = main;
}
@Override
@@ -33,19 +46,48 @@ public class BungeeServer implements AdaptedServer {
}
@Override
public CompletableFuture<AdaptedServerPing> ping() {
public CompletableFuture<AdaptedServerPing> ping(boolean debug, QueueLogger logger) {
CompletableFuture<AdaptedServerPing> future = new CompletableFuture<>();
long sent = System.currentTimeMillis();
if(debug) logger.info("[pinger] [" + getName() + "] sending ping");
handle.ping((pp, error) -> {
if(error != null) {
long lastOnline = lastSuccessfullPing == null ? 0 : lastSuccessfullPing.getFetchedTime();
offlineTime = (int) Math.min(sent - lastOnline, Integer.MAX_VALUE);
lastOffline = sent;
future.completeExceptionally(error);
lastPing = null;
if(debug) logger.info("[pinger] [" + getName() + "] offline:", error);
return;
}
future.complete(new BungeeServerPing(pp));
offlineTime = 0;
BungeeServerPing ping = new BungeeServerPing(pp, sent);
lastSuccessfullPing = ping;
if(debug) logger.info(
"[pinger] [" + getName() + "] online. motd: "+ping.getPlainDescription()+" " +
" players: "+ping.getPlayerCount()+"/"+ping.getMaxPlayers()
);
future.complete(ping);
lastPing = ping;
});
return future;
}
@Override
public Optional<AdaptedServerPing> getLastPing() {
return Optional.ofNullable(lastPing);
}
@Override
public boolean canAccess(AdaptedPlayer player) {
return handle.canAccess((ProxiedPlayer) player.getHandle());
@@ -58,8 +100,43 @@ public class BungeeServer implements AdaptedServer {
return players;
}
@Override
public int getOfflineTime() {
return offlineTime;
}
@Override
public boolean canJoinFull(AdaptedPlayer player) {
if(player == null) return true;
return
player.hasPermission("ajqueue.joinfull") ||
player.hasPermission("ajqueue.joinfullserver."+getName()) ||
player.hasPermission("ajqueue.joinfullandbypassserver."+getName()) ||
player.hasPermission("ajqueue.joinfullandbypass") ||
(main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName()))
;
}
@Override
public boolean justWentOnline() {
return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && isOnline();
}
@Override
public ServerInfo getHandle() {
return handle;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof BungeeServer)) return false;
BungeeServer that = (BungeeServer) o;
return getHandle().equals(that.getHandle());
}
@Override
public int hashCode() {
return Objects.hash(getHandle());
}
}
@@ -9,9 +9,11 @@ import us.ajg0702.queue.api.server.AdaptedServerPing;
public class BungeeServerPing implements AdaptedServerPing {
final ServerPing handle;
private final long sent;
public BungeeServerPing(ServerPing handle) {
public BungeeServerPing(ServerPing handle, long sent) {
this.handle = handle;
this.sent = sent;
}
@Override
@@ -45,6 +47,11 @@ public class BungeeServerPing implements AdaptedServerPing {
add++;
}
@Override
public long getFetchedTime() {
return sent;
}
@Override
public ServerPing getHandle() {
return handle;