2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee.Host.Internal ;
2016-12-05 04:21:04 +01:00
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Event.SubCreateEvent ;
2017-01-11 04:23:29 +01:00
import net.ME1312.SubServers.Bungee.Host.* ;
2016-12-28 01:15:36 +01:00
import net.ME1312.SubServers.Bungee.Library.Config.YAMLConfig ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection ;
import net.ME1312.SubServers.Bungee.Library.Container ;
2016-12-29 08:29:22 +01:00
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException ;
2017-07-23 06:32:57 +02:00
import net.ME1312.SubServers.Bungee.Library.Exception.SubCreatorException ;
import net.ME1312.SubServers.Bungee.Library.NamedContainer ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Library.UniversalFile ;
import net.ME1312.SubServers.Bungee.Library.Util ;
import net.ME1312.SubServers.Bungee.Library.Version.Version ;
2017-07-23 06:32:57 +02:00
import net.ME1312.SubServers.Bungee.SubAPI ;
2016-12-28 01:15:36 +01:00
import net.ME1312.SubServers.Bungee.SubPlugin ;
2016-12-15 22:04:39 +01: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
2016-12-15 22:04:39 +01:00
import javax.xml.parsers.DocumentBuilderFactory ;
import java.io.* ;
import java.net.URL ;
import java.nio.charset.Charset ;
2017-05-29 07:00:02 +02:00
import java.util.* ;
2017-09-24 05:19:22 +02:00
import java.util.regex.Pattern ;
2016-12-05 04:21:04 +01:00
2017-01-07 20:06:54 +01:00
/ * *
* Internal SubCreator Class
* /
2017-12-21 17:02:47 +01:00
@SuppressWarnings ( " unchecked " )
2016-12-05 04:21:04 +01:00
public class InternalSubCreator extends SubCreator {
2017-05-29 07:00:02 +02:00
private HashMap < String , ServerTemplate > templates = new HashMap < String , ServerTemplate > ( ) ;
2016-12-15 22:04:39 +01:00
private InternalHost host ;
private String gitBash ;
2017-07-23 06:32:57 +02:00
private TreeMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > thread ;
2016-12-05 04:21:04 +01:00
2017-01-07 20:06:54 +01:00
/ * *
* Creates an Internal SubCreator
*
2018-07-23 05:44:20 +02:00
* @param host Host
2017-01-07 20:06:54 +01:00
* @param gitBash Git Bash
* /
public InternalSubCreator ( InternalHost host , String gitBash ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( host , gitBash ) ) throw new NullPointerException ( ) ;
2017-01-07 20:06:54 +01:00
this . host = host ;
2017-12-21 17:02:47 +01:00
this . gitBash = ( System . getenv ( " ProgramFiles(x86) " ) = = null ) ? Pattern . compile ( " %(ProgramFiles) \\ (x86 \\ )% " , Pattern . CASE_INSENSITIVE ) . matcher ( gitBash ) . replaceAll ( " %$1% " ) : gitBash ;
2017-07-23 06:32:57 +02:00
this . thread = new TreeMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > ( ) ;
2017-08-17 01:29:02 +02:00
reload ( ) ;
}
2017-01-07 20:06:54 +01:00
2017-08-17 01:29:02 +02:00
@Override
public void reload ( ) {
templates . clear ( ) ;
2017-12-21 17:02:47 +01:00
if ( new UniversalFile ( host . plugin . dir , " SubServers:Templates " ) . exists ( ) )
for ( File file : new UniversalFile ( host . plugin . dir , " SubServers:Templates " ) . listFiles ( ) ) {
try {
if ( file . isDirectory ( ) ) {
YAMLSection config = ( new UniversalFile ( file , " template.yml " ) . exists ( ) ) ? new YAMLConfig ( new UniversalFile ( file , " template.yml " ) ) . get ( ) . getSection ( " Template " , new YAMLSection ( ) ) : new YAMLSection ( ) ;
ServerTemplate template = new ServerTemplate ( file . getName ( ) , config . getBoolean ( " Enabled " , true ) , config . getRawString ( " Icon " , " ::NULL:: " ) , file , config . getSection ( " Build " , new YAMLSection ( ) ) , config . getSection ( " Settings " , new YAMLSection ( ) ) ) ;
templates . put ( file . getName ( ) . toLowerCase ( ) , template ) ;
if ( config . getKeys ( ) . contains ( " Display " ) ) template . setDisplayName ( config . getString ( " Display " ) ) ;
}
} catch ( Exception e ) {
System . out . println ( host . getName ( ) + File . separator + " Creator > Couldn't load template: " + file . getName ( ) ) ;
e . printStackTrace ( ) ;
2017-05-29 07:00:02 +02:00
}
2017-01-07 20:06:54 +01:00
}
2017-05-29 07:00:02 +02:00
}
2017-01-07 20:06:54 +01:00
2017-07-23 06:32:57 +02:00
private YAMLSection build ( NamedContainer < InternalSubLogger , Process > thread , File dir , String name , ServerTemplate template , Version version , List < ServerTemplate > history ) throws SubCreatorException {
YAMLSection server = new YAMLSection ( ) ;
boolean error = false ;
if ( history . contains ( template ) ) throw new IllegalStateException ( " Template Import loop detected " ) ;
history . add ( template ) ;
for ( String other : template . getBuildOptions ( ) . getStringList ( " Import " , new ArrayList < String > ( ) ) ) {
if ( templates . keySet ( ) . contains ( other . toLowerCase ( ) ) ) {
YAMLSection config = build ( thread , dir , other , templates . get ( other . toLowerCase ( ) ) , version , history ) ;
if ( config = = null ) {
throw new SubCreatorException ( ) ;
} else {
server . setAll ( config ) ;
}
2017-07-25 21:27:40 +02:00
} else {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Skipping missing template: " + other ) ;
2017-07-23 06:32:57 +02:00
}
}
server . setAll ( template . getConfigOptions ( ) ) ;
2017-05-29 07:00:02 +02:00
try {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Loading Template: " + template . getDisplayName ( ) ) ;
2017-05-29 07:00:02 +02:00
Util . copyDirectory ( template . getDirectory ( ) , dir ) ;
2018-07-26 19:34:31 +02:00
if ( template . getType ( ) = = ServerType . FORGE | | template . getType ( ) = = ServerType . SPONGE ) {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Searching Versions... " ) ;
2018-07-26 19:34:31 +02:00
Document spongexml = DocumentBuilderFactory . newInstance ( ) . newDocumentBuilder ( ) . parse ( new InputSource ( new StringReader ( Util . readAll ( new BufferedReader ( new InputStreamReader ( new URL ( " https://repo.spongepowered.org/maven/org/spongepowered/sponge " + ( ( template . getType ( ) = = ServerType . FORGE ) ? " forge " : " vanilla " ) + " /maven-metadata.xml " ) . openStream ( ) , Charset . forName ( " UTF-8 " ) ) ) ) ) ) ) ;
2017-01-07 20:06:54 +01:00
NodeList spnodeList = spongexml . getElementsByTagName ( " version " ) ;
Version spversion = null ;
for ( int i = 0 ; i < spnodeList . getLength ( ) ; i + + ) {
Node node = spnodeList . item ( i ) ;
if ( node . getNodeType ( ) = = Node . ELEMENT_NODE ) {
if ( node . getTextContent ( ) . startsWith ( version . toString ( ) + '-' ) & & ( spversion = = null | | new Version ( node . getTextContent ( ) ) . compareTo ( spversion ) > = 0 ) ) {
spversion = new Version ( node . getTextContent ( ) ) ;
}
}
}
2017-05-29 07:00:02 +02:00
if ( spversion = = null )
2018-07-19 21:34:58 +02:00
throw new InvalidServerException ( " Cannot find Sponge version for Minecraft " + version . toString ( ) ) ;
2018-07-26 19:34:31 +02:00
System . out . println ( name + File . separator + " Creator > Found \" sponge " + ( ( template . getType ( ) = = ServerType . FORGE ) ? " forge " : " vanilla " ) + " - " + spversion . toString ( ) + '"' ) ;
if ( template . getType ( ) = = ServerType . FORGE ) {
Document forgexml = DocumentBuilderFactory . newInstance ( ) . newDocumentBuilder ( ) . parse ( new InputSource ( new StringReader ( Util . readAll ( new BufferedReader ( new InputStreamReader ( new URL ( " http://files.minecraftforge.net/maven/net/minecraftforge/forge/maven-metadata.xml " ) . openStream ( ) , Charset . forName ( " UTF-8 " ) ) ) ) ) ) ) ;
NodeList mcfnodeList = forgexml . getElementsByTagName ( " version " ) ;
Version mcfversion = null ;
for ( int i = 0 ; i < mcfnodeList . getLength ( ) ; i + + ) {
Node node = mcfnodeList . item ( i ) ;
if ( node . getNodeType ( ) = = Node . ELEMENT_NODE ) {
if ( node . getTextContent ( ) . contains ( spversion . toString ( ) . split ( " \\ - " ) [ 1 ] ) & & ( mcfversion = = null | | new Version ( node . getTextContent ( ) ) . compareTo ( mcfversion ) > = 0 ) ) {
mcfversion = new Version ( node . getTextContent ( ) ) ;
}
2017-01-07 20:06:54 +01:00
}
}
2018-07-26 19:34:31 +02:00
if ( mcfversion = = null )
throw new InvalidServerException ( " Cannot find Forge version for Sponge " + spversion . toString ( ) ) ;
System . out . println ( name + File . separator + " Creator > Found \" forge- " + mcfversion . toString ( ) + '"' ) ;
2017-01-07 20:06:54 +01:00
2018-07-26 19:34:31 +02:00
version = new Version ( mcfversion . toString ( ) + " " + spversion . toString ( ) ) ;
} else version = new Version ( spversion . toString ( ) ) ;
2017-01-07 20:06:54 +01:00
}
2017-05-29 07:00:02 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2017-01-07 20:06:54 +01:00
}
2017-07-19 01:28:59 +02:00
if ( template . getBuildOptions ( ) . contains ( " Shell-Location " ) ) {
2017-12-21 17:02:47 +01:00
String gitBash = this . gitBash + ( ( this . gitBash . endsWith ( File . separator ) ) ? " " : File . separator ) + " bin " + File . separatorChar + " bash.exe " ;
2018-04-07 21:04:55 +02:00
File cache ;
if ( template . getBuildOptions ( ) . getBoolean ( " Use-Cache " , true ) ) {
cache = new UniversalFile ( host . plugin . dir , " SubServers:Cache:Templates: " + template . getName ( ) ) ;
cache . mkdirs ( ) ;
} else {
cache = null ;
}
2017-05-29 07:00:02 +02:00
if ( ! ( System . getProperty ( " os.name " ) . toLowerCase ( ) . indexOf ( " win " ) > = 0 ) & & template . getBuildOptions ( ) . contains ( " Permission " ) ) {
try {
Process process = Runtime . getRuntime ( ) . exec ( " chmod " + template . getBuildOptions ( ) . getRawString ( " Permission " ) + ' ' + template . getBuildOptions ( ) . getRawString ( " Shell-Location " ) , null , dir ) ;
Thread . sleep ( 500 ) ;
2017-01-07 20:06:54 +01:00
if ( process . exitValue ( ) ! = 0 ) {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Couldn't set " + template . getBuildOptions ( ) . getRawString ( " Permission " ) + " permissions to " + template . getBuildOptions ( ) . getRawString ( " Shell-Location " ) ) ;
2017-01-07 20:06:54 +01:00
}
2017-05-29 07:00:02 +02:00
} catch ( Exception e ) {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Couldn't set " + template . getBuildOptions ( ) . getRawString ( " Permission " ) + " permissions to " + template . getBuildOptions ( ) . getRawString ( " Shell-Location " ) ) ;
2017-05-29 07:00:02 +02:00
e . printStackTrace ( ) ;
2017-01-07 20:06:54 +01:00
}
2017-05-29 07:00:02 +02:00
}
2017-01-07 20:06:54 +01:00
2017-05-29 07:00:02 +02:00
try {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Launching " + template . getBuildOptions ( ) . getRawString ( " Shell-Location " ) ) ;
2018-04-07 22:42:09 +02:00
thread . set ( Runtime . getRuntime ( ) . exec ( ( System . getProperty ( " os.name " ) . toLowerCase ( ) . indexOf ( " win " ) > = 0 ) ? " cmd.exe /c \" \" " + gitBash + " \" --login -i -c \" bash " + template . getBuildOptions ( ) . getRawString ( " Shell-Location " ) + ' ' + version . toString ( ) + ' ' + ( ( cache = = null ) ? ':' : cache . toString ( ) . replace ( '\\' , '/' ) . replace ( " " , " \\ " ) ) + " \" \" " : ( " bash " + template . getBuildOptions ( ) . getRawString ( " Shell-Location " ) + ' ' + version . toString ( ) + ' ' + ( ( cache = = null ) ? ':' : cache . toString ( ) . replace ( " " , " \\ " ) ) ) , null , dir ) ) ;
2017-07-23 06:32:57 +02:00
thread . name ( ) . log . set ( host . plugin . config . get ( ) . getSection ( " Settings " ) . getBoolean ( " Log-Creator " ) ) ;
thread . name ( ) . file = new File ( dir , " SubCreator- " + template . getName ( ) + " - " + version . toString ( ) . replace ( " " , " @ " ) + " .log " ) ;
thread . name ( ) . process = thread . get ( ) ;
thread . name ( ) . start ( ) ;
thread . get ( ) . waitFor ( ) ;
2017-05-29 07:00:02 +02:00
Thread . sleep ( 500 ) ;
2017-07-23 06:32:57 +02:00
if ( thread . get ( ) . exitValue ( ) ! = 0 ) error = true ;
2017-07-23 23:05:33 +02:00
} catch ( InterruptedException e ) {
error = true ;
2017-05-29 07:00:02 +02:00
} catch ( Exception e ) {
error = true ;
e . printStackTrace ( ) ;
}
2018-04-07 21:04:55 +02:00
if ( cache ! = null ) {
if ( cache . isDirectory ( ) & & cache . listFiles ( ) . length = = 0 ) cache . delete ( ) ;
cache = new UniversalFile ( host . plugin . dir , " SubServers:Cache:Templates " ) ;
if ( cache . isDirectory ( ) & & cache . listFiles ( ) . length = = 0 ) cache . delete ( ) ;
cache = new UniversalFile ( host . plugin . dir , " SubServers:Cache " ) ;
if ( cache . isDirectory ( ) & & cache . listFiles ( ) . length = = 0 ) cache . delete ( ) ;
}
2017-05-29 07:00:02 +02:00
}
2017-05-30 21:38:51 +02:00
new UniversalFile ( dir , " template.yml " ) . delete ( ) ;
2017-07-23 06:32:57 +02:00
if ( error ) throw new SubCreatorException ( ) ;
return server ;
}
private void run ( UUID player , String name , ServerTemplate template , Version version , int port ) {
NamedContainer < InternalSubLogger , Process > thread = this . thread . get ( name . toLowerCase ( ) ) . get ( ) ;
UniversalFile dir = new UniversalFile ( new File ( host . getPath ( ) ) , name ) ;
dir . mkdirs ( ) ;
2017-11-22 22:58:33 +01:00
YAMLSection server = new YAMLSection ( ) ;
YAMLSection config ;
2017-07-23 06:32:57 +02:00
try {
2017-11-22 22:58:33 +01:00
config = build ( thread , dir , name , template , version , new LinkedList < > ( ) ) ;
2017-07-23 06:32:57 +02:00
generateProperties ( dir , port ) ;
generateClient ( dir , template . getType ( ) , name ) ;
} catch ( SubCreatorException e ) {
2017-11-22 22:58:33 +01:00
config = null ;
2017-07-23 06:32:57 +02:00
} catch ( Exception e ) {
2017-11-22 22:58:33 +01:00
config = null ;
2017-07-23 06:32:57 +02:00
e . printStackTrace ( ) ;
}
2017-11-22 22:58:33 +01:00
if ( config ! = null ) {
2017-05-29 07:00:02 +02:00
try {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Saving... " ) ;
2017-12-21 17:02:47 +01:00
if ( host . plugin . exServers . keySet ( ) . contains ( name . toLowerCase ( ) ) )
host . plugin . exServers . remove ( name . toLowerCase ( ) ) ;
config = new YAMLSection ( ( Map < String , ? > ) convert ( config . get ( ) , new NamedContainer < > ( " $player$ " , ( player = = null ) ? " " : player . toString ( ) ) , new NamedContainer < > ( " $name$ " , name ) , new NamedContainer < > ( " $template$ " , template . getName ( ) ) ,
new NamedContainer < > ( " $type$ " , template . getType ( ) . toString ( ) ) , new NamedContainer < > ( " $version$ " , version . toString ( ) . replace ( " " , " @ " ) ) , new NamedContainer < > ( " $port$ " , Integer . toString ( port ) ) ) ) ;
2017-05-29 07:00:02 +02:00
2017-11-22 22:58:33 +01:00
server . set ( " Enabled " , true ) ;
2017-12-07 23:51:06 +01:00
//server.set("Editable", true);
2017-11-22 22:58:33 +01:00
server . set ( " Display " , " " ) ;
server . set ( " Host " , host . getName ( ) ) ;
server . set ( " Group " , new ArrayList < String > ( ) ) ;
server . set ( " Port " , port ) ;
server . set ( " Motd " , " Some SubServer " ) ;
server . set ( " Log " , true ) ;
server . set ( " Directory " , " . " + File . separatorChar + name ) ;
server . set ( " Executable " , " java -Xmx1024M -jar " + template . getType ( ) . toString ( ) + " .jar " ) ;
server . set ( " Stop-Command " , " stop " ) ;
server . set ( " Run-On-Launch " , false ) ;
server . set ( " Auto-Restart " , false ) ;
server . set ( " Restricted " , false ) ;
server . set ( " Incompatible " , new ArrayList < String > ( ) ) ;
server . set ( " Hidden " , false ) ;
server . setAll ( config ) ;
2017-05-29 07:00:02 +02:00
2017-08-31 02:12:26 +02:00
SubServer subserver = host . addSubServer ( player , name , server . getBoolean ( " Enabled " ) , port , server . getColoredString ( " Motd " , '&' ) , server . getBoolean ( " Log " ) , server . getRawString ( " Directory " ) ,
2018-01-29 07:04:36 +01:00
new Executable ( server . getRawString ( " Executable " ) ) , server . getRawString ( " Stop-Command " ) , server . getBoolean ( " Hidden " ) , server . getBoolean ( " Restricted " ) , false ) ;
2017-12-17 22:04:05 +01:00
if ( ! server . getBoolean ( " Editable " , true ) ) subserver . setEditable ( true ) ;
2018-03-21 21:45:59 +01:00
if ( server . getBoolean ( " Auto-Restart " ) ) subserver . setAutoRestart ( true ) ;
2017-08-31 02:12:26 +02:00
if ( server . getString ( " Display " ) . length ( ) > 0 ) subserver . setDisplayName ( server . getString ( " Display " ) ) ;
for ( String group : server . getStringList ( " Group " ) ) subserver . addGroup ( group ) ;
2017-12-21 17:02:47 +01:00
if ( server . contains ( " Extra " ) ) for ( String extra : server . getSection ( " Extra " ) . getKeys ( ) )
subserver . addExtra ( extra , server . getSection ( " Extra " ) . getObject ( extra ) ) ;
2017-05-29 07:00:02 +02:00
host . plugin . config . get ( ) . getSection ( " Servers " ) . set ( name , server ) ;
host . plugin . config . save ( ) ;
2018-01-29 07:04:36 +01:00
if ( template . getBuildOptions ( ) . getBoolean ( " Run-On-Finish " , true ) )
subserver . start ( ) ;
2017-05-29 07:00:02 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2017-01-07 20:06:54 +01:00
}
2017-05-29 07:00:02 +02:00
} else {
2017-11-22 22:58:33 +01:00
System . out . println ( name + File . separator + " Creator > Couldn't build the server jar. Check the SubCreator logs for more detail. " ) ;
2017-01-07 20:06:54 +01:00
}
2017-07-23 06:32:57 +02:00
this . thread . remove ( name . toLowerCase ( ) ) ;
2017-12-21 17:02:47 +01:00
} private Object convert ( Object value , NamedContainer < String , String > . . . replacements ) {
if ( value instanceof Map ) {
List < String > list = new ArrayList < String > ( ) ;
list . addAll ( ( ( Map < String , Object > ) value ) . keySet ( ) ) ;
for ( String key : list ) ( ( Map < String , Object > ) value ) . put ( key , convert ( ( ( Map < String , Object > ) value ) . get ( key ) , replacements ) ) ;
return value ;
} else if ( value instanceof Collection ) {
List < Object > list = new ArrayList < Object > ( ) ;
for ( Object val : ( Collection < Object > ) value ) list . add ( convert ( val , replacements ) ) ;
return list ;
} else if ( value . getClass ( ) . isArray ( ) ) {
List < Object > list = new ArrayList < Object > ( ) ;
for ( int i = 0 ; i < ( ( Object [ ] ) value ) . length ; i + + ) list . add ( convert ( ( ( Object [ ] ) value ) [ i ] , replacements ) ) ;
return list ;
} else if ( value instanceof String ) {
return replace ( ( String ) value , replacements ) ;
} else {
return value ;
}
} private String replace ( String string , NamedContainer < String , String > . . . replacements ) {
for ( NamedContainer < String , String > replacement : replacements ) string = string . replace ( replacement . name ( ) , replacement . get ( ) ) ;
return string ;
2017-01-07 20:06:54 +01:00
}
@Override
2017-05-29 07:00:02 +02:00
public boolean create ( UUID player , String name , ServerTemplate template , Version version , int port ) {
if ( Util . isNull ( name , template , version , port ) ) throw new NullPointerException ( ) ;
2017-12-21 17:02:47 +01:00
if ( host . isEnabled ( ) & & template . isEnabled ( ) & & ! SubAPI . getInstance ( ) . getSubServers ( ) . keySet ( ) . contains ( name . toLowerCase ( ) ) & & ! SubCreator . isReserved ( name ) ) {
2017-08-31 02:12:26 +02:00
NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > thread = new NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > ( null , new NamedContainer < InternalSubLogger , Process > ( new InternalSubLogger ( null , this , name + File . separator + " Creator " , new Container < Boolean > ( false ) , null ) , null ) ) ;
this . thread . put ( name . toLowerCase ( ) , thread ) ;
2017-05-29 07:00:02 +02:00
final SubCreateEvent event = new SubCreateEvent ( player , host , name , template , version , port ) ;
2017-01-07 20:06:54 +01:00
host . plugin . getPluginManager ( ) . callEvent ( event ) ;
if ( ! event . isCancelled ( ) ) {
2017-08-31 02:12:26 +02:00
thread . rename ( new Thread ( ( ) - > InternalSubCreator . this . run ( player , name , event . getTemplate ( ) , event . getVersion ( ) , port ) ) ) ;
2017-07-23 06:32:57 +02:00
thread . name ( ) . start ( ) ;
2017-01-07 20:06:54 +01:00
return true ;
2017-08-31 02:12:26 +02:00
} else {
this . thread . remove ( name . toLowerCase ( ) ) ;
return false ;
}
2017-01-07 20:06:54 +01:00
} else return false ;
}
@Override
public void terminate ( ) {
2017-07-23 06:32:57 +02:00
HashMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > temp = new HashMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > ( ) ;
temp . putAll ( thread ) ;
for ( String i : temp . keySet ( ) ) {
terminate ( i ) ;
}
}
@Override
public void terminate ( String name ) {
2017-07-23 23:05:33 +02:00
if ( this . thread . get ( name . toLowerCase ( ) ) . get ( ) . get ( ) ! = null & & this . thread . get ( name . toLowerCase ( ) ) . get ( ) . get ( ) . isAlive ( ) ) {
this . thread . get ( name . toLowerCase ( ) ) . get ( ) . get ( ) . destroyForcibly ( ) ;
2017-07-25 21:27:40 +02:00
} else if ( this . thread . get ( name . toLowerCase ( ) ) . name ( ) ! = null & & this . thread . get ( name . toLowerCase ( ) ) . name ( ) . isAlive ( ) ) {
2017-07-23 23:05:33 +02:00
this . thread . get ( name . toLowerCase ( ) ) . name ( ) . interrupt ( ) ;
2017-07-25 21:27:40 +02:00
this . thread . remove ( name . toLowerCase ( ) ) ;
2017-01-07 20:06:54 +01:00
}
}
@Override
public void waitFor ( ) throws InterruptedException {
2017-07-23 06:32:57 +02:00
HashMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > temp = new HashMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > ( ) ;
temp . putAll ( thread ) ;
for ( String i : temp . keySet ( ) ) {
waitFor ( i ) ;
}
}
@Override
public void waitFor ( String name ) throws InterruptedException {
2017-07-25 21:27:40 +02:00
while ( this . thread . keySet ( ) . contains ( name . toLowerCase ( ) ) & & this . thread . get ( name . toLowerCase ( ) ) . name ( ) ! = null & & this . thread . get ( name . toLowerCase ( ) ) . name ( ) . isAlive ( ) ) {
2017-01-07 20:06:54 +01:00
Thread . sleep ( 250 ) ;
}
}
@Override
public Host getHost ( ) {
return host ;
}
@Override
2017-01-21 17:49:37 +01:00
public String getBashDirectory ( ) {
2017-01-07 20:06:54 +01:00
return gitBash ;
}
2017-01-11 04:23:29 +01:00
@Override
2017-07-23 06:32:57 +02:00
public List < SubLogger > getLogger ( ) {
List < SubLogger > loggers = new ArrayList < SubLogger > ( ) ;
HashMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > temp = new HashMap < String , NamedContainer < Thread , NamedContainer < InternalSubLogger , Process > > > ( ) ;
temp . putAll ( thread ) ;
for ( String i : temp . keySet ( ) ) {
loggers . add ( getLogger ( i ) ) ;
}
return loggers ;
}
@Override
2017-07-23 23:05:33 +02:00
public SubLogger getLogger ( String name ) {
return this . thread . get ( name . toLowerCase ( ) ) . get ( ) . name ( ) ;
2017-01-11 04:23:29 +01:00
}
2017-01-07 20:06:54 +01:00
@Override
2017-07-23 06:32:57 +02:00
public List < String > getReservedNames ( ) {
return new ArrayList < String > ( thread . keySet ( ) ) ;
2017-01-07 20:06:54 +01:00
}
2017-05-29 07:00:02 +02:00
@Override
public Map < String , ServerTemplate > getTemplates ( ) {
return new TreeMap < String , ServerTemplate > ( templates ) ;
2017-01-07 20:06:54 +01:00
}
2016-12-15 22:04:39 +01:00
2017-05-29 07:00:02 +02:00
@Override
public ServerTemplate getTemplate ( String name ) {
if ( Util . isNull ( name ) ) throw new NullPointerException ( ) ;
return getTemplates ( ) . get ( name . toLowerCase ( ) ) ;
}
2016-12-15 22:04:39 +01:00
2017-05-29 07:00:02 +02:00
private void generateClient ( File dir , ServerType type , String name ) throws IOException {
if ( new UniversalFile ( dir , " subservers.client " ) . exists ( ) ) {
if ( type = = ServerType . SPIGOT ) {
if ( ! new UniversalFile ( dir , " plugins " ) . exists ( ) ) new UniversalFile ( dir , " plugins " ) . mkdirs ( ) ;
2018-07-17 09:10:17 +02:00
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/Library/Files/client.jar " , new UniversalFile ( dir , " plugins:SubServers.Client.jar " ) . getPath ( ) ) ;
2018-07-26 19:34:31 +02:00
} else if ( type = = ServerType . FORGE | | type = = ServerType . SPONGE ) {
2018-07-23 05:44:20 +02:00
if ( ! new UniversalFile ( dir , " mods " ) . exists ( ) ) new UniversalFile ( dir , " mods " ) . mkdirs ( ) ;
Util . copyFromJar ( SubPlugin . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/Library/Files/client.jar " , new UniversalFile ( dir , " mods:SubServers.Client.jar " ) . getPath ( ) ) ;
2017-05-29 07:00:02 +02:00
}
2018-04-15 03:53:51 +02:00
YAMLSection config = new YAMLSection ( ) ;
2017-05-29 07:00:02 +02:00
FileWriter writer = new FileWriter ( new UniversalFile ( dir , " subservers.client " ) , false ) ;
2018-04-15 03:53:51 +02:00
config . set ( " Name " , name ) ;
config . set ( " Address " , host . plugin . config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1 " ) . replace ( " 0.0.0.0 " , " 127.0.0.1 " ) ) ;
config . set ( " Password " , host . plugin . config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Password " , " " ) ) ;
config . set ( " Encryption " , host . plugin . config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Encryption " , " NONE " ) ) ;
writer . write ( config . toJSON ( ) ) ;
2017-05-29 07:00:02 +02:00
writer . close ( ) ;
}
2016-12-15 22:04:39 +01:00
}
2017-04-14 04:39:51 +02:00
private void generateProperties ( File dir , int port ) throws IOException {
File file = new File ( dir , " server.properties " ) ;
2017-05-29 07:00:02 +02:00
if ( ! file . exists ( ) ) file . createNewFile ( ) ;
2017-12-15 01:50:39 +01:00
InputStream stream = new FileInputStream ( file ) ;
String content = Util . readAll ( new BufferedReader ( new InputStreamReader ( stream ) ) ) . replace ( " server-port= " , " server-port= " + port ) . replace ( " server-ip= " , " server-ip= " + host . getAddress ( ) . getHostAddress ( ) ) ;
stream . close ( ) ;
2017-04-14 04:39:51 +02:00
file . delete ( ) ;
PrintWriter writer = new PrintWriter ( file , " UTF-8 " ) ;
writer . write ( content ) ;
2016-12-15 22:04:39 +01:00
writer . close ( ) ;
}
2017-11-22 22:58:33 +01:00
}