mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-10-03 00:47:27 +02:00
cca83dfaf6
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing BungeeCord Changes: a3ab2bf5 Update checkstyle adee7bd2 Source jar does not need to fork build 7bd8a027 Always print remote IP in InitialHandler 0cf27a09 Update scriptus bf673c5d Add pretty colours to console log levels 2235a323 Optimize ColouredWriter slightly 1dee0490 Don't send/construct redundant kick messages e9ba95b9 Don't log full CorruptedFrameException d3bd7852 #2762: Work correctly with disabled timeout 3ce4132c Switch keepalive queue to ArrayDeque ce2dcaf7 #2763: Fix .DS_Store entry in .gitignore cf72c3a7 Show slow event times in milliseconds cd7a3ab2 #2758: Improve server list ping response where remote ping failed 0a4b9b49 #2752: Configurable connect and ping timeouts
316 lines
11 KiB
Diff
316 lines
11 KiB
Diff
From 221084c6a92729adb87f71dfe381799a78852869 Mon Sep 17 00:00:00 2001
|
|
From: Troy Frew <fuzzy_bot@arenaga.me>
|
|
Date: Wed, 29 Jun 2016 04:29:25 +0200
|
|
Subject: [PATCH] Add dynamic server addition/removal api.
|
|
|
|
The provided methods will not move a player if a server is removed or the server ip/port is changed, however the methods return the old ServerInfo object for you to handle that yourself if needed.
|
|
|
|
Thanks to Overcast for the idea
|
|
|
|
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 b6845bc4..edbae4ea 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
|
|
@@ -37,11 +37,95 @@ public interface ProxyConfig
|
|
|
|
/**
|
|
* Set of all servers.
|
|
- *
|
|
* @return servers
|
|
+ * @deprecated The returned map may be modified concurrently by the proxy.
|
|
+ * The safe alternative is {@link #getServersCopy()}.
|
|
*/
|
|
+ @Deprecated // Waterfall
|
|
Map<String, ServerInfo> getServers();
|
|
|
|
+ // Waterfall start - Dynamic server addition/removal api
|
|
+ /**
|
|
+ * Return all servers registered to this proxy, keyed by name. The returned map
|
|
+ * is an immutable snapshot of the actual server collection. It cannot be modified,
|
|
+ * and it will not change.
|
|
+ *
|
|
+ * @return all registered remote server destinations
|
|
+ */
|
|
+ Map<String, ServerInfo> getServersCopy();
|
|
+
|
|
+ /**
|
|
+ * Gets the server info of a server.
|
|
+ *
|
|
+ * @param name the name of the configured server
|
|
+ * @return the server info belonging to the specified server
|
|
+ */
|
|
+ ServerInfo getServerInfo(String name);
|
|
+
|
|
+ /**
|
|
+ * Register the given server to the proxy.
|
|
+ * Any currently registered server with the same name will be replaced.
|
|
+ * This change is not saved to config.yml
|
|
+ *
|
|
+ * @param server The server to register with the proxy
|
|
+ *
|
|
+ * @return the previously registered server with the same name, or null if there was no such server.
|
|
+ */
|
|
+ ServerInfo addServer(ServerInfo server);
|
|
+
|
|
+ /**
|
|
+ * Register all of the given servers to the proxy.
|
|
+ * This change is not saved to config.yml
|
|
+ *
|
|
+ * @param servers The collection of servers to register with the proxy
|
|
+ *
|
|
+ * @return true if any servers were added or replaced.
|
|
+ */
|
|
+ boolean addServers(Collection<ServerInfo> servers);
|
|
+
|
|
+ /**
|
|
+ * Un-register the server with the given name from the proxy.
|
|
+ * This change is not saved to config.yml
|
|
+ *
|
|
+ * @param name The name of the server to unregister
|
|
+ *
|
|
+ * @return the server that was removed, or null if there is no server with the given name.
|
|
+ */
|
|
+ ServerInfo removeServerNamed(String name);
|
|
+
|
|
+ /**
|
|
+ * Un-register the given server from the proxy.
|
|
+ * The server is matched by name only, other fields in the given {@link ServerInfo} are ignored.
|
|
+ * This change is not saved to config.yml
|
|
+ *
|
|
+ * @param server the server to unregister from the proxy
|
|
+ *
|
|
+ * @return the server that was removed, or null if there is no server with a matching name.
|
|
+ */
|
|
+ ServerInfo removeServer(ServerInfo server);
|
|
+
|
|
+ /**
|
|
+ * Un-register servers with any of the given names from the proxy.
|
|
+ * This change is not saved to config.yml
|
|
+ *
|
|
+ * @param names a collection of server names to be unregistered
|
|
+ *
|
|
+ * @return true if any servers were removed.
|
|
+ */
|
|
+ boolean removeServersNamed(Collection<String> names);
|
|
+
|
|
+ /**
|
|
+ * Un-register all of the given servers from the proxy.
|
|
+ * The servers are matched by name only, other fields in the given {@link ServerInfo} are ignored.
|
|
+ * This change is not saved to config.yml
|
|
+ *
|
|
+ * @param servers a collection of servers to be unregistered
|
|
+ *
|
|
+ * @return true if any servers were removed.
|
|
+ */
|
|
+ boolean removeServers(Collection<ServerInfo> servers);
|
|
+ // Waterfall end
|
|
+
|
|
/**
|
|
* Does the server authenticate with Mojang.
|
|
*
|
|
diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java
|
|
index 1f330bd2..a4011335 100644
|
|
--- a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java
|
|
+++ b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java
|
|
@@ -96,9 +96,25 @@ public abstract class ProxyServer
|
|
* return a fresh map each time.
|
|
*
|
|
* @return all registered remote server destinations
|
|
+ *
|
|
+ * @deprecated The returned map is part of the proxy's internal state,
|
|
+ * and may be modified concurrently by the proxy.
|
|
+ * The safe alternative is {@link #getServersCopy()}.
|
|
*/
|
|
+ @Deprecated // Waterfall
|
|
public abstract Map<String, ServerInfo> getServers();
|
|
|
|
+ // Waterfall begin - Cloned servers map
|
|
+ /**
|
|
+ * Return all servers registered to this proxy, keyed by name. The returned map
|
|
+ * is an immutable snapshot of the actual server collection. It cannot be modified,
|
|
+ * and it will not change.
|
|
+ *
|
|
+ * @return all registered remote server destinations
|
|
+ */
|
|
+ public abstract Map<String, ServerInfo> getServersCopy();
|
|
+ // Waterfall end
|
|
+
|
|
/**
|
|
* Gets the server info of a server.
|
|
*
|
|
diff --git a/config/src/main/java/net/md_5/bungee/config/Configuration.java b/config/src/main/java/net/md_5/bungee/config/Configuration.java
|
|
index 262b29c8..d7ed3e11 100644
|
|
--- a/config/src/main/java/net/md_5/bungee/config/Configuration.java
|
|
+++ b/config/src/main/java/net/md_5/bungee/config/Configuration.java
|
|
@@ -44,6 +44,13 @@ public final class Configuration
|
|
}
|
|
}
|
|
|
|
+ // Waterfall start - Allow configuration objects to be cloned
|
|
+ public Configuration(Configuration values, Configuration defaults)
|
|
+ {
|
|
+ this( values.self, defaults );
|
|
+ }
|
|
+ // Waterfall end
|
|
+
|
|
private Configuration getSectionFor(String path)
|
|
{
|
|
int index = path.indexOf( SEPARATOR );
|
|
diff --git a/module/cmd-server/src/main/java/net/md_5/bungee/module/cmd/server/CommandServer.java b/module/cmd-server/src/main/java/net/md_5/bungee/module/cmd/server/CommandServer.java
|
|
index 59c104d3..698b420f 100644
|
|
--- a/module/cmd-server/src/main/java/net/md_5/bungee/module/cmd/server/CommandServer.java
|
|
+++ b/module/cmd-server/src/main/java/net/md_5/bungee/module/cmd/server/CommandServer.java
|
|
@@ -83,7 +83,7 @@ public class CommandServer extends Command implements TabExecutor
|
|
@Override
|
|
public Iterable<String> onTabComplete(final CommandSender sender, final String[] args)
|
|
{
|
|
- return ( args.length > 1 ) ? Collections.EMPTY_LIST : Iterables.transform( Iterables.filter( ProxyServer.getInstance().getServers().values(), new Predicate<ServerInfo>()
|
|
+ return ( args.length > 1 ) ? Collections.EMPTY_LIST : Iterables.transform( Iterables.filter( ProxyServer.getInstance().getServersCopy().values(), new Predicate<ServerInfo>() // Waterfall: use #getServersCopy()
|
|
{
|
|
private final String lower = ( args.length == 0 ) ? "" : args[0].toLowerCase( Locale.ROOT );
|
|
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
index b18027e2..d572ff28 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
@@ -599,10 +599,18 @@ public class BungeeCord extends ProxyServer
|
|
return config.getServers();
|
|
}
|
|
|
|
+ // Waterfall start
|
|
+ @Override
|
|
+ public Map<String, ServerInfo> getServersCopy()
|
|
+ {
|
|
+ return config.getServersCopy();
|
|
+ }
|
|
+ // Waterfall end
|
|
+
|
|
@Override
|
|
public ServerInfo getServerInfo(String name)
|
|
{
|
|
- return getServers().get( name );
|
|
+ return config.getServerInfo( name ); // Waterfall
|
|
}
|
|
|
|
@Override
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java b/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java
|
|
index d640313a..115f614e 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java
|
|
@@ -1,6 +1,7 @@
|
|
package net.md_5.bungee.conf;
|
|
|
|
import com.google.common.base.Preconditions;
|
|
+import com.google.common.collect.ImmutableMap; // Waterfall
|
|
import gnu.trove.map.TMap;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
@@ -11,6 +12,7 @@ import java.util.UUID;
|
|
import java.util.logging.Level;
|
|
import javax.imageio.ImageIO;
|
|
import lombok.Getter;
|
|
+import lombok.Synchronized; // Waterfall
|
|
|
|
import net.md_5.bungee.BungeeCord;
|
|
import net.md_5.bungee.api.Favicon;
|
|
@@ -42,6 +44,7 @@ public abstract class Configuration implements ProxyConfig
|
|
* Set of all listeners.
|
|
*/
|
|
private Collection<ListenerInfo> listeners;
|
|
+ private final Object serversLock = new Object(); // Waterfall
|
|
/**
|
|
* Set of all servers.
|
|
*/
|
|
@@ -68,6 +71,7 @@ public abstract class Configuration implements ProxyConfig
|
|
private boolean preventProxyConnections;
|
|
private boolean forgeSupport;
|
|
|
|
+ @Synchronized("serversLock") // Waterfall
|
|
public void load()
|
|
{
|
|
ConfigurationAdapter adapter = ProxyServer.getInstance().getConfigurationAdapter();
|
|
@@ -114,7 +118,7 @@ public abstract class Configuration implements ProxyConfig
|
|
servers = new CaseInsensitiveMap<>( newServers );
|
|
} else
|
|
{
|
|
- Map<String, ServerInfo> oldServers = this.servers;
|
|
+ Map<String, ServerInfo> oldServers = getServersCopy();
|
|
|
|
for ( ServerInfo oldServer : oldServers.values() )
|
|
{
|
|
@@ -177,4 +181,71 @@ public abstract class Configuration implements ProxyConfig
|
|
{
|
|
return favicon;
|
|
}
|
|
+
|
|
+ // Waterfall start
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public Map<String, ServerInfo> getServersCopy() {
|
|
+ return ImmutableMap.copyOf( servers );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public ServerInfo getServerInfo(String name)
|
|
+ {
|
|
+ return this.servers.get( name );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public ServerInfo addServer(ServerInfo server)
|
|
+ {
|
|
+ return this.servers.put( server.getName(), server );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public boolean addServers(Collection<ServerInfo> servers)
|
|
+ {
|
|
+ boolean changed = false;
|
|
+ for ( ServerInfo server : servers )
|
|
+ {
|
|
+ if ( server != this.servers.put( server.getName(), server ) ) changed = true;
|
|
+ }
|
|
+ return changed;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public ServerInfo removeServerNamed(String name)
|
|
+ {
|
|
+ return this.servers.remove( name );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public ServerInfo removeServer(ServerInfo server)
|
|
+ {
|
|
+ return this.servers.remove( server.getName() );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public boolean removeServersNamed(Collection<String> names)
|
|
+ {
|
|
+ return this.servers.keySet().removeAll( names );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @Synchronized("serversLock")
|
|
+ public boolean removeServers(Collection<ServerInfo> servers)
|
|
+ {
|
|
+ boolean changed = false;
|
|
+ for ( ServerInfo server : servers )
|
|
+ {
|
|
+ if ( null != this.servers.remove( server.getName() ) ) changed = true;
|
|
+ }
|
|
+ return changed;
|
|
+ }
|
|
+ // Waterfall end
|
|
}
|
|
--
|
|
2.25.0
|
|
|