package us.ajg0702.queue; import java.util.ArrayList; import java.util.List; import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import us.ajg0702.utils.bungee.BungeeConfig; public class Server { String name; ServerInfo info; public Server(String name, ServerInfo info) { this.name = name; this.info = info; update(); } public String getName() { return name; } public ServerInfo getInfo() { return info; } int offlineTime = 0; boolean online = false; int playercount = 0; int maxplayers = 0; long lastUpdate = -1; public void update() { info.ping(new Callback() { @Override public void done(ServerPing result, Throwable error) { online = error == null; if(Manager.getInstance().pl.config.getBoolean("pinger-debug")) { if(error != null) { ProxyServer.getInstance().getLogger().info("[ajQueue] [pinger] ["+name+"] Status: "+online+". Error: "); error.printStackTrace(); } else { ProxyServer.getInstance().getLogger().info("[ajQueue] [pinger] ["+name+"] Status: "+online+". motd: " +result.getDescriptionComponent()+" players:"+result.getPlayers()); } } if(lastUpdate == -1) { lastUpdate = System.currentTimeMillis(); offlineTime = 0; } else { int timesincelast = Math.round((System.currentTimeMillis() - lastUpdate)/1000); lastUpdate = System.currentTimeMillis(); if(!online) { offlineTime += timesincelast; } else { offlineTime = 0; } } if(!online) { playercount = 0; maxplayers = 0; return; } playercount = result.getPlayers().getOnline(); maxplayers = result.getPlayers().getMax(); } }); } public int getOfflineTime() { return offlineTime; } long lastOffline = 0; public boolean isOnline() { BungeeConfig config = Manager.getInstance().pl.config; if(System.currentTimeMillis()-lastOffline <= (config.getInt("wait-after-online")*1000) && online) { return false; } if(!online) { lastOffline = System.currentTimeMillis(); } return online; } public boolean justWentOnline() { BungeeConfig config = Manager.getInstance().pl.config; return System.currentTimeMillis()-lastOffline <= (config.getDouble("wait-time")) && online; } public boolean isFull() { return playercount >= maxplayers; } List queue = new ArrayList<>(); public List getQueue() { return queue; } /** * If the player can access the server. (Bungeecord's restricted servers) * @param ply The player * @return if the player can join based on bungeecord's restricted servers system */ public boolean canAccess(ProxiedPlayer ply) { return info.canAccess(ply); } boolean whitelisted = false; List whitelistedplayers = new ArrayList<>(); public void setWhitelisted(boolean b) { whitelisted = b; } public void setWhitelistedPlayers(List plys) { whitelistedplayers = plys; } public boolean getWhitelisted() { return whitelisted; } public boolean isWhitelisted() { return whitelisted; } public List getWhitelistedPlayers() { return whitelistedplayers; } /** * If the server is joinable as a player * @param p The player * @return If the player can join the server */ public boolean isJoinable(ProxiedPlayer p) { return (!whitelisted || whitelistedplayers.contains(p.getName())) && this.isOnline() && this.canAccess(p) && !this.isFull() && !this.isPaused(); } public String getJoinableDebug(ProxiedPlayer p) { return "whitelist: "+(!whitelisted || whitelistedplayers.contains(p.getName())) + "\n" + "online: "+this.isOnline() +"\n"+ "canaccess: "+this.canAccess(p) +"\n"+ "full: "+ !this.isFull() +"\n"+ "paused: "+!this.isPaused(); } boolean paused = false; public boolean isPaused() { return paused; } public void setPaused(boolean to) { paused = to; } }