2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee ;
2018-04-15 03:53:51 +02:00
import com.google.gson.Gson ;
2017-08-15 11:58:48 +02:00
import net.ME1312.SubServers.Bungee.Event.SubStoppedEvent ;
2017-11-22 22:58:33 +01:00
import net.ME1312.SubServers.Bungee.Host.* ;
import net.ME1312.SubServers.Bungee.Library.* ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Library.Config.YAMLConfig ;
2017-12-09 09:43:29 +01:00
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException ;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException ;
import net.ME1312.SubServers.Bungee.Library.Version.Version ;
2018-03-21 21:45:59 +01:00
import net.ME1312.SubServers.Bungee.Library.Version.VersionType ;
2018-01-05 21:37:23 +01:00
import net.ME1312.SubServers.Bungee.Network.Cipher ;
2017-12-14 01:04:58 +01:00
import net.ME1312.SubServers.Bungee.Network.ClientHandler ;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutReload ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Network.SubDataServer ;
2016-12-05 04:21:04 +01:00
import net.md_5.bungee.BungeeCord ;
2017-04-16 19:02:14 +02:00
import net.md_5.bungee.BungeeServerInfo ;
2016-12-05 04:21:04 +01:00
import net.md_5.bungee.api.config.ServerInfo ;
2017-08-18 11:58:06 +02:00
import net.md_5.bungee.api.event.ServerConnectEvent ;
2017-08-15 11:58:48 +02:00
import net.md_5.bungee.api.plugin.Listener ;
import net.md_5.bungee.event.EventHandler ;
2017-08-18 11:58:06 +02:00
import org.w3c.dom.Document ;
import org.w3c.dom.Node ;
import org.w3c.dom.NodeList ;
import org.xml.sax.InputSource ;
2016-12-05 04:21:04 +01:00
2017-08-18 11:58:06 +02:00
import javax.xml.parsers.DocumentBuilderFactory ;
2016-12-05 04:21:04 +01:00
import java.io.* ;
2017-01-30 21:22:36 +01:00
import java.lang.reflect.InvocationTargetException ;
2017-12-10 01:30:06 +01:00
import java.math.BigInteger ;
2016-12-05 04:21:04 +01:00
import java.net.InetAddress ;
2017-04-16 19:02:14 +02:00
import java.net.InetSocketAddress ;
2016-12-24 05:55:17 +01:00
import java.net.SocketException ;
2017-08-18 11:58:06 +02:00
import java.net.URL ;
import java.nio.charset.Charset ;
2016-12-05 04:21:04 +01:00
import java.nio.file.Files ;
2017-05-30 21:38:51 +02:00
import java.text.DecimalFormat ;
2016-12-05 04:21:04 +01:00
import java.util.* ;
2017-01-01 20:34:46 +01:00
import java.util.concurrent.TimeUnit ;
2016-12-05 04:21:04 +01:00
/ * *
* Main Plugin Class
* /
2017-08-15 11:58:48 +02:00
public final class SubPlugin extends BungeeCord implements Listener {
2018-01-02 23:29:25 +01:00
protected final LinkedHashMap < String , LinkedHashMap < String , String > > lang = new LinkedHashMap < String , LinkedHashMap < String , String > > ( ) ;
2016-12-05 04:21:04 +01:00
protected final HashMap < String , Class < ? extends Host > > hostDrivers = new HashMap < String , Class < ? extends Host > > ( ) ;
2018-01-22 16:01:33 +01:00
public final HashMap < String , Proxy > proxies = new HashMap < String , Proxy > ( ) ;
2016-12-05 04:21:04 +01:00
public final HashMap < String , Host > hosts = new HashMap < String , Host > ( ) ;
2017-04-16 19:02:14 +02:00
public final HashMap < String , Server > exServers = new HashMap < String , Server > ( ) ;
private final HashMap < String , ServerInfo > legServers = new HashMap < String , ServerInfo > ( ) ;
2016-12-05 04:21:04 +01:00
2017-01-08 03:30:03 +01:00
public final PrintStream out ;
2016-12-15 22:04:39 +01:00
public final UniversalFile dir = new UniversalFile ( new File ( System . getProperty ( " user.dir " ) ) ) ;
2016-12-05 04:21:04 +01:00
public YAMLConfig config ;
2018-01-02 23:29:25 +01:00
private YAMLConfig bungeeconfig ;
public YAMLConfig langconfig ;
2017-12-09 09:43:29 +01:00
public final SubAPI api = new SubAPI ( this ) ;
2016-12-15 22:04:39 +01:00
public SubDataServer subdata = null ;
2017-08-15 11:58:48 +02:00
public SubServer sudo = null ;
2018-06-09 18:19:25 +02:00
//public static final Version version = Version.fromString("2.13a/pr4");
public static final Version version = new Version ( Version . fromString ( " 2.13a/pr4 " ) , VersionType . SNAPSHOT , ( SubPlugin . class . getPackage ( ) . getSpecificationTitle ( ) = = null ) ? " ? " : SubPlugin . class . getPackage ( ) . getSpecificationTitle ( ) ) ; // TODO Snapshot Version
2016-12-05 04:21:04 +01:00
2017-12-09 09:43:29 +01:00
public boolean redis = false ;
2018-05-24 07:05:54 +02:00
public boolean canSudo = true ;
2018-05-24 20:52:47 +02:00
public final boolean isPatched ;
2017-12-10 01:30:06 +01:00
public long resetDate = 0 ;
2017-04-16 19:02:14 +02:00
private boolean running = false ;
2017-08-18 11:58:06 +02:00
private boolean posted = false ;
2018-01-21 21:45:27 +01:00
private static BigInteger lastSignature = BigInteger . valueOf ( - 1 ) ;
2016-12-05 04:21:04 +01:00
2017-12-15 01:50:39 +01:00
@SuppressWarnings ( " unchecked " )
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.Bungee v " + version . toString ( ) + " Libraries (for Minecraft " + api . getGameVersion ( ) [ api . getGameVersion ( ) . length - 1 ] + " ) " ) ;
2017-01-08 03:30:03 +01:00
2017-01-30 21:22:36 +01:00
this . out = out ;
2016-12-24 05:55:17 +01:00
if ( ! ( new UniversalFile ( dir , " config.yml " ) . exists ( ) ) ) {
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/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 " ) ;
}
2017-12-09 09:43:29 +01:00
bungeeconfig = new YAMLConfig ( new UniversalFile ( dir , " config.yml " ) ) ;
2016-12-05 04:21:04 +01:00
UniversalFile dir = new UniversalFile ( this . dir , " SubServers " ) ;
dir . mkdir ( ) ;
if ( ! ( new UniversalFile ( dir , " config.yml " ) . exists ( ) ) ) {
2016-12-24 05:55:17 +01:00
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/Library/Files/config.yml " , new UniversalFile ( dir , " config.yml " ) . getPath ( ) ) ;
2016-12-05 04:21:04 +01:00
System . out . println ( " SubServers > Created ~/SubServers/config.yml " ) ;
2016-12-24 05:55:17 +01:00
} else if ( ( new Version ( ( new YAMLConfig ( new UniversalFile ( dir , " config.yml " ) ) ) . get ( ) . getSection ( " Settings " ) . getString ( " Version " , " 0 " ) ) . compareTo ( new Version ( " 2.11.2a+ " ) ) ) ! = 0 ) {
2016-12-05 04:21:04 +01:00
Files . move ( new UniversalFile ( dir , " config.yml " ) . toPath ( ) , new UniversalFile ( dir , " config.old " + Math . round ( Math . random ( ) * 100000 ) + " .yml " ) . toPath ( ) ) ;
2016-12-24 05:55:17 +01:00
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/Library/Files/config.yml " , new UniversalFile ( dir , " config.yml " ) . getPath ( ) ) ;
2016-12-05 04:21:04 +01:00
System . out . println ( " SubServers > Updated ~/SubServers/config.yml " ) ;
}
2017-04-16 19:02:14 +02:00
config = new YAMLConfig ( new UniversalFile ( dir , " config.yml " ) ) ;
2016-12-05 04:21:04 +01:00
if ( ! ( new UniversalFile ( dir , " lang.yml " ) . exists ( ) ) ) {
2016-12-24 05:55:17 +01:00
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/Library/Files/lang.yml " , new UniversalFile ( dir , " lang.yml " ) . getPath ( ) ) ;
2016-12-05 04:21:04 +01:00
System . out . println ( " SubServers > Created ~/SubServers/lang.yml " ) ;
2017-12-13 18:29:50 +01:00
} else if ( ( new Version ( ( new YAMLConfig ( new UniversalFile ( dir , " lang.yml " ) ) ) . get ( ) . getString ( " Version " , " 0 " ) ) . compareTo ( new Version ( " 2.13a+ " ) ) ) ! = 0 ) {
2016-12-05 04:21:04 +01:00
Files . move ( new UniversalFile ( dir , " lang.yml " ) . toPath ( ) , new UniversalFile ( dir , " lang.old " + Math . round ( Math . random ( ) * 100000 ) + " .yml " ) . toPath ( ) ) ;
2016-12-24 05:55:17 +01:00
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/Library/Files/lang.yml " , new UniversalFile ( dir , " lang.yml " ) . getPath ( ) ) ;
2016-12-05 04:21:04 +01:00
System . out . println ( " SubServers > Updated ~/SubServers/lang.yml " ) ;
}
2018-01-02 23:29:25 +01:00
langconfig = new YAMLConfig ( new UniversalFile ( dir , " lang.yml " ) ) ;
2016-12-05 04:21:04 +01:00
2017-07-30 02:41:02 +02:00
if ( ! ( new UniversalFile ( dir , " Templates " ) . exists ( ) ) ) {
new UniversalFile ( dir , " Templates " ) . mkdirs ( ) ;
2017-07-23 06:32:57 +02:00
Util . unzip ( SubPlugin . class . getResourceAsStream ( " /net/ME1312/SubServers/Bungee/Library/Files/Templates/vanilla.zip " ) , new UniversalFile ( dir , " Templates " ) ) ;
2017-05-29 07:00:02 +02:00
System . out . println ( " SubServers > Created ~/SubServers/Templates/Vanilla " ) ;
2017-07-30 02:41:02 +02:00
2017-07-23 06:32:57 +02:00
Util . unzip ( SubPlugin . class . getResourceAsStream ( " /net/ME1312/SubServers/Bungee/Library/Files/Templates/spigot.zip " ) , new UniversalFile ( dir , " Templates " ) ) ;
2017-05-29 07:00:02 +02:00
System . out . println ( " SubServers > Created ~/SubServers/Templates/Spigot " ) ;
2017-07-30 02:41:02 +02:00
2017-07-23 06:32:57 +02:00
Util . unzip ( SubPlugin . class . getResourceAsStream ( " /net/ME1312/SubServers/Bungee/Library/Files/Templates/sponge.zip " ) , new UniversalFile ( dir , " Templates " ) ) ;
2017-05-29 07:00:02 +02:00
System . out . println ( " SubServers > Created ~/SubServers/Templates/Sponge " ) ;
2017-07-30 02:41:02 +02:00
} else {
2018-06-20 03:24:16 +02:00
if ( new UniversalFile ( dir , " Templates:Vanilla:template.yml " ) . exists ( ) & & ( new Version ( ( new YAMLConfig ( new UniversalFile ( dir , " Templates:Vanilla:template.yml " ) ) ) . get ( ) . getString ( " Version " , " 0 " ) ) . compareTo ( new Version ( " 2.13b+ " ) ) ) ! = 0 ) {
2017-07-30 02:41:02 +02:00
Files . move ( new UniversalFile ( dir , " Templates:Vanilla " ) . toPath ( ) , new UniversalFile ( dir , " Templates:Vanilla.old " + Math . round ( Math . random ( ) * 100000 ) ) . toPath ( ) ) ;
Util . unzip ( SubPlugin . class . getResourceAsStream ( " /net/ME1312/SubServers/Bungee/Library/Files/Templates/vanilla.zip " ) , new UniversalFile ( dir , " Templates " ) ) ;
System . out . println ( " SubServers > Updated ~/SubServers/Templates/Vanilla " ) ;
}
2018-04-07 21:04:55 +02:00
if ( new UniversalFile ( dir , " Templates:Spigot:template.yml " ) . exists ( ) & & ( new Version ( ( new YAMLConfig ( new UniversalFile ( dir , " Templates:Spigot:template.yml " ) ) ) . get ( ) . getString ( " Version " , " 0 " ) ) . compareTo ( new Version ( " 2.13a+ " ) ) ) ! = 0 ) {
2018-04-07 21:21:56 +02:00
Files . move ( new UniversalFile ( dir , " Templates:Spigot " ) . toPath ( ) , new UniversalFile ( dir , " Templates:Spigot.old " + Math . round ( Math . random ( ) * 100000 ) ) . toPath ( ) ) ;
2017-07-30 02:41:02 +02:00
Util . unzip ( SubPlugin . class . getResourceAsStream ( " /net/ME1312/SubServers/Bungee/Library/Files/Templates/spigot.zip " ) , new UniversalFile ( dir , " Templates " ) ) ;
System . out . println ( " SubServers > Updated ~/SubServers/Templates/Spigot " ) ;
}
2018-04-07 21:04:55 +02:00
if ( new UniversalFile ( dir , " Templates:Sponge:template.yml " ) . exists ( ) & & ( new Version ( ( new YAMLConfig ( new UniversalFile ( dir , " Templates:Sponge:template.yml " ) ) ) . get ( ) . getString ( " Version " , " 0 " ) ) . compareTo ( new Version ( " 2.13a+ " ) ) ) ! = 0 ) {
2018-04-07 21:21:56 +02:00
Files . move ( new UniversalFile ( dir , " Templates:Sponge " ) . toPath ( ) , new UniversalFile ( dir , " Templates:Sponge.old " + Math . round ( Math . random ( ) * 100000 ) ) . toPath ( ) ) ;
2017-07-30 02:41:02 +02:00
Util . unzip ( SubPlugin . class . getResourceAsStream ( " /net/ME1312/SubServers/Bungee/Library/Files/Templates/sponge.zip " ) , new UniversalFile ( dir , " Templates " ) ) ;
System . out . println ( " SubServers > Updated ~/SubServers/Templates/Sponge " ) ;
}
2017-01-01 20:34:46 +01:00
}
if ( new UniversalFile ( dir , " Recently Deleted " ) . exists ( ) ) {
int f = new UniversalFile ( dir , " Recently Deleted " ) . listFiles ( ) . length ;
for ( File file : new UniversalFile ( dir , " Recently Deleted " ) . listFiles ( ) ) {
try {
if ( file . isDirectory ( ) ) {
if ( new UniversalFile ( dir , " Recently Deleted: " + file . getName ( ) + " :info.json " ) . exists ( ) ) {
2018-03-14 08:01:44 +01:00
FileReader reader = new FileReader ( new UniversalFile ( dir , " Recently Deleted: " + file . getName ( ) + " :info.json " ) ) ;
2018-04-15 03:53:51 +02:00
YAMLSection info = new YAMLSection ( new Gson ( ) . fromJson ( Util . readAll ( reader ) , Map . class ) ) ;
2018-03-14 08:01:44 +01:00
reader . close ( ) ;
2018-04-15 03:53:51 +02:00
if ( info . contains ( " Timestamp " ) ) {
if ( TimeUnit . MILLISECONDS . toDays ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) - info . getLong ( " Timestamp " ) ) > = 7 ) {
2017-01-01 20:34:46 +01:00
Util . deleteDirectory ( file ) ;
f - - ;
System . out . println ( " SubServers > Removed ~/SubServers/Recently Deleted/ " + file . getName ( ) ) ;
}
} else {
Util . deleteDirectory ( file ) ;
f - - ;
System . out . println ( " SubServers > Removed ~/SubServers/Recently Deleted/ " + file . getName ( ) ) ;
}
} else {
Util . deleteDirectory ( file ) ;
f - - ;
System . out . println ( " SubServers > Removed ~/SubServers/Recently Deleted/ " + file . getName ( ) ) ;
}
} else {
Files . delete ( file . toPath ( ) ) ;
f - - ;
System . out . println ( " SubServers > Removed ~/SubServers/Recently Deleted/ " + file . getName ( ) ) ;
}
} catch ( Exception e ) {
2017-05-29 07:00:02 +02:00
System . out . println ( " SubServers > Problem scanning ~/SubServers/Recently Deleted/ " + file . getName ( ) ) ;
2017-01-01 20:34:46 +01:00
e . printStackTrace ( ) ;
2017-05-29 07:00:02 +02:00
Files . delete ( file . toPath ( ) ) ;
2017-01-01 20:34:46 +01:00
}
}
2017-01-30 21:22:36 +01:00
if ( f < = 0 ) {
2017-01-01 20:34:46 +01:00
Files . delete ( new UniversalFile ( dir , " Recently Deleted " ) . toPath ( ) ) ;
}
}
2017-08-22 15:02:23 +02:00
api . addHostDriver ( net . ME1312 . SubServers . Bungee . Host . Internal . InternalHost . class , " built-in " ) ;
api . addHostDriver ( net . ME1312 . SubServers . Bungee . Host . External . ExternalHost . class , " network " ) ;
2016-12-05 04:21:04 +01:00
2017-08-15 11:58:48 +02:00
getPluginManager ( ) . registerListener ( null , this ) ;
2017-01-08 03:30:03 +01:00
2017-08-17 01:29:02 +02:00
System . out . println ( " SubServers > Pre-Parsing Config... " ) ;
2017-04-16 19:02:14 +02:00
for ( String name : config . get ( ) . getSection ( " Servers " ) . getKeys ( ) ) {
2017-08-18 11:58:06 +02:00
try {
2018-01-02 23:29:25 +01:00
if ( Util . getCaseInsensitively ( config . get ( ) . getSection ( " Hosts " ) . get ( ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) ) = = null ) throw new InvalidServerException ( " There is no host with this name: " + config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) ) ;
legServers . put ( name , new BungeeServerInfo ( name , new InetSocketAddress ( InetAddress . getByName ( ( String ) ( ( Map < String , ? > ) Util . getCaseInsensitively ( config . get ( ) . getSection ( " Hosts " ) . get ( ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) ) ) . get ( " Address " ) ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getInt ( " Port " ) ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getColoredString ( " Motd " , '&' ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Restricted " ) ) ) ;
2017-08-18 11:58:06 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2017-04-16 19:02:14 +02:00
}
2017-08-17 01:29:02 +02:00
System . out . println ( " SubServers > Loading BungeeCord Libraries... " ) ;
2016-12-05 04:21:04 +01:00
}
/ * *
2017-12-09 09:43:29 +01:00
* Load SubServers before BungeeCord finishes
2016-12-05 04:21:04 +01:00
* /
@Override
public void startListeners ( ) {
try {
2018-01-22 16:01:33 +01:00
redis = getPluginManager ( ) . getPlugin ( " RedisBungee " ) ! = null ;
2017-12-09 09:43:29 +01:00
reload ( ) ;
super . startListeners ( ) ;
if ( ! posted ) {
post ( ) ;
posted = true ;
}
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
/ * *
* Load data from the config ( will attempt to merge with current configuration )
*
* @throws IOException
* /
@SuppressWarnings ( " unchecked " )
public void reload ( ) throws IOException {
List < String > ukeys = new ArrayList < String > ( ) ;
long begin = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
2017-12-10 01:30:06 +01:00
boolean status ;
if ( ! ( status = running ) ) resetDate = begin ;
2017-12-09 09:43:29 +01:00
YAMLSection prevconfig = config . get ( ) ;
config . reload ( ) ;
2018-01-02 23:29:25 +01:00
langconfig . reload ( ) ;
for ( String key : langconfig . get ( ) . getSection ( " Lang " ) . getKeys ( ) )
api . setLang ( " SubServers " , key , langconfig . get ( ) . getSection ( " Lang " ) . getColoredString ( key , '&' ) ) ;
2017-12-09 09:43:29 +01:00
2017-12-10 01:30:06 +01:00
if ( subdata = = null | | // SubData Server must be reset
2017-12-09 09:43:29 +01:00
! config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . equals ( prevconfig . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) ) | |
! config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " , " NONE " ) . equals ( prevconfig . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " , " NONE " ) )
) {
if ( subdata ! = null ) subdata . destroy ( ) ;
2017-01-21 17:49:37 +01:00
2018-01-05 21:37:23 +01:00
Cipher cipher = null ;
if ( ! config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " , " NONE " ) . equalsIgnoreCase ( " NONE " ) ) {
if ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Password " , " " ) . length ( ) = = 0 ) {
System . out . println ( " SubData > Cannot encrypt connection without a password " ) ;
2018-01-12 22:56:22 +01:00
} else if ( ! SubDataServer . 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 = SubDataServer . getCipher ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) ) ;
}
2017-06-30 15:36:16 +02:00
}
2017-07-19 01:28:59 +02:00
subdata = new SubDataServer ( this , Integer . parseInt ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 1 ] ) ,
2017-06-30 15:36:16 +02:00
( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 0 ] . equals ( " 0.0.0.0 " ) ) ? null : InetAddress . getByName ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 0 ] ) ,
2018-01-05 21:37:23 +01:00
cipher ) ;
2017-08-22 15:02:23 +02:00
System . out . println ( " SubServers > SubData Direct Listening on " + subdata . getServer ( ) . getLocalSocketAddress ( ) . toString ( ) ) ;
2016-12-05 04:21:04 +01:00
loop ( ) ;
2017-12-10 01:30:06 +01:00
} // Add new entries to Allowed-Connections
2017-12-09 09:43:29 +01:00
for ( String s : config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getStringList ( " Allowed-Connections " , new ArrayList < String > ( ) ) ) {
try {
SubDataServer . allowConnection ( s ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
}
2016-12-05 04:21:04 +01:00
2017-12-09 09:43:29 +01:00
int hosts = 0 ;
System . out . println ( " SubServers > " + ( ( status ) ? " Rel " : " L " ) + " oading Hosts... " ) ;
for ( String name : config . get ( ) . getSection ( " Hosts " ) . getKeys ( ) ) {
if ( ! ukeys . contains ( name . toLowerCase ( ) ) ) try {
2018-01-12 22:56:22 +01:00
if ( ! hostDrivers . keySet ( ) . contains ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Driver " ) . toUpperCase ( ) . replace ( '-' , '_' ) . replace ( ' ' , '_' ) ) ) throw new InvalidHostException ( " Invalid Driver for host: " + name ) ;
2017-12-09 09:43:29 +01:00
Host host = this . hosts . get ( name . toLowerCase ( ) ) ;
2017-12-10 01:30:06 +01:00
if ( host = = null | | // Host must be reset
2018-01-12 22:56:22 +01:00
! hostDrivers . get ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Driver " ) . toUpperCase ( ) . replace ( '-' , '_' ) . replace ( ' ' , '_' ) ) . equals ( host . getClass ( ) ) | |
2017-12-09 09:43:29 +01:00
! config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Address " ) . equals ( host . getAddress ( ) . getHostAddress ( ) ) | |
! config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Directory " ) . equals ( host . getPath ( ) ) | |
! config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Git-Bash " ) . equals ( host . getCreator ( ) . getBashDirectory ( ) )
) {
if ( host ! = null ) api . forceRemoveHost ( name ) ;
host = api . addHost ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Driver " ) . toLowerCase ( ) , name , config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getBoolean ( " Enabled " ) , InetAddress . getByName ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Address " ) ) ,
2017-08-22 15:02:23 +02:00
config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Directory " ) , config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getRawString ( " Git-Bash " ) ) ;
2017-12-10 01:30:06 +01:00
} else { // Host wasn't reset, so check for these changes
if ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getBoolean ( " Enabled " ) ! = host . isEnabled ( ) )
host . setEnabled ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getBoolean ( " Enabled " ) ) ;
} // Check for other changes
2017-12-09 09:43:29 +01:00
if ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getKeys ( ) . contains ( " Display " ) & & ( ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getString ( " Display " ) . length ( ) = = 0 & & ! host . getDisplayName ( ) . equals ( host . getName ( ) ) ) | | ! config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getString ( " Display " ) . equals ( host . getDisplayName ( ) ) ) )
host . setDisplayName ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getString ( " Display " ) ) ;
if ( config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getKeys ( ) . contains ( " Extra " ) )
for ( String extra : config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getSection ( " Extra " ) . getKeys ( ) ) host . addExtra ( extra , config . get ( ) . getSection ( " Hosts " ) . getSection ( name ) . getSection ( " Extra " ) . getObject ( extra ) ) ;
2017-12-14 01:04:58 +01:00
if ( host instanceof ClientHandler & & ( ( ClientHandler ) host ) . getSubData ( ) ! = null )
( ( ClientHandler ) host ) . getSubData ( ) . sendPacket ( new PacketOutReload ( null ) ) ;
2017-12-09 09:43:29 +01:00
ukeys . add ( name . toLowerCase ( ) ) ;
hosts + + ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2016-12-05 04:21:04 +01:00
}
2017-12-09 09:43:29 +01:00
}
ukeys . clear ( ) ;
int servers = 0 ;
System . out . println ( " SubServers > " + ( ( status ) ? " Rel " : " L " ) + " oading Servers... " ) ;
bungeeconfig . reload ( ) ;
for ( String name : bungeeconfig . get ( ) . getSection ( " servers " ) . getKeys ( ) ) {
if ( ! ukeys . contains ( name . toLowerCase ( ) ) ) try {
Server server = api . getServer ( name ) ;
if ( server = = null | | ! ( server instanceof SubServer ) ) {
2017-12-10 01:30:06 +01:00
if ( server = = null | | // Server must be reset
2017-12-09 09:43:29 +01:00
bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getRawString ( " address " ) . equals ( server . getAddress ( ) . getAddress ( ) . getHostAddress ( ) + ':' + server . getAddress ( ) . getPort ( ) )
) {
if ( server ! = null ) api . forceRemoveServer ( name ) ;
server = api . addServer ( name , InetAddress . getByName ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getRawString ( " address " ) . split ( " : " ) [ 0 ] ) ,
Integer . parseInt ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getRawString ( " address " ) . split ( " : " ) [ 1 ] ) , bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getColoredString ( " motd " , '&' ) ,
bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getBoolean ( " hidden " , false ) , bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getBoolean ( " restricted " ) ) ;
2017-12-10 01:30:06 +01:00
} else { // Server wasn't reset, so check for these changes
2017-12-09 09:43:29 +01:00
if ( ! bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getColoredString ( " motd " , '&' ) . equals ( server . getMotd ( ) ) )
server . setMotd ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getColoredString ( " motd " , '&' ) ) ;
if ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getBoolean ( " hidden " , false ) ! = server . isHidden ( ) )
server . setHidden ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getBoolean ( " hidden " , false ) ) ;
if ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getBoolean ( " restricted " ) ! = server . isRestricted ( ) )
server . setRestricted ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getBoolean ( " restricted " ) ) ;
2017-12-10 01:30:06 +01:00
} // Check for other changes
2017-12-09 09:43:29 +01:00
if ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getKeys ( ) . contains ( " display " ) & & ( ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getRawString ( " display " ) . length ( ) = = 0 & & ! server . getDisplayName ( ) . equals ( server . getName ( ) ) ) | | ! bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getRawString ( " display " ) . equals ( server . getDisplayName ( ) ) ) )
server . setDisplayName ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getString ( " display " ) ) ;
if ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getKeys ( ) . contains ( " group " ) ) {
for ( String group : server . getGroups ( ) ) server . removeGroup ( group ) ;
for ( String group : bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getStringList ( " group " ) ) server . addGroup ( group ) ;
}
if ( bungeeconfig . get ( ) . getSection ( " servers " ) . getSection ( name ) . getKeys ( ) . contains ( " extra " ) )
for ( String extra : config . get ( ) . getSection ( " servers " ) . getSection ( name ) . getSection ( " extra " ) . getKeys ( ) ) server . addExtra ( extra , config . get ( ) . getSection ( " servers " ) . getSection ( name ) . getSection ( " extra " ) . getObject ( extra ) ) ;
2017-12-14 01:04:58 +01:00
if ( server . getSubData ( ) ! = null )
server . getSubData ( ) . sendPacket ( new PacketOutReload ( null ) ) ;
2017-12-09 09:43:29 +01:00
ukeys . add ( name . toLowerCase ( ) ) ;
2016-12-05 04:21:04 +01:00
servers + + ;
}
2017-12-09 09:43:29 +01:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2016-12-05 04:21:04 +01:00
}
2017-12-09 09:43:29 +01:00
}
ukeys . clear ( ) ;
2016-12-05 04:21:04 +01:00
2017-12-09 09:43:29 +01:00
int subservers = 0 ;
System . out . println ( " SubServers > " + ( ( status ) ? " Rel " : " L " ) + " oading SubServers... " ) ;
if ( ! posted ) Runtime . getRuntime ( ) . addShutdownHook ( new Thread ( ( ) - > {
if ( ! running ) {
System . out . println ( " SubServers > Received request from system to shutdown " ) ;
2016-12-05 04:21:04 +01:00
try {
2017-12-09 09:43:29 +01:00
shutdown ( ) ;
2016-12-05 04:21:04 +01:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
}
2017-12-09 09:43:29 +01:00
} ) ) ;
running = true ;
2018-01-29 07:04:36 +01:00
List < String > autorun = new LinkedList < String > ( ) ;
2017-12-09 09:43:29 +01:00
for ( String name : config . get ( ) . getSection ( " Servers " ) . getKeys ( ) ) {
if ( ! ukeys . contains ( name . toLowerCase ( ) ) ) try {
if ( ! this . hosts . keySet ( ) . contains ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) . toLowerCase ( ) ) ) throw new InvalidServerException ( " There is no host with this name: " + config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) ) ;
if ( exServers . keySet ( ) . contains ( name . toLowerCase ( ) ) ) {
exServers . remove ( name . toLowerCase ( ) ) ;
servers - - ;
2017-07-21 22:45:41 +02:00
}
2017-12-09 09:43:29 +01:00
SubServer server = api . getSubServer ( name ) ;
if ( server ! = null & & server . isEditable ( ) ) { // Server can edit() (May be reset depending on change severity)
YAMLSection edits = new YAMLSection ( ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Enabled " ) ! = server . isEnabled ( ) )
edits . set ( " enabled " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Enabled " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getKeys ( ) . contains ( " Display " ) & & ( ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Display " ) . length ( ) = = 0 & & ! server . getDisplayName ( ) . equals ( server . getName ( ) ) ) | | ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Display " ) . equals ( server . getDisplayName ( ) ) ) )
edits . set ( " display " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Display " ) ) ;
if ( ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) . equalsIgnoreCase ( server . getHost ( ) . getName ( ) ) )
edits . set ( " host " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Host " ) ) ;
if ( ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getStringList ( " Group " ) . equals ( server . getGroups ( ) ) )
edits . set ( " group " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawStringList ( " Group " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getInt ( " Port " ) ! = server . getAddress ( ) . getPort ( ) )
edits . set ( " port " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getInt ( " Port " ) ) ;
if ( ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getColoredString ( " Motd " , '&' ) . equals ( server . getMotd ( ) ) )
edits . set ( " motd " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Motd " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Log " ) ! = server . isLogging ( ) )
edits . set ( " log " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Log " ) ) ;
if ( ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Directory " ) . equals ( server . getPath ( ) ) )
edits . set ( " dir " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Directory " ) ) ;
if ( ! new Executable ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Executable " ) ) . toString ( ) . equals ( server . getExecutable ( ) . toString ( ) ) )
edits . set ( " exec " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Executable " ) ) ;
if ( ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Stop-Command " ) . equals ( server . getStopCommand ( ) ) )
edits . set ( " stop-cmd " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Stop-Command " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Auto-Restart " ) ! = server . willAutoRestart ( ) )
edits . set ( " auto-restart " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Auto-Restart " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Restricted " ) ! = server . isRestricted ( ) )
edits . set ( " restricted " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Restricted " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Hidden " ) ! = server . isHidden ( ) )
edits . set ( " hidden " , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Hidden " ) ) ;
if ( edits . getKeys ( ) . size ( ) > 0 ) {
server . edit ( edits ) ;
2017-12-14 01:04:58 +01:00
if ( server = = api . getSubServer ( name ) & & server . getSubData ( ) ! = null )
server . getSubData ( ) . sendPacket ( new PacketOutReload ( null ) ) ;
2017-12-09 09:43:29 +01:00
server = api . getSubServer ( name ) ;
2017-12-14 01:04:58 +01:00
} else if ( server . getSubData ( ) ! = null )
server . getSubData ( ) . sendPacket ( new PacketOutReload ( null ) ) ;
2017-12-09 09:43:29 +01:00
} else { // Server cannot edit()
if ( server = = null | | // Server must be reset
! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) . equalsIgnoreCase ( server . getHost ( ) . getName ( ) ) | |
config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getInt ( " Port " ) ! = server . getAddress ( ) . getPort ( ) | |
! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Directory " ) . equals ( server . getPath ( ) ) | |
! new Executable ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Executable " ) ) . toString ( ) . equals ( server . getExecutable ( ) . toString ( ) )
) {
if ( server ! = null ) server . getHost ( ) . forceRemoveSubServer ( name ) ;
server = this . hosts . get ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Host " ) . toLowerCase ( ) ) . addSubServer ( name , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Enabled " ) ,
config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getInt ( " Port " ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getColoredString ( " Motd " , '&' ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Log " ) ,
config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Directory " ) , new Executable ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Executable " ) ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Stop-Command " ) ,
2018-01-29 07:04:36 +01:00
config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Hidden " ) , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Restricted " ) , false ) ;
2017-12-09 09:43:29 +01:00
} else { // Server doesn't need to reset
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Enabled " ) ! = server . isEnabled ( ) )
server . setEnabled ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Enabled " ) ) ;
if ( ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getColoredString ( " Motd " , '&' ) . equals ( server . getMotd ( ) ) )
server . setMotd ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getColoredString ( " Motd " , '&' ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Log " ) ! = server . isLogging ( ) )
server . setLogging ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Log " ) ) ;
if ( ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Stop-Command " ) . equals ( server . getStopCommand ( ) ) )
server . setStopCommand ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getRawString ( " Stop-Command " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Restricted " ) ! = server . isRestricted ( ) )
server . setRestricted ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Restricted " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Hidden " ) ! = server . isHidden ( ) )
server . setHidden ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Hidden " ) ) ;
2017-12-14 01:04:58 +01:00
if ( server . getSubData ( ) ! = null )
server . getSubData ( ) . sendPacket ( new PacketOutReload ( null ) ) ;
2017-12-09 09:43:29 +01:00
} // Apply these changes regardless of reset
2018-01-29 07:04:36 +01:00
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Auto-Restart " ) ! = server . willAutoRestart ( ) )
server . setAutoRestart ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Auto-Restart " ) ) ;
if ( ! status & & config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Run-On-Launch " ) )
autorun . add ( name . toLowerCase ( ) ) ;
2017-12-09 09:43:29 +01:00
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getKeys ( ) . contains ( " Display " ) & & ( ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Display " ) . length ( ) = = 0 & & ! server . getDisplayName ( ) . equals ( server . getName ( ) ) ) | | ! config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Display " ) . equals ( server . getDisplayName ( ) ) ) )
server . setDisplayName ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getString ( " Display " ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getKeys ( ) . contains ( " Group " ) ) {
for ( String group : server . getGroups ( ) ) server . removeGroup ( group ) ;
for ( String group : config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getStringList ( " Group " ) ) server . addGroup ( group ) ;
}
} // Apply these changes regardless of edit/reset
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Editable " , true ) ! = server . isEditable ( ) ) server . setEditable ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getBoolean ( " Editable " , true ) ) ;
if ( config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getKeys ( ) . contains ( " Extra " ) ) for ( String extra : config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getSection ( " Extra " ) . getKeys ( ) ) server . addExtra ( extra , config . get ( ) . getSection ( " Servers " ) . getSection ( name ) . getSection ( " Extra " ) . getObject ( extra ) ) ;
ukeys . add ( name . toLowerCase ( ) ) ;
subservers + + ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2017-07-21 22:45:41 +02:00
}
2017-12-09 09:43:29 +01:00
}
for ( String name : ukeys ) {
SubServer server = api . getSubServer ( name ) ;
for ( String oname : config . get ( ) . getSection ( " Servers " ) . getSection ( server . getName ( ) ) . getRawStringList ( " Incompatible " , new ArrayList < > ( ) ) ) {
SubServer oserver = api . getSubServer ( oname ) ;
if ( oserver ! = null & & server . isCompatible ( oserver ) ) server . toggleCompatibility ( oserver ) ;
}
2018-01-29 07:04:36 +01:00
if ( autorun . contains ( name ) )
server . start ( ) ;
2017-12-09 09:43:29 +01:00
}
ukeys . clear ( ) ;
api . ready = true ;
legServers . clear ( ) ;
int plugins = 0 ;
2017-12-13 18:29:50 +01:00
List < ? > listeners = ( status ) ? api . reloadListeners : api . listeners ;
if ( listeners . size ( ) > 0 ) {
System . out . println ( " SubServers > " + ( ( status ) ? " Rel " : " L " ) + " oading SubAPI Plugins... " ) ;
for ( Object obj : listeners ) {
if ( status ) {
try {
( ( Runnable ) obj ) . run ( ) ;
2017-12-09 09:43:29 +01:00
plugins + + ;
2017-12-13 18:29:50 +01:00
} catch ( Throwable e ) {
new InvocationTargetException ( e , " Problem enabling plugin " ) . printStackTrace ( ) ;
}
} else {
NamedContainer < Runnable , Runnable > listener = ( NamedContainer < Runnable , Runnable > ) obj ;
try {
if ( listener . name ( ) ! = null ) {
listener . name ( ) . run ( ) ;
plugins + + ;
}
} catch ( Throwable e ) {
new InvocationTargetException ( e , " Problem enabling plugin " ) . printStackTrace ( ) ;
2017-01-26 23:19:48 +01:00
}
}
}
2016-12-05 04:21:04 +01:00
}
2017-12-09 09:43:29 +01:00
2017-12-12 00:27:18 +01:00
System . out . println ( " SubServers > " + ( ( plugins > 0 ) ? plugins + " Plugin " + ( ( plugins = = 1 ) ? " " : " s " ) + " , " : " " ) + hosts + " Host " + ( ( hosts = = 1 ) ? " " : " s " ) + " , " + servers + " Server " + ( ( servers = = 1 ) ? " " : " s " ) + " , and " + subservers + " SubServer " + ( ( subservers = = 1 ) ? " " : " s " ) + " " + ( ( status ) ? " re " : " " ) + " loaded in " + new DecimalFormat ( " 0.000 " ) . format ( ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) - begin ) / 1000D ) + " s " ) ;
2016-12-05 04:21:04 +01:00
}
2017-08-18 11:58:06 +02:00
private void post ( ) {
2017-12-08 08:35:50 +01:00
if ( config . get ( ) . getSection ( " Settings " ) . getBoolean ( " Override-Bungee-Commands " , true ) ) {
2017-12-13 18:29:50 +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 " ) ) ;
}
2017-12-13 18:29:50 +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-12-08 08:35:50 +01:00
2017-08-18 11:58:06 +02:00
new Metrics ( this ) ;
new Timer ( ) . schedule ( new TimerTask ( ) {
@Override
public void run ( ) {
try {
2017-12-06 23:34:47 +01:00
Document updxml = DocumentBuilderFactory . newInstance ( ) . newDocumentBuilder ( ) . parse ( new InputSource ( new StringReader ( Util . readAll ( new BufferedReader ( new InputStreamReader ( new URL ( " https://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Bungee/maven-metadata.xml " ) . openStream ( ) , Charset . forName ( " UTF-8 " ) ) ) ) ) ) ) ;
2017-08-18 11:58:06 +02:00
NodeList updnodeList = updxml . getElementsByTagName ( " version " ) ;
Version updversion = version ;
2018-03-14 22:50:15 +01:00
int updcount = 0 ;
2017-08-18 11:58:06 +02:00
for ( int i = 0 ; i < updnodeList . getLength ( ) ; i + + ) {
Node node = updnodeList . item ( i ) ;
if ( node . getNodeType ( ) = = Node . ELEMENT_NODE ) {
2018-03-16 03:45:54 +01:00
if ( ! node . getTextContent ( ) . startsWith ( " - " ) & & ! node . getTextContent ( ) . equals ( version . toString ( ) ) & & Version . fromString ( node . getTextContent ( ) ) . compareTo ( updversion ) > 0 ) {
updversion = Version . fromString ( node . getTextContent ( ) ) ;
2017-08-18 11:58:06 +02:00
updcount + + ;
}
}
}
2018-03-14 22:50:15 +01:00
if ( updcount > 0 ) System . out . println ( " SubServers > SubServers.Bungee v " + updversion + " is available. You are " + updcount + " version " + ( ( updcount = = 1 ) ? " " : " s " ) + " behind. " ) ;
2017-08-18 11:58:06 +02:00
} catch ( Exception e ) { }
}
} , 0 , TimeUnit . DAYS . toMillis ( 2 ) ) ;
}
2016-12-15 22:04:39 +01:00
private void loop ( ) {
new Thread ( ( ) - > {
2017-04-16 19:02:14 +02:00
while ( subdata ! = null ) {
2016-12-15 22:04:39 +01:00
try {
subdata . addClient ( subdata . getServer ( ) . accept ( ) ) ;
} catch ( IOException e ) {
2016-12-24 05:55:17 +01:00
if ( ! ( e instanceof SocketException ) ) e . printStackTrace ( ) ;
2016-12-05 04:21:04 +01:00
}
}
2016-12-15 22:04:39 +01:00
} ) . start ( ) ;
2016-12-05 04:21:04 +01:00
}
2017-12-10 01:30:06 +01:00
/ * *
* Reset all changes made by startListeners
*
* @see SubPlugin # startListeners ( )
* /
@Override
public void stopListeners ( ) {
try {
legServers . clear ( ) ;
legServers . putAll ( getServers ( ) ) ;
if ( api . listeners . size ( ) > 0 ) {
System . out . println ( " SubServers > Resetting SubAPI Plugins... " ) ;
for ( NamedContainer < Runnable , Runnable > listener : api . listeners ) {
try {
if ( listener . get ( ) ! = null ) listener . get ( ) . run ( ) ;
} catch ( Throwable e ) {
new InvocationTargetException ( e , " Problem disabling plugin " ) . printStackTrace ( ) ;
}
}
}
shutdown ( ) ;
subdata . destroy ( ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
super . stopListeners ( ) ;
} private void shutdown ( ) throws Exception {
api . ready = false ;
System . out . println ( " SubServers > Resetting Hosts and Server Data " ) ;
List < String > hosts = new ArrayList < String > ( ) ;
hosts . addAll ( this . hosts . keySet ( ) ) ;
for ( String host : hosts ) {
api . forceRemoveHost ( host ) ;
}
running = false ;
this . hosts . clear ( ) ;
exServers . clear ( ) ;
}
2017-12-13 18:29:50 +01:00
String getNewSignature ( ) {
BigInteger number = ( lastSignature = lastSignature . add ( BigInteger . ONE ) ) ;
2018-01-21 21:45:27 +01:00
final String DIGITS = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_ " ;
2018-01-13 22:22:13 +01:00
final BigInteger BASE = BigInteger . valueOf ( DIGITS . length ( ) ) ;
2017-12-13 18:29:50 +01:00
StringBuilder result = new StringBuilder ( ) ;
2018-01-13 22:22:13 +01:00
while ( number . compareTo ( BigInteger . ZERO ) > 0 ) { // number > 0
2017-12-13 18:29:50 +01:00
BigInteger [ ] divmod = number . divideAndRemainder ( BASE ) ;
number = divmod [ 0 ] ;
int digit = divmod [ 1 ] . intValue ( ) ;
result . insert ( 0 , DIGITS . charAt ( digit ) ) ;
}
return ( result . length ( ) = = 0 ) ? DIGITS . substring ( 0 , 1 ) : result . toString ( ) ;
2017-12-10 01:30:06 +01:00
}
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-01-21 21:45:27 +01: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-05-24 20:52:47 +02:00
return ( isPatched ) ? " SubServers.Bungee " : 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
}
2016-12-05 04:21:04 +01:00
/ * *
2016-12-15 22:04:39 +01:00
* Emulate BungeeCord ' s getServers ( )
2016-12-05 04:21:04 +01:00
*
* @see SubAPI # getServers ( )
* @return Server Map
* /
@Override
public Map < String , ServerInfo > getServers ( ) {
2017-04-16 19:02:14 +02:00
HashMap < String , ServerInfo > servers = new HashMap < String , ServerInfo > ( ) ;
2017-12-06 23:34:47 +01:00
if ( ! api . ready ) {
2017-07-21 22:45:41 +02:00
servers . putAll ( super . getServers ( ) ) ;
2017-08-17 01:29:02 +02:00
servers . putAll ( legServers ) ;
2017-01-08 03:30:03 +01:00
} else {
for ( ServerInfo server : exServers . values ( ) ) servers . put ( server . getName ( ) , server ) ;
for ( Host host : this . hosts . values ( ) ) {
for ( ServerInfo server : host . getSubServers ( ) . values ( ) ) servers . put ( server . getName ( ) , server ) ;
}
2016-12-05 04:21:04 +01:00
}
2017-04-16 19:02:14 +02:00
return servers ;
2016-12-05 04:21:04 +01:00
}
2017-08-18 11:58:06 +02:00
@EventHandler ( priority = Byte . MAX_VALUE )
public void reroute ( ServerConnectEvent e ) {
Map < String , ServerInfo > servers = new TreeMap < String , ServerInfo > ( api . getServers ( ) ) ;
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 ( ) ) ) ;
}
}
}
@EventHandler ( priority = Byte . MIN_VALUE )
2017-08-15 11:58:48 +02:00
public void resetSudo ( SubStoppedEvent e ) {
if ( sudo = = e . getServer ( ) ) {
sudo = null ;
System . out . println ( " SubServers > Reverting to the BungeeCord Console " ) ;
}
}
2016-12-05 04:21:04 +01:00
}