From 985f20330904f06c44ad116f8948e500ee3b3a0b Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 27 Aug 2021 15:57:46 -0700 Subject: [PATCH] allow restricting joining queues to certain protocol versions --- .../java/us/ajg0702/queue/api/AjQueueAPI.java | 7 +++ .../us/ajg0702/queue/api/PlatformMethods.java | 4 +- .../queue/api/ProtocolNameManager.java | 8 +++ .../ajg0702/queue/api/queues/QueueServer.java | 14 +++++ common/build.gradle.kts | 2 + .../queue/common/ProtocolNameManagerImpl.java | 44 ++++++++++++++ .../us/ajg0702/queue/common/QueueMain.java | 11 ++++ .../queue/common/QueueManagerImpl.java | 45 ++++++++++++++ .../queue/common/queues/QueueServerImpl.java | 12 ++++ common/src/main/resources/config.yml | 59 ++++++++++++++++++- .../platforms/bungeecord/BungeeMethods.java | 5 ++ .../platforms/velocity/VelocityMethods.java | 6 ++ 12 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 api/src/main/java/us/ajg0702/queue/api/ProtocolNameManager.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/ProtocolNameManagerImpl.java diff --git a/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java b/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java index 9ae7d58..ce7fc5f 100644 --- a/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java +++ b/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java @@ -95,6 +95,13 @@ public abstract class AjQueueAPI { */ public abstract LogicGetter getLogicGetter(); + /** + * Gets the protocol name manager + * Used to get version names from protocol versions + * @return The ProtocolNameManager + */ + public abstract ProtocolNameManager getProtocolNameManager(); + /** * Tells ajQueue to shut down. */ diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index b46ca8d..367c8a1 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -16,7 +16,6 @@ public interface PlatformMethods { * @param channel The (sub)channel * @param data The data */ - @SuppressWarnings("EmptyMethod") void sendPluginMessage(AdaptedPlayer player, String channel, String... data); /** @@ -28,6 +27,7 @@ public interface PlatformMethods { String getPluginVersion(); + @SuppressWarnings("unused") List getOnlinePlayers(); List getPlayerNames(boolean lowercase); @@ -74,4 +74,6 @@ public interface PlatformMethods { AdaptedServer getServer(String name); List getServers(); + + String getProtocolName(int protocol); } diff --git a/api/src/main/java/us/ajg0702/queue/api/ProtocolNameManager.java b/api/src/main/java/us/ajg0702/queue/api/ProtocolNameManager.java new file mode 100644 index 0000000..5806460 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/ProtocolNameManager.java @@ -0,0 +1,8 @@ +package us.ajg0702.queue.api; + +import java.util.HashMap; + +public interface ProtocolNameManager { + String getProtocolName(int protocol); + HashMap getProtocolNames(); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index be6fc20..d860358 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -218,6 +218,20 @@ public interface QueueServer { */ HashMap getLastPings(); + /** + * Gets the protocol versions this queue supports. + * A blank list means all protocols are supported. + * @return The protocol versions this queue supports + */ + List getSupportedProtocols(); + + /** + * Sets the protocols that are supported + * A blank list means all protocols are supported. + * @param list the list of protocols that are supported + */ + void setSupportedProtocols(List list); + /** * elliot is bad diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 511b94d..9a812b2 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -12,6 +12,8 @@ repositories { } dependencies { + testImplementation("junit:junit:4.12") + compileOnly("net.kyori:adventure-api:4.8.1") compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") diff --git a/common/src/main/java/us/ajg0702/queue/common/ProtocolNameManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/ProtocolNameManagerImpl.java new file mode 100644 index 0000000..9f03e3c --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/ProtocolNameManagerImpl.java @@ -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 getProtocolNames() { + List raw = config.getStringList("protocol-names"); + HashMap 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; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 07d2bc0..092ba4e 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -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", "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!"); 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 6dc192f..b2dee1f 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -55,6 +55,35 @@ public class QueueManagerImpl implements QueueManager { result.add(queueServer); } + List 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 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 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; 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 41b16f1..c876233 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 @@ -62,6 +62,8 @@ public class QueueServerImpl implements QueueServer { private final List queue = new ArrayList<>(); + private List supportedProtocols = new ArrayList<>(); + private int playerCount; private int maxPlayers; @@ -409,4 +411,14 @@ public class QueueServerImpl implements QueueServer { public HashMap getLastPings() { return new HashMap<>(pings); } + + @Override + public List getSupportedProtocols() { + return new ArrayList<>(supportedProtocols); + } + + @Override + public void setSupportedProtocols(List list) { + supportedProtocols = new ArrayList<>(list); + } } diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 38b014d..ec92773 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -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 \ No newline at end of file +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" \ No newline at end of file diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java index ec0e36e..347b20d 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java @@ -126,4 +126,9 @@ public class BungeeMethods implements PlatformMethods { return result; } + + @Override + public String getProtocolName(int protocol) { + return protocol+""; + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java index d52bd1d..0449d99 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java @@ -2,6 +2,7 @@ package us.ajg0702.queue.platforms.velocity; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; @@ -147,4 +148,9 @@ public class VelocityMethods implements PlatformMethods { return result; } + + @Override + public String getProtocolName(int protocol) { + return ProtocolVersion.getProtocolVersion(protocol).getMostRecentSupportedVersion(); + } }