From e4cb9d47b2745b761f6c7fd60914ebdb140c695d Mon Sep 17 00:00:00 2001 From: Johannes Donath Date: Sat, 4 Jul 2015 06:31:33 +0200 Subject: [PATCH] Add basic support for configurable tab-complete throttling diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java index 6495e7f2..b6845bc4 100644 --- a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java +++ b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java @@ -130,4 +130,21 @@ public interface ProxyConfig // Waterfall Options // + // Throttling options + + /** + * How often tab-complete packets can be sent. + *
+ * Values in milliseconds. + * + * @return how often tab-complete packets can be sent in milliseconds + */ + int getTabThrottle(); + + /** + * Should we disable the tab completion limit for 1.13+ clients + * + * @return should we disable the tab completion limit for 1.13+ clients + */ + boolean isDisableModernTabLimiter(); } diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java index 741ebfde..91743f01 100644 --- a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java +++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java @@ -7,11 +7,37 @@ import java.io.File; public class WaterfallConfiguration extends Configuration { + /* + * Throttling options + * Helps prevent players from overloading the servers behind us + */ + + /** + * How often players are allowed to send tab throttle. + * Value in milliseconds. + *

+ * Default is one packet per second. + */ + private int tabThrottle = 1000; + private boolean disableModernTabLimiter = true; + @Override public void load() { super.load(); YamlConfig config = new YamlConfig(new File("waterfall.yml")); config.load(false); // Load, but no permissions + // Throttling options + tabThrottle = config.getInt("throttling.tab_complete", tabThrottle); + disableModernTabLimiter = config.getBoolean("disable_modern_tab_limiter", disableModernTabLimiter); } + @Override + public int getTabThrottle() { + return tabThrottle; + } + + @Override + public boolean isDisableModernTabLimiter() { + return disableModernTabLimiter; + } } diff --git a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java index 460aa491..84be12e5 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java @@ -49,6 +49,8 @@ public class UpstreamBridge extends PacketHandler private final ProxyServer bungee; private final UserConnection con; + private long lastTabCompletion = -1; + public UpstreamBridge(ProxyServer bungee, UserConnection con) { this.bungee = bungee; @@ -222,6 +224,20 @@ public class UpstreamBridge extends PacketHandler @Override public void handle(TabCompleteRequest tabComplete) throws Exception { + // Waterfall start - tab limiter + if ( bungee.getConfig().getTabThrottle() > 0 && + ( con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13 + && !bungee.getConfig().isDisableModernTabLimiter())) + { + long now = System.currentTimeMillis(); + if ( lastTabCompletion > 0 && (now - lastTabCompletion) <= bungee.getConfig().getTabThrottle() ) + { + throw CancelSendSignal.INSTANCE; + } + lastTabCompletion = now; + } + + // Waterfall end - tab limiter List suggestions = new ArrayList<>(); boolean isRegisteredCommand = false; boolean isCommand = tabComplete.getCursor().startsWith( "/" ); -- 2.42.1