diff --git a/.classpath b/.classpath index 002ad57..c198500 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,6 @@ - + @@ -13,15 +13,15 @@ + - - + diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index f00b2a7..f3c7d7e 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -4,7 +4,7 @@ us.ajg0702 ajQueue ajQueue - 1.2.0 + 1.3.0 diff --git a/oldMain.java b/oldMain.java new file mode 100644 index 0000000..da07dcf --- /dev/null +++ b/oldMain.java @@ -0,0 +1,336 @@ +package us.ajg0702.queue; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.TimeUnit; + +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.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.event.ServerSwitchEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.event.EventHandler; +import us.ajg0702.queue.commands.LeaveCommand; +import us.ajg0702.queue.commands.ManageCommand; +import us.ajg0702.queue.commands.MoveCommand; +import us.ajg0702.queue.utils.BungeeConfig; +import us.ajg0702.queue.utils.BungeeMessages; +import us.ajg0702.queue.utils.BungeeStats; +import us.ajg0702.queue.utils.BungeeUtils; + +public class oldMain extends Plugin implements Listener { + + static oldMain plugin = null; + + public int timeBetweenPlayers = 5; + + BungeeStats metrics; + + BungeeMessages msgs; + + BungeeConfig config; + + boolean isp; + + @Override + public void onEnable() { + plugin = this; + + msgs = BungeeMessages.getInstance(this); + + config = new BungeeConfig(this); + checkConfig(); + + this.getProxy().getPluginManager().registerCommand(this, new MoveCommand(this)); + this.getProxy().getPluginManager().registerCommand(this, new ManageCommand(this)); + this.getProxy().getPluginManager().registerCommand(this, new LeaveCommand(this)); + + this.getProxy().getPluginManager().registerListener(this, this); + + getProxy().registerChannel("ajqueue:tospigot"); + + timeBetweenPlayers = config.getInt("wait-time"); + + updateOnlineServers(); + + try { + Class.forName("us.ajg0702.queue.Logic"); + isp = true; + } catch(ClassNotFoundException e) { + isp = false; + } + + + metrics = new BungeeStats(this, 7404); + + + } + + public boolean isp() { + return isp; + } + + public static oldMain getInstance() { + return plugin; + } + + public void checkConfig() { + List svs = getConfig().getStringList("queue-servers"); + for(String s : svs) { + if(!s.contains(":")) { + getLogger().warning("The queue-servers section in the config has been set up incorrectly! Please read the comment above the setting and make sure you have a queue server and a destination server separated by a colon (:)"); + break; + } + } + } + + public BungeeConfig getConfig() { + return config; + } + + public static BaseComponent[] formatMessage(String text) { + return TextComponent.fromLegacyText(net.md_5.bungee.api.ChatColor.translateAlternateColorCodes('&', text)); + } + + + HashMap offlineTime = new HashMap<>(); + boolean notif = false; + public void sendPlayers(String sv) { + for(String server : queues.keySet()) { + if(sv != null && !server.equalsIgnoreCase(sv)) continue; + List plys = queues.get(server); + if(plys.size() <= 0) continue; + while(!plys.get(0).isConnected()) { + plys.remove(0); + if(plys.size() <= 0) break; + } + if(plys.size() <= 0) continue; + ProxiedPlayer p = plys.get(0); + if(!servers.get(server)) { + int ot; + if(!offlineTime.containsKey(server)) { + ot = timeBetweenPlayers; + } else { + ot = offlineTime.get(server)+timeBetweenPlayers; + } + offlineTime.put(server, ot); + for(ProxiedPlayer ply : plys) { + int pos = plys.indexOf(ply)+1; + if(pos == 0) { + plys.remove(ply); + continue; + } + int len = plys.size(); + String or = msgs.get("status.offline.restarting"); + if(ot > config.getInt("offline-time")) { + or = msgs.get("status.offline.offline"); + } else { + //ply.sendMessage(formatMessage(ot + " <= "+offlineSecs)); + } + if(notif) { + ply.sendMessage(formatMessage( + msgs.get("status.offline.base") + .replaceAll("\\{STATUS\\}", or) + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + )); + } + if(getConfig().getBoolean("send-actionbar")) { + BungeeUtils.sendCustomData(ply, "actionbar", msgs.get("spigot.actionbar.offline") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{STATUS\\}", or)+";time="+timeBetweenPlayers); + } + } + if(!notif) { + notif = true; + } else { + notif = false; + } + continue; + } else { + offlineTime.put(server, 0); + ServerInfo target = ProxyServer.getInstance().getServerInfo(server); + p.connect(target); + //plys.remove(p); + } + + for(ProxiedPlayer ply : plys) { + int pos = plys.indexOf(ply)+1; + int len = plys.size(); + int time = pos*timeBetweenPlayers; + int min = (int) Math.floor((time) / (60)); + int sec = (int) Math.floor((time % (60))); + String timeStr; + if(min <= 0) { + timeStr = msgs.get("format.time.secs") + .replaceAll("\\{m\\}", "0") + .replaceAll("\\{s\\}", sec+""); + } else { + timeStr = msgs.get("format.time.mins") + .replaceAll("\\{m\\}", min+"") + .replaceAll("\\{s\\}", sec+""); + } + if(notif) { + ply.sendMessage(formatMessage( + msgs.get("status.online.base") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{TIME\\}", timeStr) + )); + } + if(getConfig().getBoolean("send-actionbar")) { + BungeeUtils.sendCustomData(ply, "actionbar", msgs.get("spigot.actionbar.online") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{TIME\\}", timeStr)+";time="+timeBetweenPlayers); + } + } + if(!notif) { + notif = true; + } else { + notif = false; + } + } + + } + public void sendPlayers() { + sendPlayers(null); + } + + + @EventHandler + public void moveServer(ServerSwitchEvent e) { + ProxiedPlayer p = e.getPlayer(); + String queue = getPlayerInQueue(p); + if(queue != null) { + queues.get(queue).remove(p); + } + + String servername = e.getPlayer().getServer().getInfo().getName(); + List svs = config.getStringList("queue-servers"); + for(String s : svs) { + if(!s.contains(":")) continue; + String[] parts = s.split("\\:"); + String from = parts[0]; + String to = parts[1]; + if(from.equalsIgnoreCase(servername)) { + addToQueue(p, to); + } + } + } + + @EventHandler + public void onLeave(PlayerDisconnectEvent e) { + ProxiedPlayer p = e.getPlayer(); + String queue = getPlayerInQueue(p); + if(queue != null) { + queues.get(queue).remove(p); + } + } + + + HashMap servers = new HashMap<>(); + public void updateOnlineServers() { + for(final String server : getProxy().getServers().keySet()) { + if(!servers.containsKey(server)) { + servers.put(server, false); + } + getProxy().getServers().get(server).ping(new Callback() { + + @Override + public void done(ServerPing result, Throwable error) { + servers.put(server, error == null); + } + }); + } + } + + + public HashMap> queues = new HashMap<>(); + public void addToQueue(ProxiedPlayer p, String server) { + //getLogger().info("adding "+p.getDisplayName()+" to queue "+server); + if(!servers.containsKey(server)) { + p.sendMessage(msgs.getBC("errors.server-not-exist")); + return; + } + if(!queues.containsKey(server)) { + queues.put(server, new ArrayList()); + } + if(p.getServer().getInfo().getName().equals(server)) { + p.sendMessage(msgs.getBC("errors.already-connected")); + return; + } + String currentQueued = getPlayerInQueue(p); + List list = queues.get(server); + if(list.indexOf(p) != -1) { + int pos = list.indexOf(p)+1; + int len = list.size(); + p.sendMessage(formatMessage( + msgs.get("errors.already-queued") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + )); + return; + } + if(currentQueued != null) { + queues.get(currentQueued).remove(p); + p.sendMessage(msgs.getBC("status.left-last-queue")); + } + if(isp) { + us.ajg0702.queue.Logic.priorityLogic(list, server, p); + } else { + if((p.hasPermission("ajqueue.priority") || p.hasPermission("ajqueue.serverpriority."+server)) && list.size() > 0) { + int i = 0; + for(ProxiedPlayer ply : list) { + if(!(ply.hasPermission("ajqueue.priority") || ply.hasPermission("ajqueue.serverpriority."+server))) { + list.add(i, p); + break; + } + i++; + } + if(list.size() == 0) { + list.add(p); + } + } else { + list.add(p); + } + } + int pos = list.indexOf(p)+1; + int len = list.size(); + p.sendMessage(formatMessage( + msgs.get("status.now-in-queue") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + )); + + if(list.size() <= 1) { + sendPlayers(server); + } + } + + + public void sendPlayer(ProxiedPlayer p) { + String server = getPlayerInQueue(p); + if(server == null) return; + sendPlayers(server); + } + + + public String getPlayerInQueue(ProxiedPlayer p) { + for(String server : queues.keySet()) { + if(queues.get(server).indexOf(p) != -1) { + return server; + } + } + return null; + } + +} diff --git a/pom.xml b/pom.xml index 51f2d7f..01b8ec0 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 us.ajg0702 ajQueue - 1.2.0 + 1.3.0 ajQueue diff --git a/src/main/java/us/ajg0702/queue/Main.java b/src/main/java/us/ajg0702/queue/Main.java index c71807d..f5723ac 100644 --- a/src/main/java/us/ajg0702/queue/Main.java +++ b/src/main/java/us/ajg0702/queue/Main.java @@ -1,32 +1,26 @@ package us.ajg0702.queue; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.concurrent.TimeUnit; - -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.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.event.ServerSwitchEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; +import us.ajg0702.queue.commands.LeaveCommand; +import us.ajg0702.queue.commands.ManageCommand; +import us.ajg0702.queue.commands.MoveCommand; import us.ajg0702.queue.utils.BungeeConfig; import us.ajg0702.queue.utils.BungeeMessages; import us.ajg0702.queue.utils.BungeeStats; -import us.ajg0702.queue.utils.BungeeUtils; public class Main extends Plugin implements Listener { static Main plugin = null; - int timeBetweenPlayers = 5; + public int timeBetweenPlayers = 5; BungeeStats metrics; @@ -34,6 +28,8 @@ public class Main extends Plugin implements Listener { BungeeConfig config; + Manager man; + boolean isp; @Override @@ -55,8 +51,6 @@ public class Main extends Plugin implements Listener { timeBetweenPlayers = config.getInt("wait-time"); - updateOnlineServers(); - try { Class.forName("us.ajg0702.queue.Logic"); isp = true; @@ -64,12 +58,7 @@ public class Main extends Plugin implements Listener { isp = false; } - getProxy().getScheduler().schedule(this, new Runnable() { - public void run() { - updateOnlineServers(); - sendPlayers(); - } - }, 5, timeBetweenPlayers, TimeUnit.SECONDS); + man = Manager.getInstance(this); metrics = new BungeeStats(this, 7404); @@ -77,10 +66,12 @@ public class Main extends Plugin implements Listener { } - public static Main getInstance() { - return plugin; + public boolean isp() { + return isp; } + + public void checkConfig() { List svs = getConfig().getStringList("queue-servers"); for(String s : svs) { @@ -100,118 +91,12 @@ public class Main extends Plugin implements Listener { } - HashMap offlineTime = new HashMap<>(); - boolean notif = false; - public void sendPlayers(String sv) { - for(String server : queues.keySet()) { - if(sv != null && !server.equalsIgnoreCase(sv)) continue; - List plys = queues.get(server); - if(plys.size() <= 0) continue; - while(!plys.get(0).isConnected()) { - plys.remove(0); - if(plys.size() <= 0) break; - } - if(plys.size() <= 0) continue; - ProxiedPlayer p = plys.get(0); - if(!servers.get(server)) { - int ot; - if(!offlineTime.containsKey(server)) { - ot = timeBetweenPlayers; - } else { - ot = offlineTime.get(server)+timeBetweenPlayers; - } - offlineTime.put(server, ot); - for(ProxiedPlayer ply : plys) { - int pos = plys.indexOf(ply)+1; - if(pos == 0) { - plys.remove(ply); - continue; - } - int len = plys.size(); - String or = msgs.get("status.offline.restarting"); - if(ot > config.getInt("offline-time")) { - or = msgs.get("status.offline.offline"); - } else { - //ply.sendMessage(formatMessage(ot + " <= "+offlineSecs)); - } - if(notif) { - ply.sendMessage(formatMessage( - msgs.get("status.offline.base") - .replaceAll("\\{STATUS\\}", or) - .replaceAll("\\{POS\\}", pos+"") - .replaceAll("\\{LEN\\}", len+"") - )); - } - if(getConfig().getBoolean("send-actionbar")) { - BungeeUtils.sendCustomData(ply, "actionbar", msgs.get("spigot.actionbar.offline") - .replaceAll("\\{POS\\}", pos+"") - .replaceAll("\\{LEN\\}", len+"") - .replaceAll("\\{STATUS\\}", or)+";time="+timeBetweenPlayers); - } - } - if(!notif) { - notif = true; - } else { - notif = false; - } - continue; - } else { - offlineTime.put(server, 0); - ServerInfo target = ProxyServer.getInstance().getServerInfo(server); - p.connect(target); - //plys.remove(p); - } - - for(ProxiedPlayer ply : plys) { - int pos = plys.indexOf(ply)+1; - int len = plys.size(); - int time = pos*timeBetweenPlayers; - int min = (int) Math.floor((time) / (60)); - int sec = (int) Math.floor((time % (60))); - String timeStr; - if(min <= 0) { - timeStr = msgs.get("format.time.secs") - .replaceAll("\\{m\\}", "0") - .replaceAll("\\{s\\}", sec+""); - } else { - timeStr = msgs.get("format.time.mins") - .replaceAll("\\{m\\}", min+"") - .replaceAll("\\{s\\}", sec+""); - } - if(notif) { - ply.sendMessage(formatMessage( - msgs.get("status.online.base") - .replaceAll("\\{POS\\}", pos+"") - .replaceAll("\\{LEN\\}", len+"") - .replaceAll("\\{TIME\\}", timeStr) - )); - } - if(getConfig().getBoolean("send-actionbar")) { - BungeeUtils.sendCustomData(ply, "actionbar", msgs.get("spigot.actionbar.online") - .replaceAll("\\{POS\\}", pos+"") - .replaceAll("\\{LEN\\}", len+"") - .replaceAll("\\{TIME\\}", timeStr)+";time="+timeBetweenPlayers); - } - } - if(!notif) { - notif = true; - } else { - notif = false; - } - } - - } - public void sendPlayers() { - sendPlayers(null); - } - - @EventHandler public void moveServer(ServerSwitchEvent e) { ProxiedPlayer p = e.getPlayer(); - String queue = getPlayerInQueue(p); - if(queue != null) { - queues.get(queue).remove(p); + Server alreadyqueued = man.findPlayerInQueue(p); + if(alreadyqueued != null) { + alreadyqueued.getQueue().remove(p); } String servername = e.getPlayer().getServer().getInfo().getName(); @@ -222,7 +107,7 @@ public class Main extends Plugin implements Listener { String from = parts[0]; String to = parts[1]; if(from.equalsIgnoreCase(servername)) { - addToQueue(p, to); + man.addToQueue(p, to); } } } @@ -230,107 +115,10 @@ public class Main extends Plugin implements Listener { @EventHandler public void onLeave(PlayerDisconnectEvent e) { ProxiedPlayer p = e.getPlayer(); - String queue = getPlayerInQueue(p); - if(queue != null) { - queues.get(queue).remove(p); + Server server = man.findPlayerInQueue(p); + if(server != null) { + server.getQueue().remove(p); } } - - HashMap servers = new HashMap<>(); - public void updateOnlineServers() { - for(final String server : getProxy().getServers().keySet()) { - if(!servers.containsKey(server)) { - servers.put(server, false); - } - getProxy().getServers().get(server).ping(new Callback() { - - @Override - public void done(ServerPing result, Throwable error) { - servers.put(server, error == null); - } - }); - } - } - - - HashMap> queues = new HashMap<>(); - public void addToQueue(ProxiedPlayer p, String server) { - //getLogger().info("adding "+p.getDisplayName()+" to queue "+server); - if(!servers.containsKey(server)) { - p.sendMessage(msgs.getBC("errors.server-not-exist")); - return; - } - if(!queues.containsKey(server)) { - queues.put(server, new ArrayList()); - } - if(p.getServer().getInfo().getName().equals(server)) { - p.sendMessage(msgs.getBC("errors.already-connected")); - return; - } - String currentQueued = getPlayerInQueue(p); - List list = queues.get(server); - if(list.indexOf(p) != -1) { - int pos = list.indexOf(p)+1; - int len = list.size(); - p.sendMessage(formatMessage( - msgs.get("errors.already-queued") - .replaceAll("\\{POS\\}", pos+"") - .replaceAll("\\{LEN\\}", len+"") - )); - return; - } - if(currentQueued != null) { - queues.get(currentQueued).remove(p); - p.sendMessage(msgs.getBC("status.left-last-queue")); - } - if(isp) { - us.ajg0702.queue.Logic.priorityLogic(list, server, p); - } else { - if((p.hasPermission("ajqueue.priority") || p.hasPermission("ajqueue.serverpriority."+server)) && list.size() > 0) { - int i = 0; - for(ProxiedPlayer ply : list) { - if(!(ply.hasPermission("ajqueue.priority") || ply.hasPermission("ajqueue.serverpriority."+server))) { - list.add(i, p); - break; - } - i++; - } - if(list.size() == 0) { - list.add(p); - } - } else { - list.add(p); - } - } - int pos = list.indexOf(p)+1; - int len = list.size(); - p.sendMessage(formatMessage( - msgs.get("status.now-in-queue") - .replaceAll("\\{POS\\}", pos+"") - .replaceAll("\\{LEN\\}", len+"") - )); - - if(list.size() <= 1) { - sendPlayers(server); - } - } - - - public void sendPlayer(ProxiedPlayer p) { - String server = getPlayerInQueue(p); - if(server == null) return; - sendPlayers(server); - } - - - public String getPlayerInQueue(ProxiedPlayer p) { - for(String server : queues.keySet()) { - if(queues.get(server).indexOf(p) != -1) { - return server; - } - } - return null; - } - } diff --git a/src/main/java/us/ajg0702/queue/Manager.java b/src/main/java/us/ajg0702/queue/Manager.java new file mode 100644 index 0000000..39529b9 --- /dev/null +++ b/src/main/java/us/ajg0702/queue/Manager.java @@ -0,0 +1,329 @@ +package us.ajg0702.queue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.ajg0702.queue.utils.BungeeMessages; +import us.ajg0702.queue.utils.BungeeUtils; + +public class Manager { + + static Manager INSTANCE = null; + public static Manager getInstance(Main pl) { + if(INSTANCE == null) { + INSTANCE = new Manager(pl); + } + return INSTANCE; + } + public static Manager getInstance() { + return INSTANCE; + } + + BungeeMessages msgs; + + + Main pl; + private Manager(Main pl) { + this.pl = pl; + msgs = BungeeMessages.getInstance(); + reloadServers(); + reloadIntervals(); + } + + /* + * Returns all servers + */ + public List getServers() { + return servers; + } + + + + int sendId = -1; + int updateId = -1; + int messagerId = -1; + int actionbarId = -1; + /** + * Clears all intervals and re-makes them + */ + public void reloadIntervals() { + if(sendId != -1) { + pl.getProxy().getScheduler().cancel(sendId); + } + if(updateId != -1) { + pl.getProxy().getScheduler().cancel(updateId); + } + if(messagerId != -1) { + pl.getProxy().getScheduler().cancel(messagerId); + } + if(actionbarId != -1) { + pl.getProxy().getScheduler().cancel(actionbarId); + } + + sendId = pl.getProxy().getScheduler().schedule(pl, new Runnable() { + public void run() { + sendPlayers(); + } + }, 2, pl.timeBetweenPlayers, TimeUnit.SECONDS).getId(); + + updateId = pl.getProxy().getScheduler().schedule(pl, new Runnable() { + public void run() { + updateServers(); + } + }, 0, Math.max(pl.timeBetweenPlayers, 2), TimeUnit.SECONDS).getId(); + + messagerId = pl.getProxy().getScheduler().schedule(pl, new Runnable() { + public void run() { + sendMessages(); + } + }, 0, pl.getConfig().getInt("message-time"), TimeUnit.SECONDS).getId(); + actionbarId = pl.getProxy().getScheduler().schedule(pl, new Runnable() { + public void run() { + sendActionBars(); + } + }, 0, 2, TimeUnit.SECONDS).getId(); + } + + + + + List servers = new ArrayList<>(); + /** + * Checks servers that are in bungeecord and adds any it doesnt + * know about. + */ + public void reloadServers() { + Map svs = ProxyServer.getInstance().getServers(); + for(String name : svs.keySet()) { + if(findServer(name) != null) continue; + ServerInfo info = svs.get(name); + servers.add(new Server(name, info)); + } + } + + /** + * Sends actionbar updates to all players in all queues with their + * position in the queue and time remaining + */ + public void sendActionBars() { + if(!pl.getConfig().getBoolean("send-actionbar")) return; + for(Server s : servers) { + int ot = s.getOfflineTime(); + List plys = s.getQueue(); + for(ProxiedPlayer ply : plys) { + int pos = plys.indexOf(ply)+1; + if(pos == 0) { + plys.remove(ply); + continue; + } + int len = plys.size(); + if(!s.isOnline()) { + String or = msgs.get("status.offline.restarting"); + if(ot > pl.config.getInt("offline-time")) { + or = msgs.get("status.offline.offline"); + } + BungeeUtils.sendCustomData(ply, "actionbar", msgs.get("spigot.actionbar.offline") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{STATUS\\}", or)+";time="+pl.timeBetweenPlayers); + } else { + int time = pos*pl.timeBetweenPlayers; + int min = (int) Math.floor((time) / (60)); + int sec = (int) Math.floor((time % (60))); + String timeStr; + if(min <= 0) { + timeStr = msgs.get("format.time.secs") + .replaceAll("\\{m\\}", "0") + .replaceAll("\\{s\\}", sec+""); + } else { + timeStr = msgs.get("format.time.mins") + .replaceAll("\\{m\\}", min+"") + .replaceAll("\\{s\\}", sec+""); + } + BungeeUtils.sendCustomData(ply, "actionbar", msgs.get("spigot.actionbar.online") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{TIME\\}", timeStr)+";time="+pl.timeBetweenPlayers); + } + } + } + } + + /** + * Sends the message to the player updating them on their position in the queue + * along with their time remaining + */ + public void sendMessages() { + for(Server s : servers) { + int ot = s.getOfflineTime(); + List plys = s.getQueue(); + for(ProxiedPlayer ply : plys) { + int pos = plys.indexOf(ply)+1; + if(pos == 0) { + plys.remove(ply); + continue; + } + int len = plys.size(); + if(!s.isOnline()) { + String or = msgs.get("status.offline.restarting"); + if(ot > pl.config.getInt("offline-time")) { + or = msgs.get("status.offline.offline"); + } + ply.sendMessage(Main.formatMessage( + msgs.get("status.offline.base") + .replaceAll("\\{STATUS\\}", or) + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + )); + } else { + int time = pos*pl.timeBetweenPlayers; + int min = (int) Math.floor((time) / (60)); + int sec = (int) Math.floor((time % (60))); + String timeStr; + if(min <= 0) { + timeStr = msgs.get("format.time.secs") + .replaceAll("\\{m\\}", "0") + .replaceAll("\\{s\\}", sec+""); + } else { + timeStr = msgs.get("format.time.mins") + .replaceAll("\\{m\\}", min+"") + .replaceAll("\\{s\\}", sec+""); + } + ply.sendMessage(Main.formatMessage( + msgs.get("status.online.base") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{TIME\\}", timeStr) + )); + } + + } + } + } + + /** + * Find a server by name + * @param name Name of the server + * @return The server if it exists (otherwise null) + */ + public Server findServer(String name) { + for(Server server : servers) { + if(server.getName().equals(name)) { + return server; + } + } + return null; + } + + /** + * Updates info about servers. + */ + public void updateServers() { + for(Server s : servers) { + s.update(); + } + } + + /** + * Attempts to send the first player in all queues + */ + public void sendPlayers() { + sendPlayers(null); + } + /** + * Attempts to send the first player in this queue + * @param server The server to send the first player in the queue. null for all servers. + */ + public void sendPlayers(String server) { + for(Server s : servers) { + String name = s.getName(); + if(server != null && !server.equals(name)) continue; + if(!s.isOnline()) continue; + if(s.getQueue().size() <= 0) continue; + + s.getQueue().get(0).connect(s.getInfo()); + } + } + + /** + * Add a player to the queue for a server + * @param p The player + * @param s The name of the server + */ + public void addToQueue(ProxiedPlayer p, String s) { + Server server = findServer(s); + if(server == null) { + p.sendMessage(msgs.getBC("errors.server-not-exist")); + return; + } + + Server beforeQueue = findPlayerInQueue(p); + if(beforeQueue != null) { + if(beforeQueue.equals(server)) { + p.sendMessage(msgs.getBC("errors.already-queued")); + return; + } + p.sendMessage(msgs.getBC("status.left-last-queue")); + beforeQueue.getQueue().remove(p); + } + + List list = server.getQueue(); + if(list.indexOf(p) != -1) { + int pos = list.indexOf(p)+1; + int len = list.size(); + p.sendMessage(Main.formatMessage( + msgs.get("errors.already-queued") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + )); + return; + } + if(pl.isp) { + us.ajg0702.queue.Logic.priorityLogic(list, s, p); + } else { + if((p.hasPermission("ajqueue.priority") || p.hasPermission("ajqueue.serverpriority."+server)) && list.size() > 0) { + int i = 0; + for(ProxiedPlayer ply : list) { + if(!(ply.hasPermission("ajqueue.priority") || ply.hasPermission("ajqueue.serverpriority."+server))) { + list.add(i, p); + break; + } + i++; + } + if(list.size() == 0) { + list.add(p); + } + } else { + list.add(p); + } + } + int pos = list.indexOf(p)+1; + int len = list.size(); + p.sendMessage(Main.formatMessage( + msgs.get("status.now-in-queue") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + )); + + if(list.size() <= 1) { + sendPlayers(s); + } + } + + /** + * Finds which server the player is queued for + * @param p The player to search for + * @return The server the player is queued for. Null if not in a queue + */ + public Server findPlayerInQueue(ProxiedPlayer p) { + for(Server s : servers) { + if(s.getQueue().contains(p)) return s; + } + return null; + } +} diff --git a/src/main/java/us/ajg0702/queue/Server.java b/src/main/java/us/ajg0702/queue/Server.java new file mode 100644 index 0000000..f69a29d --- /dev/null +++ b/src/main/java/us/ajg0702/queue/Server.java @@ -0,0 +1,93 @@ +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.ServerPing; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +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(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; + } + + public boolean isOnline() { + return online; + } + public boolean isFull() { + return playercount >= maxplayers; + } + + + List queue = new ArrayList<>(); + public List getQueue() { + return queue; + } + + + 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 List getWhitelistedPlayers() { + return whitelistedplayers; + } +} diff --git a/src/main/java/us/ajg0702/queue/LeaveCommand.java b/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java similarity index 71% rename from src/main/java/us/ajg0702/queue/LeaveCommand.java rename to src/main/java/us/ajg0702/queue/commands/LeaveCommand.java index 643fa6a..5aff8af 100644 --- a/src/main/java/us/ajg0702/queue/LeaveCommand.java +++ b/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java @@ -1,8 +1,11 @@ -package us.ajg0702.queue; +package us.ajg0702.queue.commands; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; +import us.ajg0702.queue.Main; +import us.ajg0702.queue.Manager; +import us.ajg0702.queue.Server; import us.ajg0702.queue.utils.BungeeMessages; public class LeaveCommand extends Command { @@ -21,9 +24,9 @@ public class LeaveCommand extends Command { return; } ProxiedPlayer p = (ProxiedPlayer) sender; - String queue = plugin.getPlayerInQueue((ProxiedPlayer) sender); - if(queue != null) { - plugin.queues.get(queue).remove(p); + Server server = Manager.getInstance().findPlayerInQueue((ProxiedPlayer) sender); + if(server != null) { + server.getQueue().remove(p); p.sendMessage(msgs.getBC("commands.leave-queue")); } } diff --git a/src/main/java/us/ajg0702/queue/ManageCommand.java b/src/main/java/us/ajg0702/queue/commands/ManageCommand.java similarity index 83% rename from src/main/java/us/ajg0702/queue/ManageCommand.java rename to src/main/java/us/ajg0702/queue/commands/ManageCommand.java index 2f414f2..b57b965 100644 --- a/src/main/java/us/ajg0702/queue/ManageCommand.java +++ b/src/main/java/us/ajg0702/queue/commands/ManageCommand.java @@ -1,4 +1,4 @@ -package us.ajg0702.queue; +package us.ajg0702.queue.commands; import java.util.ArrayList; import java.util.List; @@ -6,6 +6,9 @@ import java.util.List; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; +import us.ajg0702.queue.Main; +import us.ajg0702.queue.Manager; +import us.ajg0702.queue.Server; import us.ajg0702.queue.utils.BungeeMessages; public class ManageCommand extends Command { @@ -31,6 +34,9 @@ public class ManageCommand extends Command { } msgs.reload(); pl.getConfig().reload(); + pl.timeBetweenPlayers = pl.getConfig().getInt("wait-time"); + Manager.getInstance().reloadIntervals(); + Manager.getInstance().reloadServers(); pl.checkConfig(); sender.sendMessage(msgs.getBC("commands.reload")); return; @@ -38,11 +44,11 @@ public class ManageCommand extends Command { } if(args[0].equalsIgnoreCase("list")) { int total = 0; - for(String server : pl.queues.keySet()) { + for(Server server : Manager.getInstance().getServers()) { - String msg = msgs.get("list.format").replaceAll("\\{SERVER\\}", server); + String msg = msgs.get("list.format").replaceAll("\\{SERVER\\}", server.getName()); String playerlist = ""; - List players = pl.queues.get(server); + List players = server.getQueue(); if(msg.contains("{LIST}")) { for(ProxiedPlayer p : players) { playerlist += msgs.get("list.playerlist").replaceAll("\\{NAME\\}", p.getDisplayName()); @@ -61,7 +67,7 @@ public class ManageCommand extends Command { return; } if(args[0].equalsIgnoreCase("p")) { - sender.sendMessage(Main.formatMessage(pl.isp+"")); + sender.sendMessage(Main.formatMessage(pl.isp()+"")); return; } if(args[0].equalsIgnoreCase("player")) { @@ -82,7 +88,7 @@ public class ManageCommand extends Command { return; } ProxiedPlayer ply = pl.getProxy().getPlayer(args[0]); - pl.addToQueue(ply, args[1]); + Manager.getInstance().addToQueue(ply, args[1]); sender.sendMessage(Main.formatMessage( msgs.get("send") .replaceAll("\\{PLAYER\\}", ply.getDisplayName()) diff --git a/src/main/java/us/ajg0702/queue/MoveCommand.java b/src/main/java/us/ajg0702/queue/commands/MoveCommand.java similarity index 70% rename from src/main/java/us/ajg0702/queue/MoveCommand.java rename to src/main/java/us/ajg0702/queue/commands/MoveCommand.java index d960145..5883088 100644 --- a/src/main/java/us/ajg0702/queue/MoveCommand.java +++ b/src/main/java/us/ajg0702/queue/commands/MoveCommand.java @@ -1,9 +1,11 @@ -package us.ajg0702.queue; +package us.ajg0702.queue.commands; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; - +import us.ajg0702.queue.Main; +import us.ajg0702.queue.Manager; +import us.ajg0702.queue.Server; import us.ajg0702.queue.utils.BungeeMessages; public class MoveCommand extends Command { @@ -23,11 +25,11 @@ public class MoveCommand extends Command { } ProxiedPlayer p = (ProxiedPlayer) sender; if(args.length > 0) { - plugin.addToQueue(p, args[0]); + Manager.getInstance().addToQueue(p, args[0]); } else if(args.length == 0) { - String queue = plugin.getPlayerInQueue((ProxiedPlayer) sender); - if(queue != null) { - plugin.queues.get(queue).remove(p); + Server server = Manager.getInstance().findPlayerInQueue((ProxiedPlayer) sender); + if(server != null) { + server.getQueue().remove(p); p.sendMessage(msgs.getBC("commands.leave-queue")); } } diff --git a/src/main/java/us/ajg0702/queue/spigot/Main.java b/src/main/java/us/ajg0702/queue/spigot/Main.java index 592507a..279d96d 100644 --- a/src/main/java/us/ajg0702/queue/spigot/Main.java +++ b/src/main/java/us/ajg0702/queue/spigot/Main.java @@ -33,22 +33,6 @@ public class Main extends JavaPlugin implements PluginMessageListener { final String text = data.split(";time=")[0]; //getLogger().info("recieved actionbar for "+player.getName()+": "+text); VersionSupport.sendActionBar(p, text); - - int time = Integer.parseInt(data.split(";time=")[1]); - if(time > 2) { - Bukkit.getScheduler().runTaskLater(this, new Runnable() { - public void run() { - VersionSupport.sendActionBar(p, text); - } - }, 2*20); - if(time > 4) { - Bukkit.getScheduler().runTaskLater(this, new Runnable() { - public void run() { - VersionSupport.sendActionBar(p, text); - } - }, 4*20); - } - } } } } diff --git a/src/main/java/us/ajg0702/queue/utils/BungeeMessages.java b/src/main/java/us/ajg0702/queue/utils/BungeeMessages.java index d561a2f..442d750 100644 --- a/src/main/java/us/ajg0702/queue/utils/BungeeMessages.java +++ b/src/main/java/us/ajg0702/queue/utils/BungeeMessages.java @@ -61,7 +61,7 @@ public class BungeeMessages { d.put("status.now-in-queue", "&aYou are now queued! &7You are in position &f{POS}&7 of &f{LEN}&7.\n&7Type &f/leavequeue&7 to leave the queue!"); d.put("errors.server-not-exist", "&cThat server does not exist!"); - d.put("errors.already-queued", "&cYou are already queued! &7You are in position &f{POS}&7 of &f{LEN}&7."); + d.put("errors.already-queued", "&cYou are already queued for that server!"); d.put("errors.player-only", "&cThis command can only be executed as a player!"); d.put("errors.already-connected", "&cYou are already connected to this server!"); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d7030e8..2cc6ebb 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Dont touch this number please -config-version: 3 +config-version: 4 # The time the server will wait between sending people in the queue # Default: 5 @@ -9,6 +9,10 @@ wait-time: 5 # Default: 120 offline-time: 120 +# The time the server will wait between sending players update messages on what position they are in the queue. +# Default: 10 +message-time: 10 + # If a player is in a server, you can have the plugin make them automatically join a queue for another server # Example with the default values: Player joins survivalfallback server, they will auto-join the queue for survival queue-servers: