allow restricting joining queues to certain protocol versions

This commit is contained in:
ajgeiss0702
2021-08-27 15:57:46 -07:00
parent 7f9515c23d
commit 985f203309
12 changed files with 214 additions and 3 deletions
@@ -0,0 +1,44 @@
package us.ajg0702.queue.common;
import us.ajg0702.queue.api.PlatformMethods;
import us.ajg0702.queue.api.ProtocolNameManager;
import us.ajg0702.utils.common.Config;
import java.util.HashMap;
import java.util.List;
public class ProtocolNameManagerImpl implements ProtocolNameManager {
private final Config config;
private final PlatformMethods platformMethods;
public ProtocolNameManagerImpl(Config config, PlatformMethods platformMethods) {
this.config = config;
this.platformMethods = platformMethods;
}
@Override
public String getProtocolName(int protocol) {
return getProtocolNames().getOrDefault(protocol, platformMethods.getProtocolName(protocol));
}
@Override
public HashMap<Integer, String> getProtocolNames() {
List<String> raw = config.getStringList("protocol-names");
HashMap<Integer, String> result = new HashMap<>();
for(String protocolRaw : raw) {
String[] parts = protocolRaw.split(":");
if(parts.length < 2) continue;
String versionRaw = parts[0];
String versionString = parts[1];
int version;
try {
version = Integer.parseInt(versionRaw);
} catch(NumberFormatException e) {
continue;
}
result.put(version, versionString);
}
return result;
}
}
@@ -94,6 +94,12 @@ public class QueueMain extends AjQueueAPI {
return logicGetter;
}
private ProtocolNameManager protocolNameManager;
@Override
public ProtocolNameManager getProtocolNameManager() {
return protocolNameManager;
}
@Override
public void shutdown() {
taskManager.shutdown();
@@ -140,6 +146,8 @@ public class QueueMain extends AjQueueAPI {
logic = logicGetter.constructLogic();
aliasManager = logicGetter.constructAliasManager(config);
protocolNameManager = new ProtocolNameManagerImpl(config, platformMethods);
taskManager.rescheduleTasks();
}
@@ -168,6 +176,9 @@ public class QueueMain extends AjQueueAPI {
d.put("errors.already-connected", "&cYou are already connected to this server!");
d.put("errors.cant-join-paused", "&cYou cannot join the queue for {SERVER} because it is paused.");
d.put("errors.deny-joining-from-server", "&cYou are not allowed to join queues from this server!");
d.put("errors.wrong-version.base", "<red>You must be on {VERSIONS} to join this server!");
d.put("errors.wrong-version.or", " or ");
d.put("errors.wrong-version.comma", ", ");
d.put("commands.leave-queue", "&aYou left the queue for {SERVER}!");
d.put("commands.reload", "&aConfig and messages reloaded successfully!");
@@ -55,6 +55,35 @@ public class QueueManagerImpl implements QueueManager {
result.add(queueServer);
}
List<String> supportedProtocolsRaw = main.getConfig().getStringList("supported-protocols");
for(String supportedProtocolsString : supportedProtocolsRaw) {
String[] parts = supportedProtocolsString.split(":");
if(parts.length < 2) {
main.getLogger().warn("Invalid supported protocols entry! Must have a colon to seperate the server(s) and the protocols");
continue;
}
String serversRaw = parts[0];
String protocolsRaw = parts[1];
List<Integer> protocols = new ArrayList<>();
for(String protocolString : protocolsRaw.split(",")) {
try {
protocols.add(Integer.valueOf(protocolString));
} catch(NumberFormatException e) {
main.getLogger().info("The protocol "+protocolString+" is not a valid number!");
}
}
for(String serverName : serversRaw.split(",")) {
for(QueueServer server : result) {
if(serverName.equalsIgnoreCase(server.getName())) {
server.setSupportedProtocols(protocols);
break;
}
}
}
}
return result;
}
@@ -70,6 +99,22 @@ public class QueueManagerImpl implements QueueManager {
return false;
}
int playerVersion = player.getProtocolVersion();
List<Integer> supportedProtocols = server.getSupportedProtocols();
if(!supportedProtocols.contains(playerVersion) && supportedProtocols.size() > 0) {
StringBuilder versions = new StringBuilder();
for(int protocol : supportedProtocols) {
versions.append(main.getProtocolNameManager().getProtocolName(protocol));
if(supportedProtocols.indexOf(protocol) == supportedProtocols.size()-2) {
versions.append(msgs.getString("errors.wrong-version.or"));
} else if(supportedProtocols.indexOf(protocol) != supportedProtocols.size()-1) {
versions.append(msgs.getString("errors.wrong-version.comma"));
}
}
player.sendMessage(msgs.getComponent("errors.wrong-version.base", "VERSIONS:" + versions));
return false;
}
if(server.isPaused() && main.getConfig().getBoolean("prevent-joining-paused")) {
player.sendMessage(msgs.getComponent("errors.cant-join-paused", "SERVER:"+server.getAlias()));
return false;
@@ -62,6 +62,8 @@ public class QueueServerImpl implements QueueServer {
private final List<QueuePlayer> queue = new ArrayList<>();
private List<Integer> supportedProtocols = new ArrayList<>();
private int playerCount;
private int maxPlayers;
@@ -409,4 +411,14 @@ public class QueueServerImpl implements QueueServer {
public HashMap<AdaptedServer, AdaptedServerPing> getLastPings() {
return new HashMap<>(pings);
}
@Override
public List<Integer> getSupportedProtocols() {
return new ArrayList<>(supportedProtocols);
}
@Override
public void setSupportedProtocols(List<Integer> list) {
supportedProtocols = new ArrayList<>(list);
}
}
+57 -2
View File
@@ -1,5 +1,13 @@
# Dont touch this number please
config-version: 25
config-version: 26
# This is the main config for ajQueue.
# If you have any questions, make sure to read the comment above the options first,
# then feel free to join my discord and ask for support.
# Discord invite link is on the plugin page.
# The time the server will wait between sending people in the queue
# Default: 5
@@ -197,4 +205,51 @@ priority-messages:
# Should the plugin send a title to the player?
# The title shows what position the player is in the queue
# Default: false
send-title: false
send-title: false
# What protocols do servers support?
# The protocol version number list can be found here: https://wiki.vg/Protocol_version_numbers
# Format: server(s):protocol(s)
# Example: 1.17:755,756
# This example will only allow 1.17 and 1.17.1 on the server called 1.17
# Example: lobby-1,lobby-2,lobby-3:754,755,756
# This example will only allow 1.16.5, 1.17, and 1.17.1 on the 3 lobby servers
supported-protocols:
- "1.17:755,756"
# These are the protocol names the plugin should use.
# If you are on velocity, if the protocol is not listed here then the velocity
# api will be used to find the name of the protocol.
# If you are on bungee, only this list can be used.
protocol-names:
- "756:1.17.1"
- "755:1.17"
- "754:1.16.5"
- "753:1.16.3"
- "751:1.16.2"
- "736:1.16.1"
- "735:1.16"
- "578:1.15.2"
- "575:1.15.1"
- "573:1.15"
- "498:1.14.4"
- "490:1.14.3"
- "485:1.14.2"
- "480:1.14.1"
- "477:1.14"
- "404:1.13.2"
- "401:1.13.1"
- "393:1.13"
- "340:1.12.2"
- "338:1.12.1"
- "335:1.12"
- "316:1.11.2"
- "315:1.11"
- "210:1.10.2"
- "110:1.9.4"
- "109:1.9.2"
- "108:1.9.1"
- "107:1.9"
- "47:1.8.9"
- "5:1.7.10"