2017-08-22 15:02:23 +02:00
package net.ME1312.SubServers.Sync ;
2018-10-08 01:25:08 +02:00
import com.dosse.upnp.UPnP ;
2018-07-27 21:36:51 +02:00
import com.google.gson.Gson ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Event.* ;
import net.ME1312.SubServers.Sync.Library.Config.YAMLConfig ;
2018-04-15 03:53:51 +02:00
import net.ME1312.SubServers.Sync.Library.Config.YAMLSection ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Library.Metrics ;
2017-12-08 08:35:50 +01:00
import net.ME1312.SubServers.Sync.Library.NamedContainer ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Library.UniversalFile ;
import net.ME1312.SubServers.Sync.Library.Util ;
import net.ME1312.SubServers.Sync.Library.Version.Version ;
2018-03-21 21:45:59 +01:00
import net.ME1312.SubServers.Sync.Library.Version.VersionType ;
2018-01-05 21:37:23 +01:00
import net.ME1312.SubServers.Sync.Network.Cipher ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Network.Packet.PacketDownloadServerInfo ;
import net.ME1312.SubServers.Sync.Network.SubDataClient ;
import net.ME1312.SubServers.Sync.Server.Server ;
import net.ME1312.SubServers.Sync.Server.SubServer ;
import net.md_5.bungee.BungeeCord ;
2018-10-08 01:25:08 +02:00
import net.md_5.bungee.api.config.ListenerInfo ;
2017-08-22 15:02:23 +02:00
import net.md_5.bungee.api.config.ServerInfo ;
import net.md_5.bungee.api.event.ServerConnectEvent ;
2018-10-04 01:18:16 +02:00
import net.md_5.bungee.api.event.ServerKickEvent ;
2017-08-22 15:02:23 +02:00
import net.md_5.bungee.api.plugin.Listener ;
import net.md_5.bungee.event.EventHandler ;
import org.w3c.dom.Document ;
import org.w3c.dom.Node ;
import org.w3c.dom.NodeList ;
import org.xml.sax.InputSource ;
import javax.xml.parsers.DocumentBuilderFactory ;
import java.io.* ;
import java.lang.reflect.InvocationTargetException ;
import java.net.InetAddress ;
import java.net.InetSocketAddress ;
import java.net.URL ;
import java.nio.charset.Charset ;
import java.nio.file.Files ;
import java.util.* ;
import java.util.concurrent.TimeUnit ;
/ * *
* Main Plugin Class
* /
public final class SubPlugin extends BungeeCord implements Listener {
2018-01-02 23:29:25 +01:00
protected NamedContainer < Long , Map < String , Map < String , String > > > lang = null ;
2017-08-22 15:02:23 +02:00
public final Map < String , Server > servers = new TreeMap < String , Server > ( ) ;
public final PrintStream out ;
public final UniversalFile dir = new UniversalFile ( new File ( System . getProperty ( " user.dir " ) ) ) ;
public YAMLConfig config ;
2017-12-08 08:35:50 +01:00
public boolean redis = false ;
2017-12-10 01:30:06 +01:00
public final SubAPI api = new SubAPI ( this ) ;
2017-08-22 15:02:23 +02:00
public SubDataClient subdata = null ;
2018-10-08 01:25:08 +02:00
public static final Version version = Version . fromString ( " 2.13.1b " ) ;
2017-12-10 01:30:06 +01:00
2018-05-24 20:52:47 +02:00
public final boolean isPatched ;
2017-12-10 01:30:06 +01:00
public long lastReload = - 1 ;
2017-08-22 15:02:23 +02:00
private boolean posted = false ;
2018-05-24 20:52:47 +02:00
protected SubPlugin ( PrintStream out , boolean isPatched ) throws IOException {
this . isPatched = isPatched ;
2018-05-24 04:27:20 +02:00
System . out . println ( " SubServers > Loading SubServers.Sync v " + version . toString ( ) + " Libraries (for Minecraft " + api . getGameVersion ( ) [ api . getGameVersion ( ) . length - 1 ] + " ) " ) ;
2017-08-22 15:02:23 +02:00
this . out = out ;
if ( ! ( new UniversalFile ( dir , " config.yml " ) . exists ( ) ) ) {
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Sync/Library/Files/bungee.yml " , new UniversalFile ( dir , " config.yml " ) . getPath ( ) ) ;
YAMLConfig tmp = new YAMLConfig ( new UniversalFile ( " config.yml " ) ) ;
tmp . get ( ) . set ( " stats " , UUID . randomUUID ( ) . toString ( ) ) ;
tmp . save ( ) ;
System . out . println ( " SubServers > Created ~/config.yml " ) ;
}
UniversalFile dir = new UniversalFile ( this . dir , " SubServers " ) ;
dir . mkdir ( ) ;
if ( ! ( new UniversalFile ( dir , " sync.yml " ) . exists ( ) ) ) {
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Sync/Library/Files/config.yml " , new UniversalFile ( dir , " sync.yml " ) . getPath ( ) ) ;
System . out . println ( " SubServers > Created ~/SubServers/sync.yml " ) ;
2018-04-15 03:53:51 +02:00
} else if ( ( new Version ( ( new YAMLConfig ( new UniversalFile ( dir , " sync.yml " ) ) ) . get ( ) . getSection ( " Settings " ) . getRawString ( " Version " , " 0 " ) ) . compareTo ( new Version ( " 2.11.2a+ " ) ) ) ! = 0 ) {
2017-08-22 15:02:23 +02:00
Files . move ( new UniversalFile ( dir , " sync.yml " ) . toPath ( ) , new UniversalFile ( dir , " config.old " + Math . round ( Math . random ( ) * 100000 ) + " .yml " ) . toPath ( ) ) ;
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Sync/Library/Files/config.yml " , new UniversalFile ( dir , " sync.yml " ) . getPath ( ) ) ;
System . out . println ( " SubServers > Updated ~/SubServers/sync.yml " ) ;
}
config = new YAMLConfig ( new UniversalFile ( dir , " sync.yml " ) ) ;
getPluginManager ( ) . registerListener ( null , this ) ;
System . out . println ( " SubServers > Loading BungeeCord Libraries... " ) ;
}
/ * *
* Load Hosts , Servers , SubServers , and SubData Direct
* /
@Override
public void startListeners ( ) {
try {
2018-01-22 16:01:33 +01:00
redis = getPluginManager ( ) . getPlugin ( " RedisBungee " ) ! = null ;
2017-08-22 15:02:23 +02:00
config . reload ( ) ;
2018-01-05 21:37:23 +01:00
Cipher cipher = null ;
if ( ! config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " , " NONE " ) . equalsIgnoreCase ( " NONE " ) ) {
2018-04-15 03:53:51 +02:00
if ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Password " , " " ) . length ( ) = = 0 ) {
2018-01-05 21:37:23 +01:00
System . out . println ( " SubData > Cannot encrypt connection without a password " ) ;
2018-01-12 22:56:22 +01:00
} else if ( ! SubDataClient . getCiphers ( ) . keySet ( ) . contains ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) . toUpperCase ( ) . replace ( '-' , '_' ) . replace ( ' ' , '_' ) ) ) {
2018-01-05 21:37:23 +01:00
System . out . println ( " SubData > Unknown encryption type: " + config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) ) ;
} else {
cipher = SubDataClient . getCipher ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) ) ;
}
2017-08-22 15:02:23 +02:00
}
2018-04-15 03:53:51 +02:00
subdata = new SubDataClient ( this , config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Name " , null ) ,
2018-01-22 16:01:33 +01:00
InetAddress . getByName ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 0 ] ) ,
Integer . parseInt ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 1 ] ) , cipher ) ;
2017-08-22 15:02:23 +02:00
super . startListeners ( ) ;
2018-10-08 01:25:08 +02:00
if ( UPnP . isUPnPAvailable ( ) ) {
if ( config . get ( ) . getSection ( " Settings " ) . getSection ( " UPnP " , new YAMLSection ( ) ) . getBoolean ( " Forward-Proxy " , true ) ) for ( ListenerInfo listener : getConfig ( ) . getListeners ( ) ) {
UPnP . openPortTCP ( listener . getHost ( ) . getPort ( ) ) ;
}
} else {
getLogger ( ) . warning ( " UPnP is currently unavailable; Ports may not be automatically forwarded on this device " ) ;
}
2017-08-22 15:02:23 +02:00
if ( ! posted ) {
posted = true ;
post ( ) ;
}
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
private void post ( ) {
2017-12-08 08:35:50 +01:00
if ( config . get ( ) . getSection ( " Settings " ) . getBoolean ( " Override-Bungee-Commands " , true ) ) {
2018-01-02 23:29:25 +01:00
getPluginManager ( ) . registerCommand ( null , SubCommand . BungeeServer . newInstance ( this , " server " ) . get ( ) ) ;
2017-12-08 08:35:50 +01:00
getPluginManager ( ) . registerCommand ( null , new SubCommand . BungeeList ( this , " glist " ) ) ;
}
2018-01-02 23:29:25 +01:00
getPluginManager ( ) . registerCommand ( null , SubCommand . newInstance ( this , " subservers " ) . get ( ) ) ;
getPluginManager ( ) . registerCommand ( null , SubCommand . newInstance ( this , " subserver " ) . get ( ) ) ;
getPluginManager ( ) . registerCommand ( null , SubCommand . newInstance ( this , " sub " ) . get ( ) ) ;
2017-08-22 15:02:23 +02:00
2017-12-08 08:35:50 +01:00
new Metrics ( this ) ;
2017-08-22 15:02:23 +02:00
new Timer ( ) . schedule ( new TimerTask ( ) {
2018-07-27 21:36:51 +02:00
@SuppressWarnings ( " unchecked " )
2017-08-22 15:02:23 +02:00
@Override
public void run ( ) {
try {
2018-07-27 21:36:51 +02:00
YAMLSection tags = new YAMLSection ( new Gson ( ) . fromJson ( " { \" tags \" : " + Util . readAll ( new BufferedReader ( new InputStreamReader ( new URL ( " https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags " ) . openStream ( ) , Charset . forName ( " UTF-8 " ) ) ) ) + '}' , Map . class ) ) ;
2018-07-29 20:39:42 +02:00
List < Version > versions = new LinkedList < Version > ( ) ;
2017-08-22 15:02:23 +02:00
Version updversion = version ;
2018-03-14 22:50:15 +01:00
int updcount = 0 ;
2018-07-29 20:39:42 +02:00
for ( YAMLSection tag : tags . getSectionList ( " tags " ) ) versions . add ( Version . fromString ( tag . getString ( " ref " ) . substring ( 10 ) ) ) ;
Collections . sort ( versions ) ;
for ( Version version : versions ) {
2018-07-29 05:02:47 +02:00
if ( version . compareTo ( updversion ) > 0 ) {
2018-07-27 21:36:51 +02:00
updversion = version ;
updcount + + ;
2017-08-22 15:02:23 +02:00
}
}
2018-03-14 22:50:15 +01:00
if ( updcount > 0 ) System . out . println ( " SubServers > SubServers.Sync v " + updversion + " is available. You are " + updcount + " version " + ( ( updcount = = 1 ) ? " " : " s " ) + " behind. " ) ;
2017-08-22 15:02:23 +02:00
} catch ( Exception e ) { }
}
} , 0 , TimeUnit . DAYS . toMillis ( 2 ) ) ;
}
2017-12-08 08:35:50 +01:00
/ * *
* Reference a RedisBungee method via reflection
*
* @param method Method to reference
* @param args Method arguments
* @return Method Response
* /
@SuppressWarnings ( " unchecked " )
2018-06-09 18:19:25 +02:00
public Object redis ( String method , NamedContainer < Class < ? > , ? > . . . args ) throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
2017-12-08 08:35:50 +01:00
if ( redis ) {
Object api = getPluginManager ( ) . getPlugin ( " RedisBungee " ) . getClass ( ) . getMethod ( " getApi " ) . invoke ( null ) ;
Class < ? > [ ] classargs = new Class < ? > [ args . length ] ;
Object [ ] objargs = new Object [ args . length ] ;
for ( int i = 0 ; i < args . length ; i + + ) {
classargs [ i ] = args [ i ] . name ( ) ;
objargs [ i ] = args [ i ] . get ( ) ;
if ( ! classargs [ i ] . isInstance ( objargs [ i ] ) ) throw new ClassCastException ( classargs [ i ] . getCanonicalName ( ) + " != " + objargs [ i ] . getClass ( ) . getCanonicalName ( ) ) ;
}
return api . getClass ( ) . getMethod ( method , classargs ) . invoke ( api , objargs ) ;
} else {
throw new IllegalStateException ( " RedisBungee is not installed " ) ;
}
}
2017-12-07 23:51:06 +01:00
/ * *
* Further override BungeeCord ' s signature when patched into the same jar
*
* @return Software Name
* /
@Override
public String getName ( ) {
2018-08-30 03:55:59 +02:00
return ( isPatched ) ? " SubServers Platform " : super . getName ( ) ;
2017-12-07 23:51:06 +01:00
}
/ * *
2018-05-24 20:52:47 +02:00
* Get the name from BungeeCord ' s original signature ( for determining which fork is being used )
2017-12-07 23:51:06 +01:00
*
2018-05-24 20:52:47 +02:00
* @return BungeeCord Software Name
2017-12-07 23:51:06 +01:00
* /
2018-05-24 20:52:47 +02:00
public String getBungeeName ( ) {
return super . getName ( ) ;
2017-12-07 23:51:06 +01:00
}
2017-08-22 15:02:23 +02:00
/ * *
* Emulate BungeeCord ' s getServers ( )
*
* @return Server Map
* /
@Override
public Map < String , ServerInfo > getServers ( ) {
if ( servers . size ( ) > 0 ) {
2017-12-07 23:51:06 +01:00
HashMap < String , ServerInfo > servers = new HashMap < String , ServerInfo > ( ) ;
for ( ServerInfo server : this . servers . values ( ) ) servers . put ( server . getName ( ) , server ) ;
return servers ;
2017-08-22 15:02:23 +02:00
} else {
return super . getServers ( ) ;
}
}
/ * *
* Reset all changes made by startListeners
*
* @see SubPlugin # startListeners ( )
* /
@Override
public void stopListeners ( ) {
try {
System . out . println ( " SubServers > Resetting Server Data " ) ;
servers . clear ( ) ;
subdata . destroy ( 0 ) ;
2018-10-08 01:25:08 +02:00
for ( ListenerInfo listener : getConfig ( ) . getListeners ( ) ) {
if ( UPnP . isUPnPAvailable ( ) & & UPnP . isMappedTCP ( listener . getHost ( ) . getPort ( ) ) ) UPnP . closePortTCP ( listener . getHost ( ) . getPort ( ) ) ;
}
2017-08-22 15:02:23 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
super . stopListeners ( ) ;
}
@EventHandler ( priority = Byte . MAX_VALUE )
public void reroute ( ServerConnectEvent e ) {
2018-07-01 05:46:58 +02:00
Map < String , ServerInfo > servers = new TreeMap < String , ServerInfo > ( this . servers ) ;
2017-08-22 15:02:23 +02:00
if ( servers . keySet ( ) . contains ( e . getTarget ( ) . getName ( ) . toLowerCase ( ) ) & & e . getTarget ( ) ! = servers . get ( e . getTarget ( ) . getName ( ) . toLowerCase ( ) ) ) {
e . setTarget ( servers . get ( e . getTarget ( ) . getName ( ) . toLowerCase ( ) ) ) ;
} else {
servers = getServers ( ) ;
if ( servers . keySet ( ) . contains ( e . getTarget ( ) . getName ( ) ) & & e . getTarget ( ) ! = servers . get ( e . getTarget ( ) . getName ( ) ) ) {
e . setTarget ( servers . get ( e . getTarget ( ) . getName ( ) ) ) ;
}
}
}
2018-10-04 01:18:16 +02:00
@SuppressWarnings ( " deprecation " )
2018-10-08 01:25:08 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
2018-10-04 01:18:16 +02:00
public void fallback ( ServerKickEvent e ) {
if ( e . getPlayer ( ) . getPendingConnection ( ) . getListener ( ) . isForceDefault ( ) ) {
int i = 0 ;
ServerInfo from = e . getKickedFrom ( ) ;
ServerInfo to = null ;
while ( to = = null | | from = = to ) {
if ( e . getPlayer ( ) . getPendingConnection ( ) . getListener ( ) . getServerPriority ( ) . size ( ) > i ) {
to = getServerInfo ( e . getPlayer ( ) . getPendingConnection ( ) . getListener ( ) . getServerPriority ( ) . get ( i ) ) ;
} else break ;
i + + ;
}
if ( to ! = null & & from ! = to ) {
e . setCancelServer ( to ) ;
e . setCancelled ( true ) ;
e . getPlayer ( ) . sendMessage ( api . getLang ( " SubServers " , " Bungee.Feature.Return " ) . replace ( " $str$ " , ( to instanceof Server ) ? ( ( Server ) to ) . getDisplayName ( ) : to . getName ( ) ) . replace ( " $msg$ " , e . getKickReason ( ) ) ) ;
}
}
}
2017-08-22 15:02:23 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
public void add ( SubAddServerEvent e ) {
2018-08-09 20:54:56 +02:00
api . getServer ( e . getServer ( ) , server - > {
if ( server ! = null ) {
if ( server instanceof net . ME1312 . SubServers . Sync . Network . API . SubServer ) {
servers . put ( server . getName ( ) . toLowerCase ( ) , new SubServer ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) , ( ( net . ME1312 . SubServers . Sync . Network . API . SubServer ) server ) . isRunning ( ) ) ) ;
2017-08-22 15:02:23 +02:00
System . out . println ( " SubServers > Added SubServer: " + e . getServer ( ) ) ;
2018-08-09 20:54:56 +02:00
} else {
servers . put ( server . getName ( ) . toLowerCase ( ) , new Server ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) ) ) ;
2017-08-22 15:02:23 +02:00
System . out . println ( " SubServers > Added Server: " + e . getServer ( ) ) ;
2018-08-09 20:54:56 +02:00
}
} else System . out . println ( " PacketDownloadServerInfo( " + e . getServer ( ) + " ) returned with an invalid response " ) ;
} ) ;
2017-08-22 15:02:23 +02:00
}
@EventHandler ( priority = Byte . MIN_VALUE )
public void start ( SubStartEvent e ) {
if ( servers . keySet ( ) . contains ( e . getServer ( ) . toLowerCase ( ) ) & & servers . get ( e . getServer ( ) . toLowerCase ( ) ) instanceof SubServer )
( ( SubServer ) servers . get ( e . getServer ( ) . toLowerCase ( ) ) ) . setRunning ( true ) ;
}
2018-08-09 20:54:56 +02:00
public Boolean merge ( net . ME1312 . SubServers . Sync . Network . API . Server server ) {
Server current = servers . get ( server . getName ( ) . toLowerCase ( ) ) ;
if ( current = = null | | server instanceof net . ME1312 . SubServers . Sync . Network . API . SubServer | | ! ( current instanceof SubServer ) ) {
if ( current = = null | | ! current . getSignature ( ) . equals ( server . getSignature ( ) ) ) {
if ( server instanceof net . ME1312 . SubServers . Sync . Network . API . SubServer ) {
servers . put ( server . getName ( ) . toLowerCase ( ) , new SubServer ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) , ( ( net . ME1312 . SubServers . Sync . Network . API . SubServer ) server ) . isRunning ( ) ) ) ;
2017-12-10 01:30:06 +01:00
} else {
2018-08-09 20:54:56 +02:00
servers . put ( server . getName ( ) . toLowerCase ( ) , new Server ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) ) ) ;
2017-12-10 01:30:06 +01:00
}
2018-08-09 20:54:56 +02:00
System . out . println ( " SubServers > Added " + ( ( server instanceof net . ME1312 . SubServers . Sync . Network . API . SubServer ) ? " Sub " : " " ) + " Server: " + server . getName ( ) ) ;
2017-12-10 01:30:06 +01:00
return true ;
} else {
2018-08-09 20:54:56 +02:00
if ( server instanceof net . ME1312 . SubServers . Sync . Network . API . SubServer ) {
if ( ( ( net . ME1312 . SubServers . Sync . Network . API . SubServer ) server ) . isRunning ( ) ! = ( ( SubServer ) current ) . isRunning ( ) )
( ( SubServer ) current ) . setRunning ( ( ( net . ME1312 . SubServers . Sync . Network . API . SubServer ) server ) . isRunning ( ) ) ;
2017-12-10 01:30:06 +01:00
}
2018-08-09 20:54:56 +02:00
if ( ! server . getMotd ( ) . equals ( current . getMotd ( ) ) )
current . setMotd ( server . getMotd ( ) ) ;
if ( server . isHidden ( ) ! = current . isHidden ( ) )
current . setHidden ( server . isHidden ( ) ) ;
if ( server . isRestricted ( ) ! = current . isRestricted ( ) )
current . setRestricted ( server . isRestricted ( ) ) ;
if ( ! server . getDisplayName ( ) . equals ( current . getDisplayName ( ) ) )
current . setDisplayName ( server . getDisplayName ( ) ) ;
2017-12-10 01:30:06 +01:00
2018-08-09 20:54:56 +02:00
System . out . println ( " SubServers > Re-added " + ( ( server instanceof net . ME1312 . SubServers . Sync . Network . API . SubServer ) ? " Sub " : " " ) + " Server: " + server . getName ( ) ) ;
2017-12-10 01:30:06 +01:00
return false ;
}
}
return null ;
}
2017-08-22 15:02:23 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
public void edit ( SubEditServerEvent e ) {
if ( servers . keySet ( ) . contains ( e . getServer ( ) . toLowerCase ( ) ) ) {
Server server = servers . get ( e . getServer ( ) . toLowerCase ( ) ) ;
switch ( e . getEdit ( ) . name ( ) . toLowerCase ( ) ) {
case " display " :
server . setDisplayName ( e . getEdit ( ) . get ( ) . asString ( ) ) ;
break ;
case " motd " :
server . setMotd ( e . getEdit ( ) . get ( ) . asColoredString ( '&' ) ) ;
break ;
case " restricted " :
server . setRestricted ( e . getEdit ( ) . get ( ) . asBoolean ( ) ) ;
break ;
case " hidden " :
server . setHidden ( e . getEdit ( ) . get ( ) . asBoolean ( ) ) ;
break ;
}
}
}
@EventHandler ( priority = Byte . MIN_VALUE )
public void stop ( SubStoppedEvent e ) {
if ( servers . keySet ( ) . contains ( e . getServer ( ) . toLowerCase ( ) ) & & servers . get ( e . getServer ( ) . toLowerCase ( ) ) instanceof SubServer )
( ( SubServer ) servers . get ( e . getServer ( ) . toLowerCase ( ) ) ) . setRunning ( false ) ;
}
@EventHandler ( priority = Byte . MIN_VALUE )
public void remove ( SubRemoveServerEvent e ) {
if ( servers . keySet ( ) . contains ( e . getServer ( ) . toLowerCase ( ) ) )
servers . remove ( e . getServer ( ) . toLowerCase ( ) ) ;
System . out . println ( " SubServers > Removed Server: " + e . getServer ( ) ) ;
}
}