2017-01-30 21:22:36 +01:00
package net.ME1312.SubServers.Host ;
import net.ME1312.SubServers.Host.API.Event.CommandPreProcessEvent ;
2017-01-31 01:33:30 +01:00
import net.ME1312.SubServers.Host.API.Event.SubDisableEvent ;
2017-01-30 21:22:36 +01:00
import net.ME1312.SubServers.Host.API.Event.SubEnableEvent ;
2017-12-14 01:04:58 +01:00
import net.ME1312.SubServers.Host.API.Event.SubReloadEvent ;
2017-01-30 21:22:36 +01:00
import net.ME1312.SubServers.Host.API.SubPluginInfo ;
import net.ME1312.SubServers.Host.API.SubPlugin ;
2017-04-01 07:37:48 +02:00
import net.ME1312.SubServers.Host.Executable.SubCreator ;
import net.ME1312.SubServers.Host.Executable.SubServer ;
2017-01-30 21:22:36 +01:00
import net.ME1312.SubServers.Host.Library.Config.YAMLConfig ;
import net.ME1312.SubServers.Host.Library.Config.YAMLSection ;
import net.ME1312.SubServers.Host.Library.Exception.IllegalPluginException ;
import net.ME1312.SubServers.Host.Library.Log.FileLogger ;
import net.ME1312.SubServers.Host.Library.Log.Logger ;
2018-01-02 23:29:25 +01:00
import net.ME1312.SubServers.Host.Library.NamedContainer ;
2017-01-30 21:22:36 +01:00
import net.ME1312.SubServers.Host.Library.UniversalFile ;
import net.ME1312.SubServers.Host.Library.Util ;
import net.ME1312.SubServers.Host.Library.Version.Version ;
2018-01-05 21:37:23 +01:00
import net.ME1312.SubServers.Host.Network.Cipher ;
2017-01-30 21:22:36 +01:00
import net.ME1312.SubServers.Host.Network.SubDataClient ;
2017-04-01 18:50:09 +02:00
import org.json.JSONObject ;
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 ;
2017-01-30 21:22:36 +01:00
2017-08-18 11:58:06 +02:00
import javax.xml.parsers.DocumentBuilderFactory ;
2017-04-14 04:39:51 +02:00
import java.io.* ;
2017-01-30 21:22:36 +01:00
import java.lang.reflect.InvocationTargetException ;
import java.net.InetAddress ;
import java.net.URL ;
import java.net.URLDecoder ;
2017-08-18 11:58:06 +02:00
import java.nio.charset.Charset ;
2017-01-30 21:22:36 +01:00
import java.nio.file.Files ;
2017-07-19 01:28:59 +02:00
import java.text.DecimalFormat ;
2017-01-30 21:22:36 +01:00
import java.util.* ;
2017-04-01 18:50:09 +02:00
import java.util.concurrent.TimeUnit ;
2017-04-14 04:39:51 +02:00
import java.util.zip.ZipEntry ;
import java.util.zip.ZipInputStream ;
2017-01-30 21:22:36 +01:00
/ * *
* SubServers . Host Main Class
* /
2017-04-16 19:02:14 +02:00
public final class ExHost {
2018-01-02 23:29:25 +01:00
protected NamedContainer < Long , Map < String , Map < String , String > > > lang = null ;
2017-05-30 21:38:51 +02:00
public HashMap < String , SubCreator . ServerTemplate > templates = new HashMap < String , SubCreator . ServerTemplate > ( ) ;
2017-04-01 07:37:48 +02:00
public HashMap < String , SubServer > servers = new HashMap < String , SubServer > ( ) ;
public SubCreator creator ;
2017-01-30 21:22:36 +01:00
public Logger log ;
public final UniversalFile dir = new UniversalFile ( new File ( System . getProperty ( " user.dir " ) ) ) ;
2017-07-23 06:32:57 +02:00
public final UniversalFile runtime ;
2017-01-30 21:22:36 +01:00
public YAMLConfig config ;
2017-04-01 07:37:48 +02:00
public YAMLSection host = null ;
2017-01-30 21:22:36 +01:00
public SubDataClient subdata = null ;
2017-12-07 23:51:06 +01:00
public final Version version = new Version ( " 2.13a " ) ;
2018-01-05 21:37:23 +01:00
public final Version bversion = new Version ( 2 ) ;
2017-01-30 21:22:36 +01:00
public final SubAPI api = new SubAPI ( this ) ;
2017-12-06 23:34:47 +01:00
private boolean running = false ;
private boolean ready = false ;
2017-01-30 21:22:36 +01:00
2017-02-08 01:39:18 +01:00
/ * *
* SubServers . Host Launch
*
* @param args Args
* @throws Exception
* /
2017-01-30 21:22:36 +01:00
public static void main ( String [ ] args ) throws Exception {
2018-01-12 22:56:22 +01:00
if ( System . getProperty ( " RM.subservers " , " true " ) . equalsIgnoreCase ( " true " ) ) {
new ExHost ( new File ( URLDecoder . decode ( System . getProperty ( " subservers.host.runtime " ) , " UTF-8 " ) ) , args ) ;
} else {
System . out . println ( " >> SubServers code has been disallowed to work on this machine " ) ;
System . out . println ( " >> Check with your provider for more information " ) ;
System . exit ( 1 ) ;
}
2017-01-30 21:22:36 +01:00
}
2017-07-23 06:32:57 +02:00
private ExHost ( File runtime , String [ ] args ) {
this . runtime = new UniversalFile ( runtime ) ;
2017-01-30 21:22:36 +01:00
log = new Logger ( " SubServers " ) ;
try {
Logger . setup ( System . out , System . err , dir ) ;
2017-12-13 18:29:50 +01:00
log . info . println ( " Loading SubServers.Host v " + version . toString ( ) + " Libraries " ) ;
2017-01-30 21:22:36 +01:00
dir . mkdirs ( ) ;
new File ( dir , " Plugins " ) . mkdir ( ) ;
if ( ! ( new UniversalFile ( dir , " config.yml " ) . exists ( ) ) ) {
2017-04-16 19:02:14 +02:00
Util . copyFromJar ( ExHost . class . getClassLoader ( ) , " net/ME1312/SubServers/Host/Library/Files/config.yml " , new UniversalFile ( dir , " config.yml " ) . getPath ( ) ) ;
2017-02-08 01:39:18 +01:00
log . info . println ( " Created ~/config.yml " ) ;
2017-01-30 21:22:36 +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 ) {
Files . move ( new UniversalFile ( dir , " config.yml " ) . toPath ( ) , new UniversalFile ( dir , " config.old " + Math . round ( Math . random ( ) * 100000 ) + " .yml " ) . toPath ( ) ) ;
2017-04-16 19:02:14 +02:00
Util . copyFromJar ( ExHost . class . getClassLoader ( ) , " net/ME1312/SubServers/Host/Library/Files/config.yml " , new UniversalFile ( dir , " config.yml " ) . getPath ( ) ) ;
2017-02-08 01:39:18 +01:00
log . info . println ( " Updated ~/config.yml " ) ;
2017-01-30 21:22:36 +01:00
}
2017-07-23 06:32:57 +02:00
config = new YAMLConfig ( new UniversalFile ( dir , " config.yml " ) ) ;
2017-04-01 07:37:48 +02:00
2017-04-01 18:50:09 +02: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 ( ) ) {
JSONObject json = new JSONObject ( Util . readAll ( new FileReader ( new UniversalFile ( dir , " Recently Deleted: " + file . getName ( ) + " :info.json " ) ) ) ) ;
if ( json . keySet ( ) . contains ( " Timestamp " ) ) {
if ( TimeUnit . MILLISECONDS . toDays ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) - json . getLong ( " Timestamp " ) ) > = 7 ) {
Util . deleteDirectory ( file ) ;
f - - ;
2017-05-30 21:38:51 +02:00
log . info . println ( " Removed ~/Recently Deleted/ " + file . getName ( ) ) ;
2017-04-01 18:50:09 +02:00
}
} else {
Util . deleteDirectory ( file ) ;
f - - ;
2017-05-30 21:38:51 +02:00
log . info . println ( " Removed ~/Recently Deleted/ " + file . getName ( ) ) ;
2017-04-01 18:50:09 +02:00
}
} else {
Util . deleteDirectory ( file ) ;
f - - ;
2017-05-30 21:38:51 +02:00
log . info . println ( " Removed ~/Recently Deleted/ " + file . getName ( ) ) ;
2017-04-01 18:50:09 +02:00
}
} else {
Files . delete ( file . toPath ( ) ) ;
f - - ;
2017-05-30 21:38:51 +02:00
log . info . println ( " Removed ~/Recently Deleted/ " + file . getName ( ) ) ;
2017-04-01 18:50:09 +02:00
}
} catch ( Exception e ) {
2017-04-03 19:52:28 +02:00
log . error . println ( e ) ;
2017-04-01 18:50:09 +02:00
}
}
if ( f < = 0 ) {
Files . delete ( new UniversalFile ( dir , " Recently Deleted " ) . toPath ( ) ) ;
}
}
2017-12-06 23:34:47 +01:00
running = true ;
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 ) {
log . info . println ( " 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
log . info . println ( " Unknown encryption type: " + config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) ) ;
} else {
cipher = SubDataClient . getCipher ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) ) ;
}
2017-06-30 15:36:16 +02:00
}
2017-01-30 21:22:36 +01:00
subdata = new SubDataClient ( this , config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Name " , " undefined " ) ,
InetAddress . getByName ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 0 ] ) ,
2018-01-05 21:37:23 +01:00
Integer . parseInt ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 1 ] ) , cipher ) ;
2017-12-06 23:34:47 +01:00
Runtime . getRuntime ( ) . addShutdownHook ( new Thread ( ( ) - > {
if ( running ) {
log . warn . println ( " Received request from system to shutdown " ) ;
forcequit ( 0 ) ;
}
} ) ) ;
2017-04-01 07:37:48 +02:00
creator = new SubCreator ( this ) ;
2017-01-30 21:22:36 +01:00
if ( System . getProperty ( " subservers.host.plugins " , " " ) . length ( ) > 0 ) {
long begin = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
long i = 0 ;
2017-02-08 01:39:18 +01:00
log . info . println ( " Loading SubAPI Plugins... " ) ;
2017-02-05 23:03:17 +01:00
/ *
* Decode Plugin List Variable
* /
2017-01-31 01:33:30 +01:00
String decoded = URLDecoder . decode ( System . getProperty ( " subservers.host.plugins " ) , " UTF-8 " ) ;
List < String > classes = new LinkedList < String > ( ) ;
HashMap < String , SubPluginInfo > plugins = new LinkedHashMap < String , SubPluginInfo > ( ) ;
if ( ! decoded . contains ( " " ) ) {
classes . add ( decoded ) ;
2017-01-30 21:22:36 +01:00
} else {
2017-01-31 01:33:30 +01:00
classes . addAll ( Arrays . asList ( decoded . split ( " " ) ) ) ;
2017-01-30 21:22:36 +01:00
}
2017-02-05 23:03:17 +01:00
/ *
* Load Main Classes & Plugin Descriptions
* /
2017-01-30 21:22:36 +01:00
for ( String main : classes ) {
try {
Class < ? > clazz = Class . forName ( main ) ;
if ( ! clazz . isAnnotationPresent ( SubPlugin . class ) ) throw new ClassCastException ( " Cannot find plugin descriptor " ) ;
2017-01-31 01:33:30 +01:00
Object obj = clazz . getConstructor ( ) . newInstance ( ) ;
try {
2017-02-05 23:03:17 +01:00
SubPluginInfo plugin = new SubPluginInfo ( this , obj , clazz . getAnnotation ( SubPlugin . class ) . name ( ) , new Version ( clazz . getAnnotation ( SubPlugin . class ) . version ( ) ) ,
2017-01-31 01:33:30 +01:00
Arrays . asList ( clazz . getAnnotation ( SubPlugin . class ) . authors ( ) ) , ( clazz . getAnnotation ( SubPlugin . class ) . description ( ) . length ( ) > 0 ) ? clazz . getAnnotation ( SubPlugin . class ) . description ( ) : null ,
2017-02-05 23:03:17 +01:00
( clazz . getAnnotation ( SubPlugin . class ) . website ( ) . length ( ) > 0 ) ? new URL ( clazz . getAnnotation ( SubPlugin . class ) . website ( ) ) : null , Arrays . asList ( clazz . getAnnotation ( SubPlugin . class ) . loadBefore ( ) ) ,
2017-02-08 01:39:18 +01:00
Arrays . asList ( clazz . getAnnotation ( SubPlugin . class ) . dependencies ( ) ) , Arrays . asList ( clazz . getAnnotation ( SubPlugin . class ) . softDependencies ( ) ) ) ;
if ( plugins . keySet ( ) . contains ( plugin . getName ( ) . toLowerCase ( ) ) ) log . warn . println ( " Duplicate plugin: " + plugin . getName ( ) . toLowerCase ( ) ) ;
2017-02-05 23:03:17 +01:00
plugin . addExtra ( " subservers.plugin.loadafter " , new ArrayList < String > ( ) ) ;
2017-01-31 01:33:30 +01:00
plugins . put ( plugin . getName ( ) . toLowerCase ( ) , plugin ) ;
} catch ( Throwable e ) {
2017-02-08 01:39:18 +01:00
log . error . println ( new IllegalPluginException ( e , " Cannot load plugin descriptor for main class: " + main ) ) ;
2017-01-31 01:33:30 +01:00
}
2017-01-30 21:22:36 +01:00
} catch ( ClassCastException e ) {
2017-02-08 01:39:18 +01:00
log . error . println ( new IllegalPluginException ( e , " Main class isn't annotated as a SubPlugin: " + main ) ) ;
2017-01-30 21:22:36 +01:00
} catch ( InvocationTargetException e ) {
2017-02-08 01:39:18 +01:00
log . error . println ( new IllegalPluginException ( e . getTargetException ( ) , " Uncaught exception occurred while loading main class: " + main ) ) ;
2017-01-31 01:33:30 +01:00
} catch ( Throwable e ) {
2017-02-08 01:39:18 +01:00
log . error . println ( new IllegalPluginException ( e , " Cannot load main class: " + main ) ) ;
2017-01-30 21:22:36 +01:00
}
}
2017-02-05 23:03:17 +01:00
/ *
* Load Extra Plugin Settings
* /
for ( SubPluginInfo plugin : plugins . values ( ) ) {
for ( String loadbefore : plugin . getLoadBefore ( ) ) {
if ( plugins . keySet ( ) . contains ( loadbefore . toLowerCase ( ) ) ) {
List < String > loadafter = plugins . get ( loadbefore . toLowerCase ( ) ) . getExtra ( " subservers.plugin.loadafter " ) . asRawStringList ( ) ;
loadafter . add ( plugin . getName ( ) . toLowerCase ( ) ) ;
plugins . get ( loadbefore . toLowerCase ( ) ) . addExtra ( " subservers.plugin.loadafter " , loadafter ) ;
}
}
}
/ *
* Register Plugins
* /
2017-01-30 21:22:36 +01:00
while ( plugins . size ( ) > 0 ) {
List < String > loaded = new ArrayList < String > ( ) ;
2017-02-05 23:03:17 +01:00
for ( SubPluginInfo plugin : plugins . values ( ) ) {
2017-01-30 21:22:36 +01:00
try {
boolean load = true ;
for ( String depend : plugin . getDependancies ( ) ) {
if ( plugins . keySet ( ) . contains ( depend . toLowerCase ( ) ) ) {
load = false ;
} else if ( ! api . plugins . keySet ( ) . contains ( depend . toLowerCase ( ) ) ) {
2017-01-31 01:33:30 +01:00
throw new IllegalPluginException ( new IllegalStateException ( " Unknown dependency: " + depend ) , " Cannot meet requirements for plugin: " + plugin . getName ( ) + " v " + plugin . getVersion ( ) . toString ( ) ) ;
2017-01-30 21:22:36 +01:00
}
}
for ( String softdepend : plugin . getSoftDependancies ( ) ) {
if ( plugins . keySet ( ) . contains ( softdepend . toLowerCase ( ) ) ) {
load = false ;
}
}
2017-02-05 23:03:17 +01:00
for ( String loadafter : plugin . getExtra ( " subservers.plugin.loadafter " ) . asRawStringList ( ) ) {
if ( plugins . keySet ( ) . contains ( loadafter . toLowerCase ( ) ) ) {
load = false ;
2017-01-30 21:22:36 +01:00
}
}
2017-02-05 23:03:17 +01:00
if ( load ) try {
plugin . removeExtra ( " subservers.plugin.loadafter " ) ;
plugin . setEnabled ( true ) ;
api . addListener ( plugin , plugin . get ( ) ) ;
api . plugins . put ( plugin . getName ( ) . toLowerCase ( ) , plugin ) ;
2017-12-06 23:34:47 +01:00
api . plugins . put ( plugin . getName ( ) . toLowerCase ( ) , plugin ) ;
2017-02-05 23:03:17 +01:00
loaded . add ( plugin . getName ( ) . toLowerCase ( ) ) ;
2017-02-08 01:39:18 +01:00
log . info . println ( " Loaded " + plugin . getName ( ) + " v " + plugin . getVersion ( ) . toString ( ) + " by " + plugin . getAuthors ( ) . toString ( ) . substring ( 1 , plugin . getAuthors ( ) . toString ( ) . length ( ) - 1 ) ) ;
2017-02-05 23:03:17 +01:00
i + + ;
} catch ( Throwable e ) {
plugin . setEnabled ( false ) ;
throw new InvocationTargetException ( e , " Problem loading plugin: " + plugin . getName ( ) ) ;
}
2017-01-31 01:33:30 +01:00
} catch ( InvocationTargetException e ) {
2017-02-08 01:39:18 +01:00
log . error . println ( e ) ;
2017-02-05 23:03:17 +01:00
loaded . add ( plugin . getName ( ) . toLowerCase ( ) ) ;
2017-01-30 21:22:36 +01:00
}
}
2017-01-31 01:33:30 +01:00
int progress = 0 ;
2017-01-30 21:22:36 +01:00
for ( String name : loaded ) {
2017-01-31 01:33:30 +01:00
progress + + ;
2017-01-30 21:22:36 +01:00
plugins . remove ( name ) ;
}
2017-01-31 01:33:30 +01:00
if ( progress = = 0 & & plugins . size ( ) ! = 0 ) {
2017-08-09 08:25:56 +02:00
log . error . println ( new IllegalStateException ( " Couldn't load more plugins yet " + plugins . size ( ) + " remain unloaded " ) ) ;
2017-01-31 01:33:30 +01:00
break ;
}
2017-01-30 21:22:36 +01:00
}
2017-02-05 23:03:17 +01:00
/ *
* Enable Plugins
* /
api . executeEvent ( new SubEnableEvent ( this ) ) ;
2017-07-19 01:28:59 +02:00
log . info . println ( i + " Plugin " + ( ( i = = 1 ) ? " " : " s " ) + " loaded in " + new DecimalFormat ( " 0.000 " ) . format ( ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) - begin ) / 1000D ) + " s " ) ;
2017-01-30 21:22:36 +01:00
}
2017-02-05 23:03:17 +01:00
loadDefaults ( ) ;
2017-08-18 11:58:06 +02:00
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.Host/maven-metadata.xml " ) . openStream ( ) , Charset . forName ( " UTF-8 " ) ) ) ) ) ) ) ;
2017-08-18 11:58:06 +02:00
NodeList updnodeList = updxml . getElementsByTagName ( " version " ) ;
Version updversion = version ;
int updcount = - 1 ;
for ( int i = 0 ; i < updnodeList . getLength ( ) ; i + + ) {
Node node = updnodeList . item ( i ) ;
if ( node . getNodeType ( ) = = Node . ELEMENT_NODE ) {
if ( ! node . getTextContent ( ) . startsWith ( " - " ) & & new Version ( node . getTextContent ( ) ) . compareTo ( updversion ) > = 0 ) {
updversion = new Version ( node . getTextContent ( ) ) ;
updcount + + ;
}
}
}
if ( ! updversion . equals ( version ) ) log . info . println ( " SubServers.Host v " + updversion + " is available. You are " + updcount + " version " + ( ( updcount = = 1 ) ? " " : " s " ) + " behind. " ) ;
} catch ( Exception e ) { }
}
} , 0 , TimeUnit . DAYS . toMillis ( 2 ) ) ;
2017-01-30 21:22:36 +01:00
loop ( ) ;
} catch ( Exception e ) {
2017-02-08 01:39:18 +01:00
log . error . println ( e ) ;
2017-12-06 23:34:47 +01:00
forcequit ( 1 ) ;
2017-01-30 21:22:36 +01:00
}
}
2017-12-14 01:04:58 +01:00
public void reload ( ) throws IOException {
if ( subdata ! = null )
subdata . destroy ( 0 ) ;
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 " ) ) {
if ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Password " , " " ) . length ( ) = = 0 ) {
log . info . println ( " 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
log . info . println ( " Unknown encryption type: " + config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) ) ;
} else {
cipher = SubDataClient . getCipher ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " ) ) ;
}
2017-12-14 01:04:58 +01:00
}
subdata = new SubDataClient ( this , config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Name " , " undefined " ) ,
InetAddress . getByName ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 0 ] ) ,
2018-01-05 21:37:23 +01:00
Integer . parseInt ( config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 1 ] ) , cipher ) ;
2017-12-14 01:04:58 +01:00
SubAPI . getInstance ( ) . executeEvent ( new SubReloadEvent ( this ) ) ;
}
2017-01-30 21:22:36 +01:00
private void loop ( ) {
Scanner console = new Scanner ( System . in ) ;
2017-12-06 23:34:47 +01:00
ready = true ;
while ( ready & & console . hasNextLine ( ) ) {
if ( ! ready ) continue ;
2017-01-30 21:22:36 +01:00
final String umsg = console . nextLine ( ) ;
final CommandPreProcessEvent event ;
2017-02-05 23:03:17 +01:00
api . executeEvent ( event = new CommandPreProcessEvent ( this , umsg ) ) ;
2017-01-30 21:22:36 +01:00
if ( ! event . isCancelled ( ) ) {
2017-02-05 23:03:17 +01:00
final String cmd = ( umsg . startsWith ( " / " ) ) ? ( ( umsg . contains ( " " ) ? umsg . split ( " " ) : new String [ ] { umsg } ) [ 0 ] . substring ( 1 ) ) : ( ( umsg . contains ( " " ) ? umsg . split ( " " ) : new String [ ] { umsg } ) [ 0 ] ) ;
2017-01-30 21:22:36 +01:00
if ( api . commands . keySet ( ) . contains ( cmd . toLowerCase ( ) ) ) {
ArrayList < String > args = new ArrayList < String > ( ) ;
args . addAll ( Arrays . asList ( umsg . contains ( " " ) ? umsg . split ( " " ) : new String [ ] { umsg } ) ) ;
args . remove ( 0 ) ;
2017-12-06 23:34:47 +01:00
new Thread ( ( ) - > {
2017-01-30 21:22:36 +01:00
try {
api . commands . get ( cmd . toLowerCase ( ) ) . command ( cmd , args . toArray ( new String [ args . size ( ) ] ) ) ;
} catch ( Exception e ) {
2017-02-08 01:39:18 +01:00
log . error . println ( new InvocationTargetException ( e , " Uncaught exception while running command " ) ) ;
2017-01-30 21:22:36 +01:00
}
} ) . start ( ) ;
} else {
2017-02-08 01:39:18 +01:00
log . message . println ( " Unknown Command - " + umsg ) ;
2017-01-30 21:22:36 +01:00
}
}
}
}
2017-02-05 23:03:17 +01:00
private void loadDefaults ( ) {
2017-04-01 22:31:57 +02:00
SubCommand . load ( this ) ;
2017-02-05 23:03:17 +01:00
}
2017-02-08 01:39:18 +01:00
/ * *
* Stop SubServers . Host
*
* @param exit Exit Code
* /
2017-01-30 21:22:36 +01:00
public void stop ( int exit ) {
2017-12-06 23:34:47 +01:00
if ( ready ) {
log . info . println ( " Shutting down... " ) ;
SubDisableEvent event = new SubDisableEvent ( this , exit ) ;
api . executeEvent ( event ) ;
2017-04-01 07:37:48 +02:00
2017-12-06 23:34:47 +01:00
forcequit ( event . getExitCode ( ) ) ;
}
} private void forcequit ( int exit ) {
if ( ready ) {
ready = false ;
List < String > subservers = new ArrayList < String > ( ) ;
subservers . addAll ( servers . keySet ( ) ) ;
for ( String server : subservers ) {
servers . get ( server ) . stop ( ) ;
try {
servers . get ( server ) . waitFor ( ) ;
} catch ( Exception e ) {
log . error . println ( e ) ;
}
}
servers . clear ( ) ;
if ( creator ! = null ) {
creator . terminate ( ) ;
try {
creator . waitFor ( ) ;
} catch ( Exception e ) {
log . error . println ( e ) ;
}
}
running = false ;
2017-04-01 07:37:48 +02:00
try {
2017-12-06 23:34:47 +01:00
Thread . sleep ( 500 ) ;
2017-04-01 07:37:48 +02:00
} catch ( Exception e ) {
log . error . println ( e ) ;
}
2017-12-06 23:34:47 +01:00
if ( subdata ! = null ) Util . isException ( ( ) - > subdata . destroy ( 0 ) ) ;
2017-04-01 07:37:48 +02:00
2017-12-06 23:34:47 +01:00
Util . isException ( FileLogger : : end ) ;
System . exit ( exit ) ;
2017-04-01 07:37:48 +02:00
}
2017-01-30 21:22:36 +01:00
}
2017-04-14 04:39:51 +02:00
private void unzip ( InputStream zip , File dir ) {
byte [ ] buffer = new byte [ 1024 ] ;
try {
ZipInputStream zis = new ZipInputStream ( zip ) ;
ZipEntry ze ;
while ( ( ze = zis . getNextEntry ( ) ) ! = null ) {
File newFile = new File ( dir + File . separator + ze . getName ( ) ) ;
if ( ze . isDirectory ( ) ) {
newFile . mkdirs ( ) ;
continue ;
} else if ( ! newFile . getParentFile ( ) . exists ( ) ) {
newFile . getParentFile ( ) . mkdirs ( ) ;
}
FileOutputStream fos = new FileOutputStream ( newFile ) ;
int len ;
while ( ( len = zis . read ( buffer ) ) > 0 ) {
fos . write ( buffer , 0 , len ) ;
}
fos . close ( ) ;
}
zis . closeEntry ( ) ;
zis . close ( ) ;
} catch ( IOException ex ) {
ex . printStackTrace ( ) ;
}
}
2017-01-30 21:22:36 +01:00
}