diff --git a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java index 162136c6..bab9d727 100644 --- a/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java +++ b/api/src/main/java/net/md_5/bungee/api/config/ListenerInfo.java @@ -1,8 +1,11 @@ package net.md_5.bungee.api.config; import java.net.InetSocketAddress; +import java.util.List; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; +import lombok.Getter; /** * Class representing the configuration of a server listener. Used for allowing @@ -29,14 +32,10 @@ public class ListenerInfo */ private final int tabListSize; /** - * Name of the server which users will be taken to by default. + * List of servers in order of join attempt. First attempt is the first + * element, second attempt is the next element, etc etc. */ - private final String defaultServer; - /** - * Name of the server which users will be taken when current server goes - * down. - */ - private final String fallbackServer; + private final List serverPriority; /** * Whether reconnect locations will be used, or else the user is simply * transferred to the default server on connect. @@ -68,4 +67,29 @@ public class ListenerInfo * Whether to enable udp query. */ private final boolean queryEnabled; + + /** + * Gets the highest priority server to join. + * + * @return default server + * @deprecated replaced by {@link #serverPriority} + */ + @Deprecated + public String getDefaultServer() + { + return serverPriority.get( 0 ); + } + + /** + * Gets the second highest priority server to join, or else the highest + * priority. + * + * @return fallback server + * @deprecated replaced by {@link #serverPriority} + */ + @Deprecated + public String getFallbackServer() + { + return ( serverPriority.size() > 1 ) ? serverPriority.get( 1 ) : getDefaultServer(); + } } diff --git a/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java index 283cf395..c7547c7f 100644 --- a/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java +++ b/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java @@ -7,12 +7,14 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.logging.Level; import lombok.RequiredArgsConstructor; @@ -126,6 +128,34 @@ public class YamlConfig implements ConfigurationAdapter } } + @SuppressWarnings("unchecked") + private void set(String path, Object val, Map submap) + { + int index = path.indexOf( '.' ); + if ( index == -1 ) + { + if ( val == null ) + { + submap.remove( path ); + } else + { + submap.put( path, val ); + } + save(); + } else + { + String first = path.substring( 0, index ); + String second = path.substring( index + 1, path.length() ); + Map sub = (Map) submap.get( first ); + if ( sub == null ) + { + sub = new LinkedHashMap(); + submap.put( first, sub ); + } + set( second, val, sub ); + } + } + private void save() { try @@ -200,8 +230,6 @@ public class YamlConfig implements ConfigurationAdapter motd = ChatColor.translateAlternateColorCodes( '&', motd ); int maxPlayers = get( "max_players", 1, val ); - String defaultServer = get( "default_server", "lobby", val ); - String fallbackServer = get( "fallback_server", defaultServer, val ); boolean forceDefault = get( "force_default_server", false, val ); String host = get( "host", "0.0.0.0:25577", val ); int tabListSize = get( "tab_size", 60, val ); @@ -219,7 +247,31 @@ public class YamlConfig implements ConfigurationAdapter boolean query = get( "query_enabled", false, val ); int queryPort = get( "query_port", 25577, val ); - ListenerInfo info = new ListenerInfo( address, motd, maxPlayers, tabListSize, defaultServer, fallbackServer, forceDefault, forced, value.toString(), setLocalAddress, pingPassthrough, queryPort, query ); + List serverPriority = new ArrayList<>( get( "priorities", Collections.EMPTY_LIST, val ) ); + + // Default server list migration + // TODO: Remove from submap + String defaultServer = get( "default_server", null, val ); + String fallbackServer = get( "fallback_server", null, val ); + if ( defaultServer != null ) + { + serverPriority.add( defaultServer ); + set( "default_server", null, val ); + } + if ( fallbackServer != null ) + { + serverPriority.add( fallbackServer ); + set( "fallback_server", null, val ); + } + + // Add defaults if required + if ( serverPriority.isEmpty() ) + { + serverPriority.add( "lobby" ); + } + set( "priorities", serverPriority, val ); + + ListenerInfo info = new ListenerInfo( address, motd, maxPlayers, tabListSize, serverPriority, forceDefault, forced, value.toString(), setLocalAddress, pingPassthrough, queryPort, query ); ret.add( info ); }