From 19a17b8ddf3563b636a5fdd4764e2bf284b30e3c Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 11:50:15 -0700 Subject: [PATCH] add players back to queue and preserve paused state on reload --- .../queue/api/server/ServerBuilder.java | 2 +- .../queue/common/QueueManagerImpl.java | 45 +++++++++++++++---- .../queue/common/players/QueuePlayerImpl.java | 13 +++++- .../queue/common/queues/QueueServerImpl.java | 31 +++++++++++-- .../platforms/bungeecord/BungeeQueue.java | 2 +- .../server/BungeeServerBuilder.java | 22 +++------ .../platforms/velocity/VelocityQueue.java | 2 +- .../server/VelocityServerBuilder.java | 21 +++------ 8 files changed, 92 insertions(+), 46 deletions(-) diff --git a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java index 23b08e8..53955fd 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java @@ -5,7 +5,7 @@ import us.ajg0702.queue.api.queues.QueueServer; import java.util.List; public interface ServerBuilder { - List buildServers(); + List getServers(); AdaptedServer getServer(String name); } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 7dcec34..44b7948 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; public class QueueManagerImpl implements QueueManager { - private final List servers = new CopyOnWriteArrayList<>(); + private List servers = new CopyOnWriteArrayList<>(); private final QueueMain main; private final Messages msgs; @@ -36,6 +36,27 @@ public class QueueManagerImpl implements QueueManager { }, delay, TimeUnit.MILLISECONDS); } + public List buildServers() { + List result = new ArrayList<>(); + List servers = main.getServerBuilder().getServers(); + + for(AdaptedServer server : servers) { + QueueServer previousServer = main.getQueueManager().findServer(server.getName()); + List previousPlayers = previousServer == null ? new ArrayList<>() : previousServer.getQueue(); + if(previousPlayers.size() > 0) { + main.getLogger().info("Adding "+previousPlayers.size()+" players back to the queue for "+server.getName()); + } + QueueServer queueServer = new QueueServerImpl(server.getName(), main, server, previousPlayers); + if(previousServer != null) { + queueServer.setPaused(previousServer.isPaused()); + queueServer.setLastSentTime(previousServer.getLastSentTime()); + } + result.add(queueServer); + } + + return result; + } + @Override public boolean addToQueue(AdaptedPlayer player, QueueServer server) { if(player == null || server == null) { @@ -190,19 +211,19 @@ public class QueueManagerImpl implements QueueManager { main.getLogger().severe("[MAN] Config is null"); } - servers.clear(); + List oldServers = ImmutableList.copyOf(servers); - servers.addAll(main.getServerBuilder().buildServers()); + servers = buildServers(); List groupsRaw = main.getConfig().getStringList("server-groups"); - for(String groupraw : groupsRaw) { - if(groupraw.isEmpty()) { + for(String groupRaw : groupsRaw) { + if(groupRaw.isEmpty()) { main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); continue; } - String groupName = groupraw.split(":")[0]; - String[] serversraw = groupraw.split(":")[1].split(","); + String groupName = groupRaw.split(":")[0]; + String[] serversraw = groupRaw.split(":")[1].split(","); if(findServer(groupName) != null) { main.getLogger().warning("The name of a group ('"+groupName+"') cannot be the same as the name of a server!"); @@ -227,7 +248,15 @@ public class QueueManagerImpl implements QueueManager { continue; } - this.servers.add(new QueueServerImpl(groupName, main, groupServers)); + + final List previousPlayers = new ArrayList<>(); + oldServers.forEach(queueServer -> { + if(queueServer.getName().equals(groupName)) { + previousPlayers.addAll(queueServer.getQueue()); + } + }); + + this.servers.add(new QueueServerImpl(groupName, main, groupServers, previousPlayers)); } } diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java index 14385f9..5c1b619 100644 --- a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -1,5 +1,6 @@ package us.ajg0702.queue.common.players; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; @@ -20,14 +21,22 @@ public class QueuePlayerImpl implements QueuePlayer { private final int maxOfflineTime; + public QueuePlayerImpl(UUID uuid, String name, QueueServer server, int highestPriority, int maxOfflineTime) { + this(null, name, uuid, server, highestPriority, maxOfflineTime); + } + public QueuePlayerImpl(AdaptedPlayer player, QueueServer server, int highestPriority, int maxOfflineTime) { + this(player, player.getName(), player.getUniqueId(), server, highestPriority, maxOfflineTime); + } + + private QueuePlayerImpl(@Nullable AdaptedPlayer player, String name, @NotNull UUID uuid, QueueServer server, int highestPriority, int maxOfflineTime) { this.player = player; this.server = server; this.highestPriority = highestPriority; - uuid = player.getUniqueId(); - name = player.getName(); + this.uuid = uuid; + this.name = name; this.maxOfflineTime = maxOfflineTime; } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index f352ff8..483c640 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -7,6 +7,7 @@ import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServerPing; import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.common.players.QueuePlayerImpl; import us.ajg0702.utils.common.GenUtils; import us.ajg0702.utils.common.Messages; @@ -20,14 +21,37 @@ public class QueueServerImpl implements QueueServer { private final String name; - public QueueServerImpl(String name, QueueMain main, AdaptedServer server) { - this(name, main, Collections.singletonList(server)); + public QueueServerImpl(String name, QueueMain main, AdaptedServer server, List previousPlayers) { + this(name, main, Collections.singletonList(server), previousPlayers); } - public QueueServerImpl(String name, QueueMain main, List servers) { + public QueueServerImpl(String name, QueueMain main, List servers, List previousPlayers) { this.name = name; this.servers = servers; this.main = main; + + for(QueuePlayer queuePlayer : previousPlayers) { + if(queuePlayer.getPlayer() == null) { + addPlayer( + new QueuePlayerImpl( + queuePlayer.getUniqueId(), + queuePlayer.getName(), + this, + queuePlayer.getPriority(), + queuePlayer.getMaxOfflineTime() + ) + ); + } else { + addPlayer( + new QueuePlayerImpl( + queuePlayer.getPlayer(), + this, + queuePlayer.getPriority(), + queuePlayer.getMaxOfflineTime() + ) + ); + } + } } private final QueueMain main; @@ -251,6 +275,7 @@ public class QueueServerImpl implements QueueServer { @Override public synchronized void addPlayer(QueuePlayer player, int position) { if(!player.getQueueServer().equals(this) || queue.contains(player)) return; + if(position > 0) { queue.add(position, player); } else { diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java index aa7f949..f8dfe6c 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -42,7 +42,7 @@ public class BungeeQueue extends Plugin implements Listener { new BungeeMethods(this, getProxy(), logger), dataFolder ); - main.setServerBuilder(new BungeeServerBuilder(main, getProxy())); + main.setServerBuilder(new BungeeServerBuilder(getProxy())); getProxy().registerChannel("ajqueue:tospigot"); getProxy().registerChannel("ajqueue:toproxy"); diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java index 15d143c..bf16da8 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java @@ -2,33 +2,25 @@ package us.ajg0702.queue.platforms.bungeecord.server; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; -import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.ServerBuilder; -import us.ajg0702.queue.common.QueueMain; -import us.ajg0702.queue.common.queues.QueueServerImpl; -import java.util.*; +import java.util.ArrayList; +import java.util.List; public class BungeeServerBuilder implements ServerBuilder { private final ProxyServer proxyServer; - private final QueueMain main; - public BungeeServerBuilder(QueueMain main, ProxyServer proxyServer) { + + public BungeeServerBuilder(ProxyServer proxyServer) { this.proxyServer = proxyServer; - this.main = main; } @Override - public List buildServers() { - List result = new ArrayList<>(); - Map servers = proxyServer.getServers(); + public List getServers() { + List result = new ArrayList<>(); - for(String serverName : servers.keySet()) { - ServerInfo serverInfo = servers.get(serverName); - AdaptedServer adaptedServer = new BungeeServer(serverInfo); - result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer)); - } + proxyServer.getServers().forEach((s, serverInfo) -> result.add(new BungeeServer(serverInfo))); return result; } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 37e4c47..fd07797 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -69,7 +69,7 @@ public class VelocityQueue { new VelocityMethods(this, proxyServer, logger), dataFolder ); - main.setServerBuilder(new VelocityServerBuilder(main, proxyServer)); + main.setServerBuilder(new VelocityServerBuilder(proxyServer)); commands = Arrays.asList( new QueueCommand(main), diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java index 1349c8f..c8988f6 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java @@ -2,35 +2,26 @@ package us.ajg0702.queue.platforms.velocity.server; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.server.RegisteredServer; -import us.ajg0702.queue.api.server.ServerBuilder; -import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; -import us.ajg0702.queue.common.QueueMain; -import us.ajg0702.queue.common.queues.QueueServerImpl; +import us.ajg0702.queue.api.server.ServerBuilder; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Optional; public class VelocityServerBuilder implements ServerBuilder { private final ProxyServer proxyServer; - private final QueueMain main; - public VelocityServerBuilder(QueueMain main, ProxyServer proxyServer) { + + public VelocityServerBuilder(ProxyServer proxyServer) { this.proxyServer = proxyServer; - this.main = main; } @Override - public List buildServers() { - List result = new ArrayList<>(); - Collection servers = proxyServer.getAllServers(); + public List getServers() { + List result = new ArrayList<>(); - for(RegisteredServer server : servers) { - AdaptedServer adaptedServer = new VelocityServer(server); - result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer)); - } + proxyServer.getAllServers().forEach(registeredServer -> result.add(new VelocityServer(registeredServer))); return result; }