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;
public interface ServerBuilder {
List<QueueServer> buildServers();
List<AdaptedServer> getServers();
AdaptedServer getServer(String name);
}
@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
public class QueueManagerImpl implements QueueManager {
private final List<QueueServer> servers = new CopyOnWriteArrayList<>();
private List<QueueServer> 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<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
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<QueueServer> oldServers = ImmutableList.copyOf(servers);
servers.addAll(main.getServerBuilder().buildServers());
servers = buildServers();
List<String> 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<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;
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;
}
@@ -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<QueuePlayer> previousPlayers) {
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.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 {
@@ -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");
@@ -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<QueueServer> buildServers() {
List<QueueServer> result = new ArrayList<>();
Map<String, ServerInfo> servers = proxyServer.getServers();
public List<AdaptedServer> getServers() {
List<AdaptedServer> 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;
}
@@ -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),
@@ -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<QueueServer> buildServers() {
List<QueueServer> result = new ArrayList<>();
Collection<RegisteredServer> servers = proxyServer.getAllServers();
public List<AdaptedServer> getServers() {
List<AdaptedServer> 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;
}