add players back to queue and preserve paused state on reload

This commit is contained in:
ajgeiss0702
2021-08-01 11:50:15 -07:00
parent fc6c7f725c
commit 19a17b8ddf
8 changed files with 92 additions and 46 deletions
@@ -5,7 +5,7 @@ import us.ajg0702.queue.api.queues.QueueServer;
import java.util.List; import java.util.List;
public interface ServerBuilder { public interface ServerBuilder {
List<QueueServer> buildServers(); List<AdaptedServer> getServers();
AdaptedServer getServer(String name); AdaptedServer getServer(String name);
} }
@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
public class QueueManagerImpl implements QueueManager { public class QueueManagerImpl implements QueueManager {
private final List<QueueServer> servers = new CopyOnWriteArrayList<>(); private List<QueueServer> servers = new CopyOnWriteArrayList<>();
private final QueueMain main; private final QueueMain main;
private final Messages msgs; private final Messages msgs;
@@ -36,6 +36,27 @@ public class QueueManagerImpl implements QueueManager {
}, delay, TimeUnit.MILLISECONDS); }, delay, TimeUnit.MILLISECONDS);
} }
public List<QueueServer> buildServers() {
List<QueueServer> result = new ArrayList<>();
List<AdaptedServer> servers = main.getServerBuilder().getServers();
for(AdaptedServer server : servers) {
QueueServer previousServer = main.getQueueManager().findServer(server.getName());
List<QueuePlayer> 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 @Override
public boolean addToQueue(AdaptedPlayer player, QueueServer server) { public boolean addToQueue(AdaptedPlayer player, QueueServer server) {
if(player == null || server == null) { if(player == null || server == null) {
@@ -190,19 +211,19 @@ public class QueueManagerImpl implements QueueManager {
main.getLogger().severe("[MAN] Config is null"); main.getLogger().severe("[MAN] Config is null");
} }
servers.clear(); List<QueueServer> oldServers = ImmutableList.copyOf(servers);
servers.addAll(main.getServerBuilder().buildServers()); servers = buildServers();
List<String> groupsRaw = main.getConfig().getStringList("server-groups"); List<String> groupsRaw = main.getConfig().getStringList("server-groups");
for(String groupraw : groupsRaw) { for(String groupRaw : groupsRaw) {
if(groupraw.isEmpty()) { if(groupRaw.isEmpty()) {
main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []");
continue; continue;
} }
String groupName = groupraw.split(":")[0]; String groupName = groupRaw.split(":")[0];
String[] serversraw = groupraw.split(":")[1].split(","); String[] serversraw = groupRaw.split(":")[1].split(",");
if(findServer(groupName) != null) { if(findServer(groupName) != null) {
main.getLogger().warning("The name of a group ('"+groupName+"') cannot be the same as the name of a server!"); 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; continue;
} }
this.servers.add(new QueueServerImpl(groupName, main, groupServers));
final List<QueuePlayer> previousPlayers = new ArrayList<>();
oldServers.forEach(queueServer -> {
if(queueServer.getName().equals(groupName)) {
previousPlayers.addAll(queueServer.getQueue());
}
});
this.servers.add(new QueueServerImpl(groupName, main, groupServers, previousPlayers));
} }
} }
@@ -1,5 +1,6 @@
package us.ajg0702.queue.common.players; package us.ajg0702.queue.common.players;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
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;
@@ -20,14 +21,22 @@ public class QueuePlayerImpl implements QueuePlayer {
private final int maxOfflineTime; 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) { 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.player = player;
this.server = server; this.server = server;
this.highestPriority = highestPriority; this.highestPriority = highestPriority;
uuid = player.getUniqueId(); this.uuid = uuid;
name = player.getName(); this.name = name;
this.maxOfflineTime = maxOfflineTime; this.maxOfflineTime = maxOfflineTime;
} }
@@ -7,6 +7,7 @@ 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.AdaptedServerPing; import us.ajg0702.queue.api.server.AdaptedServerPing;
import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.common.QueueMain;
import us.ajg0702.queue.common.players.QueuePlayerImpl;
import us.ajg0702.utils.common.GenUtils; import us.ajg0702.utils.common.GenUtils;
import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.Messages;
@@ -20,14 +21,37 @@ public class QueueServerImpl implements QueueServer {
private final String name; private final String name;
public QueueServerImpl(String name, QueueMain main, AdaptedServer server) { public QueueServerImpl(String name, QueueMain main, AdaptedServer server, List<QueuePlayer> previousPlayers) {
this(name, main, Collections.singletonList(server)); this(name, main, Collections.singletonList(server), previousPlayers);
} }
public QueueServerImpl(String name, QueueMain main, List<AdaptedServer> servers) { public QueueServerImpl(String name, QueueMain main, List<AdaptedServer> servers, List<QueuePlayer> previousPlayers) {
this.name = name; this.name = name;
this.servers = servers; this.servers = servers;
this.main = main; 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; private final QueueMain main;
@@ -251,6 +275,7 @@ public class QueueServerImpl implements QueueServer {
@Override @Override
public synchronized void addPlayer(QueuePlayer player, int position) { public synchronized void addPlayer(QueuePlayer player, int position) {
if(!player.getQueueServer().equals(this) || queue.contains(player)) return; if(!player.getQueueServer().equals(this) || queue.contains(player)) return;
if(position > 0) { if(position > 0) {
queue.add(position, player); queue.add(position, player);
} else { } else {
@@ -42,7 +42,7 @@ public class BungeeQueue extends Plugin implements Listener {
new BungeeMethods(this, getProxy(), logger), new BungeeMethods(this, getProxy(), logger),
dataFolder dataFolder
); );
main.setServerBuilder(new BungeeServerBuilder(main, getProxy())); main.setServerBuilder(new BungeeServerBuilder(getProxy()));
getProxy().registerChannel("ajqueue:tospigot"); getProxy().registerChannel("ajqueue:tospigot");
getProxy().registerChannel("ajqueue:toproxy"); getProxy().registerChannel("ajqueue:toproxy");
@@ -2,33 +2,25 @@ package us.ajg0702.queue.platforms.bungeecord.server;
import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo; 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.AdaptedServer;
import us.ajg0702.queue.api.server.ServerBuilder; 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 { public class BungeeServerBuilder implements ServerBuilder {
private final ProxyServer proxyServer; private final ProxyServer proxyServer;
private final QueueMain main;
public BungeeServerBuilder(QueueMain main, ProxyServer proxyServer) { public BungeeServerBuilder(ProxyServer proxyServer) {
this.proxyServer = proxyServer; this.proxyServer = proxyServer;
this.main = main;
} }
@Override @Override
public List<QueueServer> buildServers() { public List<AdaptedServer> getServers() {
List<QueueServer> result = new ArrayList<>(); List<AdaptedServer> result = new ArrayList<>();
Map<String, ServerInfo> servers = proxyServer.getServers();
for(String serverName : servers.keySet()) { proxyServer.getServers().forEach((s, serverInfo) -> result.add(new BungeeServer(serverInfo)));
ServerInfo serverInfo = servers.get(serverName);
AdaptedServer adaptedServer = new BungeeServer(serverInfo);
result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer));
}
return result; return result;
} }
@@ -69,7 +69,7 @@ public class VelocityQueue {
new VelocityMethods(this, proxyServer, logger), new VelocityMethods(this, proxyServer, logger),
dataFolder dataFolder
); );
main.setServerBuilder(new VelocityServerBuilder(main, proxyServer)); main.setServerBuilder(new VelocityServerBuilder(proxyServer));
commands = Arrays.asList( commands = Arrays.asList(
new QueueCommand(main), new QueueCommand(main),
@@ -2,35 +2,26 @@ package us.ajg0702.queue.platforms.velocity.server;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.server.RegisteredServer; 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.api.server.AdaptedServer;
import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.api.server.ServerBuilder;
import us.ajg0702.queue.common.queues.QueueServerImpl;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
public class VelocityServerBuilder implements ServerBuilder { public class VelocityServerBuilder implements ServerBuilder {
private final ProxyServer proxyServer; private final ProxyServer proxyServer;
private final QueueMain main;
public VelocityServerBuilder(QueueMain main, ProxyServer proxyServer) { public VelocityServerBuilder(ProxyServer proxyServer) {
this.proxyServer = proxyServer; this.proxyServer = proxyServer;
this.main = main;
} }
@Override @Override
public List<QueueServer> buildServers() { public List<AdaptedServer> getServers() {
List<QueueServer> result = new ArrayList<>(); List<AdaptedServer> result = new ArrayList<>();
Collection<RegisteredServer> servers = proxyServer.getAllServers();
for(RegisteredServer server : servers) { proxyServer.getAllServers().forEach(registeredServer -> result.add(new VelocityServer(registeredServer)));
AdaptedServer adaptedServer = new VelocityServer(server);
result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer));
}
return result; return result;
} }