2017-08-22 15:02:23 +02:00
package net.ME1312.SubServers.Sync ;
2018-07-27 21:36:51 +02:00
import com.google.gson.Gson ;
2018-01-02 23:29:25 +01:00
import net.ME1312.SubServers.Sync.Library.Compatibility.CommandX ;
2018-07-27 21:36:51 +02:00
import net.ME1312.SubServers.Sync.Library.Config.YAMLSection ;
2017-12-08 08:35:50 +01:00
import net.ME1312.SubServers.Sync.Library.NamedContainer ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Library.Util ;
import net.ME1312.SubServers.Sync.Library.Version.Version ;
2018-08-05 23:41:17 +02:00
import net.ME1312.SubServers.Sync.Network.API.Proxy ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Network.Packet.* ;
import net.ME1312.SubServers.Sync.Server.Server ;
import net.ME1312.SubServers.Sync.Server.SubServer ;
import net.md_5.bungee.api.ChatColor ;
import net.md_5.bungee.api.CommandSender ;
import net.md_5.bungee.api.chat.ClickEvent ;
import net.md_5.bungee.api.chat.HoverEvent ;
import net.md_5.bungee.api.chat.TextComponent ;
import net.md_5.bungee.api.connection.ProxiedPlayer ;
import net.md_5.bungee.api.plugin.Command ;
import net.md_5.bungee.command.ConsoleCommandSender ;
import java.io.BufferedReader ;
import java.io.InputStreamReader ;
import java.net.URL ;
import java.nio.charset.Charset ;
import java.util.* ;
2018-01-02 23:29:25 +01:00
import java.util.concurrent.TimeUnit ;
2017-08-22 15:02:23 +02:00
@SuppressWarnings ( " deprecation " )
2018-01-02 23:29:25 +01:00
public final class SubCommand extends CommandX {
private NamedContainer < Long , TreeMap < String , List < String > > > templateCache = new NamedContainer < Long , TreeMap < String , List < String > > > ( 0L , new TreeMap < String , List < String > > ( ) ) ;
2017-08-22 15:02:23 +02:00
private SubPlugin plugin ;
private String label ;
2018-01-02 23:29:25 +01:00
protected static NamedContainer < SubCommand , CommandX > newInstance ( SubPlugin plugin , String command ) {
NamedContainer < SubCommand , CommandX > cmd = new NamedContainer < > ( new SubCommand ( plugin , command ) , null ) ;
CommandX now = cmd . name ( ) ;
2018-07-15 07:23:11 +02:00
//if (plugin.api.getGameVersion()[plugin.api.getGameVersion().length - 1].compareTo(new Version("1.13")) >= 0) { // TODO Future Command Validator API?
// now = new net.ME1312.SubServers.Sync.Library.Compatibility.v1_13.CommandX(cmd.name());
//}
2018-01-02 23:29:25 +01:00
cmd . set ( now ) ;
return cmd ;
}
private SubCommand ( SubPlugin plugin , String command ) {
super ( command ) ;
2017-08-22 15:02:23 +02:00
this . plugin = plugin ;
2018-01-02 23:29:25 +01:00
this . label = '/' + command ;
2017-08-22 15:02:23 +02:00
}
2018-07-27 21:36:51 +02:00
@SuppressWarnings ( " unchecked " )
2017-08-22 15:02:23 +02:00
@Override
public void execute ( CommandSender sender , String [ ] args ) {
if ( sender instanceof ConsoleCommandSender ) {
if ( plugin . subdata = = null ) {
throw new IllegalStateException ( " SubData is not connected " ) ;
} else if ( plugin . lang = = null ) {
throw new IllegalStateException ( " There are no lang options available at this time " ) ;
} else {
if ( args . length > 0 ) {
if ( args [ 0 ] . equalsIgnoreCase ( " help " ) | | args [ 0 ] . equalsIgnoreCase ( " ? " ) ) {
sender . sendMessages ( printHelp ( ) ) ;
} else if ( args [ 0 ] . equalsIgnoreCase ( " version " ) | | args [ 0 ] . equalsIgnoreCase ( " ver " ) ) {
2018-06-09 18:19:25 +02:00
sender . sendMessage ( " SubServers > These are the platforms and versions that are running SubServers.Sync: " ) ;
sender . sendMessage ( " " + System . getProperty ( " os.name " ) + ' ' + System . getProperty ( " os.version " ) + ',' ) ;
sender . sendMessage ( " Java " + System . getProperty ( " java.version " ) + ',' ) ;
sender . sendMessage ( " " + plugin . getBungeeName ( ) + ( ( plugin . isPatched ) ? " [Patched] " : " " ) + net . md_5 . bungee . Bootstrap . class . getPackage ( ) . getImplementationVersion ( ) + ',' ) ;
2018-07-29 20:39:42 +02:00
sender . sendMessage ( " SubServers.Sync v " + SubPlugin . version . toExtendedString ( ) + ( ( plugin . api . getWrapperBuild ( ) ! = null ) ? " ( " + plugin . api . getWrapperBuild ( ) + ')' : " " ) ) ;
2018-06-09 18:19:25 +02:00
sender . sendMessage ( " " ) ;
2018-03-14 04:38:26 +01:00
new Thread ( ( ) - > {
try {
2018-07-27 21:36:51 +02:00
YAMLSection tags = new YAMLSection ( new Gson ( ) . fromJson ( " { \" tags \" : " + Util . readAll ( new BufferedReader ( new InputStreamReader ( new URL ( " https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags " ) . openStream ( ) , Charset . forName ( " UTF-8 " ) ) ) ) + '}' , Map . class ) ) ;
2018-07-29 20:39:42 +02:00
List < Version > versions = new LinkedList < Version > ( ) ;
2017-08-22 15:02:23 +02:00
2018-03-14 04:38:26 +01:00
Version updversion = plugin . version ;
2018-03-14 22:50:15 +01:00
int updcount = 0 ;
2018-07-29 20:39:42 +02:00
for ( YAMLSection tag : tags . getSectionList ( " tags " ) ) versions . add ( Version . fromString ( tag . getString ( " ref " ) . substring ( 10 ) ) ) ;
Collections . sort ( versions ) ;
for ( Version version : versions ) {
2018-07-29 05:02:47 +02:00
if ( version . compareTo ( updversion ) > 0 ) {
2018-07-27 21:36:51 +02:00
updversion = version ;
updcount + + ;
2017-08-22 15:02:23 +02:00
}
}
2018-03-14 22:50:15 +01:00
if ( updcount = = 0 ) {
2018-03-14 04:38:26 +01:00
sender . sendMessage ( " You are on the latest version. " ) ;
} else {
2018-03-16 03:45:54 +01:00
sender . sendMessage ( " SubServers.Sync v " + updversion + " is available. You are " + updcount + " version " + ( ( updcount = = 1 ) ? " " : " s " ) + " behind. " ) ;
2018-03-14 04:38:26 +01:00
}
} catch ( Exception e ) {
}
} ) . start ( ) ;
2017-08-22 15:02:23 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " list " ) ) {
2018-04-15 03:53:51 +02:00
plugin . subdata . sendPacket ( new PacketDownloadServerList ( null , null , data - > {
2017-08-22 15:02:23 +02:00
int i = 0 ;
2017-08-26 07:19:59 +02:00
boolean sent = false ;
String div = ChatColor . RESET + " , " ;
2018-04-15 03:53:51 +02:00
if ( data . getSection ( " groups " ) . getKeys ( ) . size ( ) > 0 ) {
2018-01-22 03:49:18 +01:00
sender . sendMessage ( " SubServers > Group/Server List: " ) ;
2018-04-15 03:53:51 +02:00
for ( String group : data . getSection ( " groups " ) . getKeys ( ) ) {
2018-07-23 05:44:20 +02:00
String message = " " ;
2018-01-22 03:49:18 +01:00
message + = ChatColor . GOLD + group + ChatColor . RESET + " : " ;
2018-04-15 03:53:51 +02:00
for ( String server : data . getSection ( " groups " ) . getSection ( group ) . getKeys ( ) ) {
2018-01-22 03:49:18 +01:00
if ( i ! = 0 ) message + = div ;
2018-04-15 03:53:51 +02:00
if ( ! data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . contains ( " enabled " ) ) {
2018-01-22 03:49:18 +01:00
message + = ChatColor . WHITE ;
2018-04-15 03:53:51 +02:00
} else if ( data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . getBoolean ( " temp " ) ) {
2018-01-22 03:49:18 +01:00
message + = ChatColor . AQUA ;
2018-04-15 03:53:51 +02:00
} else if ( data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . getBoolean ( " running " ) ) {
2018-01-22 03:49:18 +01:00
message + = ChatColor . GREEN ;
2018-04-15 03:53:51 +02:00
} else if ( data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . getBoolean ( " enabled " ) & & data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . getList ( " incompatible " ) . size ( ) = = 0 ) {
2018-01-22 03:49:18 +01:00
message + = ChatColor . YELLOW ;
} else {
message + = ChatColor . RED ;
}
2018-04-15 03:53:51 +02:00
message + = data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . getRawString ( " display " ) + " ( " + data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . getRawString ( " address " ) + ( ( server . equals ( data . getSection ( " groups " ) . getSection ( group ) . getSection ( server ) . getRawString ( " display " ) ) ) ? " " : ChatColor . stripColor ( div ) + server ) + " ) " ;
2018-01-22 03:49:18 +01:00
i + + ;
2017-08-26 07:19:59 +02:00
}
2018-01-22 03:49:18 +01:00
if ( i = = 0 ) message + = ChatColor . RESET + " (none) " ;
sender . sendMessage ( message ) ;
i = 0 ;
sent = true ;
2017-08-26 07:19:59 +02:00
}
2018-01-22 03:49:18 +01:00
if ( ! sent ) sender . sendMessage ( ChatColor . RESET + " (none) " ) ;
sent = false ;
2017-08-26 07:19:59 +02:00
}
sender . sendMessage ( " SubServers > Host/SubServer List: " ) ;
2018-04-15 03:53:51 +02:00
for ( String host : data . getSection ( " hosts " ) . getKeys ( ) ) {
2018-07-23 05:44:20 +02:00
String message = " " ;
2018-04-15 03:53:51 +02:00
if ( data . getSection ( " hosts " ) . getSection ( host ) . getBoolean ( " enabled " ) ) {
2017-08-22 15:02:23 +02:00
message + = ChatColor . AQUA ;
} else {
message + = ChatColor . RED ;
}
2018-04-15 03:53:51 +02:00
message + = data . getSection ( " hosts " ) . getSection ( host ) . getRawString ( " display " ) + " ( " + data . getSection ( " hosts " ) . getSection ( host ) . getRawString ( " address " ) + ( ( host . equals ( data . getSection ( " hosts " ) . getSection ( host ) . getRawString ( " display " ) ) ) ? " " : ChatColor . stripColor ( div ) + host ) + " ) " + ChatColor . RESET + " : " ;
for ( String subserver : data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getKeys ( ) ) {
2017-08-22 15:02:23 +02:00
if ( i ! = 0 ) message + = div ;
2018-04-15 03:53:51 +02:00
if ( data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getBoolean ( " temp " ) ) {
2017-08-22 15:02:23 +02:00
message + = ChatColor . AQUA ;
2018-04-15 03:53:51 +02:00
} else if ( data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getBoolean ( " running " ) ) {
2017-08-22 15:02:23 +02:00
message + = ChatColor . GREEN ;
2018-04-15 03:53:51 +02:00
} else if ( data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getBoolean ( " enabled " ) & & data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getList ( " incompatible " ) . size ( ) = = 0 ) {
2017-08-22 15:02:23 +02:00
message + = ChatColor . YELLOW ;
} else {
message + = ChatColor . RED ;
}
2018-04-15 03:53:51 +02:00
message + = data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getRawString ( " display " ) + " ( " + data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getRawString ( " address " ) . split ( " : " ) [ data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getRawString ( " address " ) . split ( " : " ) . length - 1 ] + ( ( subserver . equals ( data . getSection ( " hosts " ) . getSection ( host ) . getSection ( " servers " ) . getSection ( subserver ) . getRawString ( " display " ) ) ) ? " " : ChatColor . stripColor ( div ) + subserver ) + " ) " ;
2017-08-22 15:02:23 +02:00
i + + ;
}
2017-08-26 07:19:59 +02:00
if ( i = = 0 ) message + = ChatColor . RESET + " (none) " ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( message ) ;
i = 0 ;
2017-08-26 07:19:59 +02:00
sent = true ;
2017-08-22 15:02:23 +02:00
}
2017-08-26 07:19:59 +02:00
if ( ! sent ) sender . sendMessage ( ChatColor . RESET + " (none) " ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " SubServers > Server List: " ) ;
2018-07-23 05:44:20 +02:00
String message = " " ;
2018-04-15 03:53:51 +02:00
for ( String server : data . getSection ( " servers " ) . getKeys ( ) ) {
2017-08-22 15:02:23 +02:00
if ( i ! = 0 ) message + = div ;
2018-04-15 03:53:51 +02:00
message + = ChatColor . WHITE + data . getSection ( " servers " ) . getSection ( server ) . getRawString ( " display " ) + " ( " + data . getSection ( " servers " ) . getSection ( server ) . getRawString ( " address " ) + ( ( server . equals ( data . getSection ( " servers " ) . getSection ( server ) . getRawString ( " display " ) ) ) ? " " : ChatColor . stripColor ( div ) + server ) + " ) " ;
2017-08-22 15:02:23 +02:00
i + + ;
}
2017-08-26 07:19:59 +02:00
if ( i = = 0 ) message + = ChatColor . RESET + " (none) " ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( message ) ;
2018-08-05 23:41:17 +02:00
if ( data . getSection ( " proxies " ) . getKeys ( ) . size ( ) > 0 ) {
sender . sendMessage ( " SubServers > Proxy List: " ) ;
message = " (master) " ;
for ( String proxy : data . getSection ( " proxies " ) . getKeys ( ) ) {
2018-08-06 04:07:18 +02:00
message + = div ;
if ( data . getSection ( " proxies " ) . getSection ( proxy ) . getKeys ( ) . contains ( " subdata " ) & & data . getSection ( " proxies " ) . getSection ( proxy ) . getBoolean ( " redis " ) ) {
message + = ChatColor . GREEN ;
} else if ( data . getSection ( " proxies " ) . getSection ( proxy ) . getKeys ( ) . contains ( " subdata " ) ) {
message + = ChatColor . AQUA ;
} else if ( data . getSection ( " proxies " ) . getSection ( proxy ) . getBoolean ( " redis " ) ) {
message + = ChatColor . WHITE ;
} else {
message + = ChatColor . RED ;
}
message + = data . getSection ( " proxies " ) . getSection ( proxy ) . getString ( " display " ) + ( ( proxy . equals ( data . getSection ( " proxies " ) . getSection ( proxy ) . getString ( " display " ) ) ) ? " " : " ( " + proxy + ')' ) ;
2018-08-05 23:41:17 +02:00
}
sender . sendMessage ( message ) ;
}
2017-08-22 15:02:23 +02:00
} ) ) ;
} else if ( args [ 0 ] . equalsIgnoreCase ( " info " ) | | args [ 0 ] . equalsIgnoreCase ( " status " ) ) {
if ( args . length > 1 ) {
2018-04-15 03:53:51 +02:00
plugin . subdata . sendPacket ( new PacketDownloadServerInfo ( args [ 1 ] . toLowerCase ( ) , data - > {
switch ( data . getRawString ( " type " ) . toLowerCase ( ) ) {
2017-08-22 15:02:23 +02:00
case " invalid " :
sender . sendMessage ( " SubServers > There is no server with that name " ) ;
break ;
case " subserver " :
2018-04-15 03:53:51 +02:00
sender . sendMessage ( " SubServers > Info on " + data . getSection ( " server " ) . getRawString ( " display " ) + ':' ) ;
if ( ! data . getSection ( " server " ) . getRawString ( " name " ) . equals ( data . getSection ( " server " ) . getRawString ( " display " ) ) ) sender . sendMessage ( " - Real Name: " + data . getSection ( " server " ) . getRawString ( " name " ) ) ;
sender . sendMessage ( " - Host: " + data . getSection ( " server " ) . getRawString ( " host " ) ) ;
sender . sendMessage ( " - Enabled: " + ( ( data . getSection ( " server " ) . getBoolean ( " enabled " ) ) ? " yes " : " no " ) ) ;
sender . sendMessage ( " - Editable: " + ( ( data . getSection ( " server " ) . getBoolean ( " editable " ) ) ? " yes " : " no " ) ) ;
if ( data . getSection ( " server " ) . getList ( " group " ) . size ( ) > 0 ) {
2017-08-26 07:19:59 +02:00
sender . sendMessage ( " - Group: " ) ;
2018-04-15 03:53:51 +02:00
for ( int i = 0 ; i < data . getSection ( " server " ) . getList ( " group " ) . size ( ) ; i + + )
sender . sendMessage ( " - " + data . getSection ( " server " ) . getList ( " group " ) . get ( i ) . asRawString ( ) ) ;
2017-08-26 07:19:59 +02:00
}
2018-04-15 03:53:51 +02:00
if ( data . getSection ( " server " ) . getBoolean ( " temp " ) ) sender . sendMessage ( " - Temporary: yes " ) ;
sender . sendMessage ( " - Running: " + ( ( data . getSection ( " server " ) . getBoolean ( " running " ) ) ? " yes " : " no " ) ) ;
sender . sendMessage ( " - Logging: " + ( ( data . getSection ( " server " ) . getBoolean ( " log " ) ) ? " yes " : " no " ) ) ;
sender . sendMessage ( " - Address: " + data . getSection ( " server " ) . getRawString ( " address " ) ) ;
sender . sendMessage ( " - Auto Restart: " + ( ( data . getSection ( " server " ) . getBoolean ( " auto-restart " ) ) ? " yes " : " no " ) ) ;
sender . sendMessage ( " - Hidden: " + ( ( data . getSection ( " server " ) . getBoolean ( " hidden " ) ) ? " yes " : " no " ) ) ;
if ( data . getSection ( " server " ) . getList ( " incompatible-list " ) . size ( ) > 0 ) {
2017-08-22 15:02:23 +02:00
List < String > current = new ArrayList < String > ( ) ;
2018-04-15 03:53:51 +02:00
for ( int i = 0 ; i < data . getSection ( " server " ) . getList ( " incompatible " ) . size ( ) ; i + + ) current . add ( data . getSection ( " server " ) . getList ( " incompatible " ) . get ( i ) . asRawString ( ) . toLowerCase ( ) ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " - Incompatibilities: " ) ;
2018-04-15 03:53:51 +02:00
for ( int i = 0 ; i < data . getSection ( " server " ) . getList ( " incompatible-list " ) . size ( ) ; i + + )
sender . sendMessage ( " - " + data . getSection ( " server " ) . getList ( " incompatible-list " ) . get ( i ) . asRawString ( ) + ( ( current . contains ( data . getSection ( " server " ) . getList ( " incompatible-list " ) . get ( i ) . asRawString ( ) . toLowerCase ( ) ) ) ? " * " : " " ) ) ;
2017-08-22 15:02:23 +02:00
}
2018-04-15 03:53:51 +02:00
sender . sendMessage ( " - Signature: " + data . getSection ( " server " ) . getRawString ( " signature " ) ) ;
2017-08-22 15:02:23 +02:00
break ;
default :
sender . sendMessage ( " SubSevrers > That Server is not a SubServer " ) ;
}
} ) ) ;
} else {
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 1 ] . toLowerCase ( ) + " <SubServer> " ) ;
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " start " ) ) {
if ( args . length > 1 ) {
2018-04-15 03:53:51 +02:00
plugin . subdata . sendPacket ( new PacketStartServer ( null , args [ 1 ] , data - > {
switch ( data . getInt ( " r " ) ) {
2017-08-22 15:02:23 +02:00
case 3 :
sender . sendMessage ( " SubServers > There is no server with that name " ) ;
break ;
case 4 :
sender . sendMessage ( " SubServers > That Server is not a SubServer " ) ;
break ;
case 5 :
2018-04-15 03:53:51 +02:00
if ( data . getRawString ( " m " ) . contains ( " Host " ) ) {
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " SubServers > That SubServer's Host is not enabled " ) ;
} else {
sender . sendMessage ( " SubServers > That SubServer is not enabled " ) ;
}
break ;
case 6 :
sender . sendMessage ( " SubServers > That SubServer is already running " ) ;
break ;
case 0 :
case 1 :
sender . sendMessage ( " SubServers > Server was started successfully " ) ;
break ;
default :
2018-04-15 03:53:51 +02:00
System . out . println ( " PacketStartServer(null, " + args [ 1 ] + " ) responded with: " + data . getRawString ( " m " ) ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " SubServers > Server was started successfully " ) ;
break ;
}
} ) ) ;
} else {
sender . sendMessage ( " Usage: " + label + " <SubServer> " ) ;
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " stop " ) ) {
if ( args . length > 1 ) {
2018-04-15 03:53:51 +02:00
plugin . subdata . sendPacket ( new PacketStopServer ( null , args [ 1 ] , false , data - > {
switch ( data . getInt ( " r " ) ) {
2017-08-22 15:02:23 +02:00
case 3 :
sender . sendMessage ( " SubServers > There is no server with that name " ) ;
break ;
case 4 :
sender . sendMessage ( " SubServers > That Server is not a SubServer " ) ;
break ;
case 5 :
sender . sendMessage ( " SubServers > That SubServer is not running " ) ;
break ;
case 0 :
case 1 :
sender . sendMessage ( " SubServers > Server was stopped successfully " ) ;
break ;
default :
2018-04-15 03:53:51 +02:00
System . out . println ( " PacketStopServer(null, " + args [ 1 ] + " , false) responded with: " + data . getRawString ( " m " ) ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " SubServers > Server was stopped successfully " ) ;
break ;
}
} ) ) ;
} else {
sender . sendMessage ( " Usage: " + label + " <SubServer> " ) ;
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " kill " ) | | args [ 0 ] . equalsIgnoreCase ( " terminate " ) ) {
if ( args . length > 1 ) {
2018-04-15 03:53:51 +02:00
plugin . subdata . sendPacket ( new PacketStopServer ( null , args [ 1 ] , true , data - > {
switch ( data . getInt ( " r " ) ) {
2017-08-22 15:02:23 +02:00
case 3 :
sender . sendMessage ( " SubServers > There is no server with that name " ) ;
break ;
case 4 :
sender . sendMessage ( " SubServers > That Server is not a SubServer " ) ;
break ;
case 5 :
sender . sendMessage ( " SubServers > That SubServer is not running " ) ;
break ;
case 0 :
case 1 :
sender . sendMessage ( " SubServers > Server was terminated successfully " ) ;
break ;
default :
2018-04-15 03:53:51 +02:00
System . out . println ( " PacketStopServer(null, " + args [ 1 ] + " , true) responded with: " + data . getRawString ( " m " ) ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " SubServers > Server was terminated successfully " ) ;
break ;
}
} ) ) ;
} else {
sender . sendMessage ( " Usage: " + label + " <SubServer> " ) ;
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " cmd " ) | | args [ 0 ] . equalsIgnoreCase ( " command " ) ) {
if ( args . length > 2 ) {
int i = 2 ;
String str = args [ 2 ] ;
if ( args . length > 3 ) {
do {
i + + ;
str = str + " " + args [ i ] ;
} while ( ( i + 1 ) ! = args . length ) ;
}
final String cmd = str ;
2018-04-15 03:53:51 +02:00
plugin . subdata . sendPacket ( new PacketCommandServer ( null , args [ 1 ] , cmd , data - > {
switch ( data . getInt ( " r " ) ) {
2017-08-22 15:02:23 +02:00
case 3 :
sender . sendMessage ( " SubServers > There is no server with that name " ) ;
break ;
case 4 :
sender . sendMessage ( " SubServers > That Server is not a SubServer " ) ;
break ;
case 5 :
sender . sendMessage ( " SubServers > That SubServer is not running " ) ;
break ;
case 0 :
case 1 :
sender . sendMessage ( " SubServers > Command was sent successfully " ) ;
break ;
default :
2018-04-15 03:53:51 +02:00
System . out . println ( " PacketCommandServer(null, " + args [ 1 ] + " , / " + cmd + " ) responded with: " + data . getRawString ( " m " ) ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " SubServers > Command was sent successfully " ) ;
break ;
}
} ) ) ;
} else {
sender . sendMessage ( " Usage: " + label + " <SubServer> <Command> [Args...] " ) ;
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " create " ) ) {
if ( args . length > 5 ) {
if ( Util . isException ( ( ) - > Integer . parseInt ( args [ 5 ] ) ) ) {
sender . sendMessage ( " Invalid Port Number " ) ;
} else {
2018-04-15 03:53:51 +02:00
plugin . subdata . sendPacket ( new PacketCreateServer ( null , args [ 1 ] , args [ 2 ] , args [ 3 ] , new Version ( args [ 4 ] ) , Integer . parseInt ( args [ 5 ] ) , data - > {
switch ( data . getInt ( " r " ) ) {
2017-08-22 15:02:23 +02:00
case 3 :
sender . sendMessage ( " SubServers > There is already a SubServer with that name " ) ;
break ;
case 4 :
sender . sendMessage ( " SubServers > There is no host with that name " ) ;
break ;
case 6 :
sender . sendMessage ( " SubServers > There is no template with that name " ) ;
break ;
case 7 :
sender . sendMessage ( " SubServers > SubCreator cannot create servers before Minecraft 1.8 " ) ;
break ;
case 8 :
sender . sendMessage ( " SubServers > Invalid Port Number " ) ;
break ;
case 0 :
case 1 :
sender . sendMessage ( " SubServers > Launching SubCreator... " ) ;
break ;
default :
2018-04-15 03:53:51 +02:00
System . out . println ( " PacketCreateServer(null, " + args [ 1 ] + " , " + args [ 2 ] + " , " + args [ 3 ] + " , " + args [ 4 ] + " , " + args [ 5 ] + " ) responded with: " + data . getRawString ( " m " ) ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( " SubServers > Launching SubCreator... " ) ;
break ;
}
} ) ) ;
}
} else {
2018-07-23 05:44:20 +02:00
sender . sendMessage ( " Usage: " + label + " <Name> <Host> <Template> <Version> <Port> " ) ;
2017-08-22 15:02:23 +02:00
}
} else {
sender . sendMessage ( " SubServers > Unknown sub-command: " + args [ 0 ] ) ;
}
} else {
sender . sendMessages ( printHelp ( ) ) ;
}
}
} else {
String str = label ;
for ( String arg : args ) str + = ' ' + arg ;
( ( ProxiedPlayer ) sender ) . chat ( str ) ;
}
}
private String [ ] printHelp ( ) {
return new String [ ] {
" SubServers > Console Command Help: " ,
" Help: /sub help " ,
" List: /sub list " ,
" Version: /sub version " ,
" Server Info: /sub info <SubServer> " ,
" Start Server: /sub start <SubServer> " ,
" Stop Server: /sub stop <SubServer> " ,
" Terminate Server: /sub kill <SubServer> " ,
" Command Server: /sub cmd <SubServer> <Command> [Args...] " ,
" Create Server: /sub create <Name> <Host> <Type> <Version> <Port> [RAM] " ,
" " ,
" To see BungeeCord Supplied Commands, please visit: " ,
" https://www.spigotmc.org/wiki/bungeecord-commands/ "
} ;
}
2018-01-02 23:29:25 +01:00
/ * *
* Suggest command arguments
*
* @param sender Sender
* @param args Arguments
* @return The validator ' s response and list of possible arguments
* /
public NamedContainer < String , List < String > > suggestArguments ( CommandSender sender , String [ ] args ) {
String last = ( args . length > 0 ) ? args [ args . length - 1 ] . toLowerCase ( ) : " " ;
if ( args . length < = 1 ) {
List < String > cmds = Arrays . asList ( " help " , " list " , " info " , " status " , " version " , " start " , " stop " , " kill " , " terminate " , " cmd " , " command " , " create " ) ;
if ( last . length ( ) = = 0 ) {
return new NamedContainer < > ( null , cmds ) ;
} else {
List < String > list = new ArrayList < String > ( ) ;
for ( String cmd : cmds ) {
if ( cmd . startsWith ( last ) ) list . add ( last + cmd . substring ( last . length ( ) ) ) ;
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Invalid-Subcommand " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
}
} else {
if ( args [ 0 ] . equals ( " info " ) | | args [ 0 ] . equals ( " status " ) | |
args [ 0 ] . equals ( " start " ) | |
args [ 0 ] . equals ( " stop " ) | |
args [ 0 ] . equals ( " kill " ) | | args [ 0 ] . equals ( " terminate " ) ) {
List < String > list = new ArrayList < String > ( ) ;
if ( args . length = = 2 ) {
if ( last . length ( ) = = 0 ) {
2018-07-01 05:46:58 +02:00
for ( Server server : plugin . servers . values ( ) ) if ( server instanceof SubServer ) list . add ( server . getName ( ) ) ;
2018-01-02 23:29:25 +01:00
} else {
2018-07-01 05:46:58 +02:00
for ( Server server : plugin . servers . values ( ) ) {
2018-01-02 23:29:25 +01:00
if ( server instanceof SubServer & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + server . getName ( ) . substring ( last . length ( ) ) ) ;
}
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown-SubServer " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else {
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
}
} else if ( args [ 0 ] . equals ( " cmd " ) | | args [ 0 ] . equals ( " command " ) ) {
if ( args . length = = 2 ) {
List < String > list = new ArrayList < String > ( ) ;
if ( last . length ( ) = = 0 ) {
2018-07-01 05:46:58 +02:00
for ( Server server : plugin . servers . values ( ) ) if ( server instanceof SubServer ) list . add ( server . getName ( ) ) ;
2018-01-02 23:29:25 +01:00
} else {
2018-07-01 05:46:58 +02:00
for ( Server server : plugin . servers . values ( ) ) {
2018-01-02 23:29:25 +01:00
if ( server instanceof SubServer & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) ) list . add ( last + server . getName ( ) . substring ( last . length ( ) ) ) ;
}
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown-SubServer " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else if ( args . length = = 3 ) {
return new NamedContainer < > ( null , Collections . singletonList ( " <Command> " ) ) ;
} else {
return new NamedContainer < > ( null , Collections . singletonList ( " [Args...] " ) ) ;
}
} else if ( args [ 0 ] . equals ( " create " ) ) {
if ( args . length = = 2 ) {
return new NamedContainer < > ( null , Collections . singletonList ( " <Name> " ) ) ;
} else if ( args . length = = 3 ) {
updateTemplateCache ( ) ;
List < String > list = new ArrayList < String > ( ) ;
if ( templateCache . name ( ) < = 0 ) {
list . add ( " <Host> " ) ;
} else if ( last . length ( ) = = 0 ) {
list . addAll ( templateCache . get ( ) . keySet ( ) ) ;
} else {
for ( String host : templateCache . get ( ) . keySet ( ) ) {
if ( host . toLowerCase ( ) . startsWith ( last ) ) list . add ( last + host . substring ( last . length ( ) ) ) ;
}
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown-Host " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else if ( args . length = = 4 ) {
updateTemplateCache ( ) ;
List < String > list = new ArrayList < String > ( ) ;
if ( templateCache . name ( ) < = 0 | | ! templateCache . get ( ) . keySet ( ) . contains ( args [ 2 ] . toLowerCase ( ) ) ) {
list . add ( " <Template> " ) ;
} else if ( last . length ( ) = = 0 ) {
list . addAll ( templateCache . get ( ) . get ( args [ 2 ] . toLowerCase ( ) ) ) ;
} else {
2018-04-15 03:53:51 +02:00
for ( String template : templateCache . get ( ) . get ( args [ 2 ] . toLowerCase ( ) ) ) {
2018-01-02 23:29:25 +01:00
if ( template . toLowerCase ( ) . startsWith ( last ) ) list . add ( last + template . substring ( last . length ( ) ) ) ;
}
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Creator.Invalid-Template " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else if ( args . length = = 5 ) {
if ( last . length ( ) > 0 ) {
if ( new Version ( " 1.8 " ) . compareTo ( new Version ( last ) ) > 0 ) {
return new NamedContainer < > ( plugin . api . getLang ( " SubServers " , " Command.Creator.Invalid-Version " ) , Collections . emptyList ( ) ) ;
}
}
return new NamedContainer < > ( null , Collections . singletonList ( " <Version> " ) ) ;
} else if ( args . length = = 6 ) {
if ( last . length ( ) > 0 ) {
if ( Util . isException ( ( ) - > Integer . parseInt ( last ) ) | | Integer . parseInt ( last ) < = 0 | | Integer . parseInt ( last ) > 65535 ) {
return new NamedContainer < > ( plugin . api . getLang ( " SubServers " , " Command.Creator.Invalid-Port " ) , Collections . emptyList ( ) ) ;
}
}
return new NamedContainer < > ( null , Collections . singletonList ( " <Port> " ) ) ;
} else {
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
}
} else {
return new NamedContainer < > ( plugin . api . getLang ( " SubServers " , " Command.Generic.Invalid-Subcommand " ) . replace ( " $str$ " , args [ 0 ] ) , Collections . emptyList ( ) ) ;
}
}
}
private void updateTemplateCache ( ) {
if ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) - templateCache . name ( ) > = TimeUnit . MINUTES . toMillis ( 5 ) ) {
2018-01-05 21:37:23 +01:00
templateCache . rename ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ) ;
2018-01-02 23:29:25 +01:00
plugin . subdata . sendPacket ( new PacketDownloadServerList ( null , null , ( json ) - > {
TreeMap < String , List < String > > hosts = new TreeMap < String , List < String > > ( ) ;
2018-04-15 03:53:51 +02:00
for ( String host : json . getSection ( " hosts " ) . getKeys ( ) ) {
2018-01-02 23:29:25 +01:00
List < String > templates = new ArrayList < String > ( ) ;
2018-04-15 03:53:51 +02:00
templates . addAll ( json . getSection ( " hosts " ) . getSection ( host ) . getSection ( " creator " ) . getSection ( " templates " ) . getKeys ( ) ) ;
2018-01-02 23:29:25 +01:00
hosts . put ( host , templates ) ;
}
templateCache . set ( hosts ) ;
templateCache . rename ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ) ;
} ) ) ;
}
2018-04-15 03:53:51 +02:00
2018-01-02 23:29:25 +01:00
}
2017-08-22 15:02:23 +02:00
/ * *
* BungeeCord / server
* /
2017-12-08 08:35:50 +01:00
@SuppressWarnings ( " unchecked " )
2018-01-02 23:29:25 +01:00
public static final class BungeeServer extends CommandX {
2017-08-22 15:02:23 +02:00
private SubPlugin plugin ;
2018-01-02 23:29:25 +01:00
private BungeeServer ( SubPlugin plugin , String command ) {
2017-08-22 15:02:23 +02:00
super ( command , " bungeecord.command.server " ) ;
this . plugin = plugin ;
}
2018-01-02 23:29:25 +01:00
protected static NamedContainer < BungeeServer , CommandX > newInstance ( SubPlugin plugin , String command ) {
NamedContainer < BungeeServer , CommandX > cmd = new NamedContainer < > ( new BungeeServer ( plugin , command ) , null ) ;
CommandX now = cmd . name ( ) ;
2018-07-15 07:23:11 +02:00
//if (plugin.api.getGameVersion()[plugin.api.getGameVersion().length - 1].compareTo(new Version("1.13")) >= 0) { // TODO Future Command Validator API?
// now = new net.ME1312.SubServers.Sync.Library.Compatibility.v1_13.CommandX(cmd.name());
//}
2018-01-02 23:29:25 +01:00
cmd . set ( now ) ;
return cmd ;
}
2017-08-22 15:02:23 +02:00
/ * *
* Override / server
*
* @param sender Sender
* @param args Arguments
* /
@SuppressWarnings ( " deprecation " )
@Override
public void execute ( CommandSender sender , String [ ] args ) {
if ( sender instanceof ProxiedPlayer ) {
if ( args . length > 0 ) {
2018-07-01 05:46:58 +02:00
Map < String , Server > servers = plugin . servers ;
2017-08-22 15:02:23 +02:00
if ( servers . keySet ( ) . contains ( args [ 0 ] . toLowerCase ( ) ) ) {
( ( ProxiedPlayer ) sender ) . connect ( servers . get ( args [ 0 ] . toLowerCase ( ) ) ) ;
} else {
2018-01-02 23:29:25 +01:00
sender . sendMessage ( plugin . api . getLang ( " SubServers " , " Bungee.Server.Invalid " ) ) ;
2017-08-22 15:02:23 +02:00
}
} else {
int i = 0 ;
TextComponent serverm = new TextComponent ( ChatColor . RESET . toString ( ) ) ;
2018-01-02 23:29:25 +01:00
TextComponent div = new TextComponent ( plugin . api . getLang ( " SubServers " , " Bungee.Server.Divider " ) ) ;
2018-07-01 05:46:58 +02:00
for ( Server server : plugin . servers . values ( ) ) {
2017-08-22 15:02:23 +02:00
if ( ! server . isHidden ( ) & & ( ! ( server instanceof SubServer ) | | ( ( SubServer ) server ) . isRunning ( ) ) ) {
if ( i ! = 0 ) serverm . addExtra ( div ) ;
2018-01-02 23:29:25 +01:00
TextComponent message = new TextComponent ( plugin . api . getLang ( " SubServers " , " Bungee.Server.List " ) . replace ( " $str$ " , server . getDisplayName ( ) ) ) ;
2017-12-08 08:35:50 +01:00
try {
2018-01-02 23:29:25 +01:00
message . setHoverEvent ( new HoverEvent ( HoverEvent . Action . SHOW_TEXT , new TextComponent [ ] { new TextComponent ( plugin . api . getLang ( " SubServers " , " Bungee.Server.Hover " ) . replace ( " $int$ " , Integer . toString ( ( plugin . redis ) ? ( ( Set < UUID > ) plugin . redis ( " getPlayersOnServer " , new NamedContainer < > ( String . class , server . getName ( ) ) ) ) . size ( ) : server . getPlayers ( ) . size ( ) ) ) ) } ) ) ;
2017-12-08 08:35:50 +01:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2017-08-22 15:02:23 +02:00
message . setClickEvent ( new ClickEvent ( ClickEvent . Action . RUN_COMMAND , " /server " + server . getName ( ) ) ) ;
serverm . addExtra ( message ) ;
i + + ;
}
}
sender . sendMessages (
2018-01-02 23:29:25 +01:00
plugin . api . getLang ( " SubServers " , " Bungee.Server.Current " ) . replace ( " $str$ " , ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) . getName ( ) ) ,
plugin . api . getLang ( " SubServers " , " Bungee.Server.Available " ) ) ;
2017-08-22 15:02:23 +02:00
sender . sendMessage ( serverm ) ;
}
} else {
2018-01-02 23:29:25 +01:00
sender . sendMessage ( plugin . api . getLang ( " SubServers " , " Command.Generic.Player-Only " ) ) ;
2017-08-22 15:02:23 +02:00
}
}
/ * *
2018-01-02 23:29:25 +01:00
* Suggest command arguments
2017-08-22 15:02:23 +02:00
*
* @param sender Sender
* @param args Arguments
2018-01-02 23:29:25 +01:00
* @return The validator ' s response and list of possible arguments
2017-08-22 15:02:23 +02:00
* /
2018-01-02 23:29:25 +01:00
public NamedContainer < String , List < String > > suggestArguments ( CommandSender sender , String [ ] args ) {
2017-08-22 15:02:23 +02:00
if ( args . length < = 1 ) {
String last = ( args . length > 0 ) ? args [ args . length - 1 ] . toLowerCase ( ) : " " ;
if ( last . length ( ) = = 0 ) {
2018-01-02 23:29:25 +01:00
return new NamedContainer < > ( null , new LinkedList < > ( plugin . getServers ( ) . keySet ( ) ) ) ;
2017-08-22 15:02:23 +02:00
} else {
List < String > list = new ArrayList < String > ( ) ;
for ( String server : plugin . getServers ( ) . keySet ( ) ) {
if ( server . toLowerCase ( ) . startsWith ( last ) ) list . add ( server ) ;
}
2018-01-02 23:29:25 +01:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Bungee.Server.Invalid " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
2017-08-22 15:02:23 +02:00
}
} else {
2018-01-02 23:29:25 +01:00
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
2017-08-22 15:02:23 +02:00
}
}
}
/ * *
* BungeeCord / glist
* /
2017-12-08 08:35:50 +01:00
@SuppressWarnings ( " unchecked " )
2017-08-22 15:02:23 +02:00
public static final class BungeeList extends Command {
private SubPlugin plugin ;
protected BungeeList ( SubPlugin plugin , String command ) {
super ( command , " bungeecord.command.list " ) ;
this . plugin = plugin ;
}
/ * *
* Override / glist
*
* @param sender
* @param args
* /
@SuppressWarnings ( " deprecation " )
@Override
public void execute ( CommandSender sender , String [ ] args ) {
List < String > messages = new LinkedList < String > ( ) ;
int players = 0 ;
2018-07-01 05:46:58 +02:00
for ( Server server : plugin . servers . values ( ) ) {
2017-12-08 08:35:50 +01:00
List < String > playerlist = new ArrayList < String > ( ) ;
if ( plugin . redis ) {
try {
for ( UUID player : ( Set < UUID > ) plugin . redis ( " getPlayersOnServer " , new NamedContainer < > ( String . class , server . getName ( ) ) ) ) playerlist . add ( ( String ) plugin . redis ( " getNameFromUuid " , new NamedContainer < > ( UUID . class , player ) ) ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
} else {
for ( ProxiedPlayer player : server . getPlayers ( ) ) playerlist . add ( player . getName ( ) ) ;
}
Collections . sort ( playerlist ) ;
players + = playerlist . size ( ) ;
2017-08-22 15:02:23 +02:00
if ( ! server . isHidden ( ) & & ( ! ( server instanceof SubServer ) | | ( ( SubServer ) server ) . isRunning ( ) ) ) {
int i = 0 ;
2018-01-02 23:29:25 +01:00
String message = plugin . api . getLang ( " SubServers " , " Bungee.List.Format " ) . replace ( " $str$ " , server . getDisplayName ( ) ) . replace ( " $int$ " , Integer . toString ( playerlist . size ( ) ) ) ;
2017-12-08 08:35:50 +01:00
for ( String player : playerlist ) {
2018-01-02 23:29:25 +01:00
if ( i ! = 0 ) message + = plugin . api . getLang ( " SubServers " , " Bungee.List.Divider " ) ;
message + = plugin . api . getLang ( " SubServers " , " Bungee.List.List " ) . replace ( " $str$ " , player ) ;
2017-08-22 15:02:23 +02:00
i + + ;
}
messages . add ( message ) ;
}
}
sender . sendMessages ( messages . toArray ( new String [ messages . size ( ) ] ) ) ;
2018-01-02 23:29:25 +01:00
sender . sendMessage ( plugin . api . getLang ( " SubServers " , " Bungee.List.Total " ) . replace ( " $int$ " , Integer . toString ( players ) ) ) ;
2017-08-22 15:02:23 +02:00
}
}
}