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 ;
2019-01-07 22:09:20 +01:00
import net.ME1312.SubServers.Sync.Library.Callback ;
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 ;
2019-01-07 22:09:20 +01:00
import net.ME1312.SubServers.Sync.Library.Container ;
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-10 06:50:10 +02:00
import net.ME1312.SubServers.Sync.Network.API.* ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Network.Packet.* ;
2018-10-14 09:26:23 +02:00
import net.ME1312.SubServers.Sync.Server.ServerContainer ;
import net.ME1312.SubServers.Sync.Server.SubServerContainer ;
2017-08-22 15:02:23 +02:00
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 {
2018-08-10 06:50:10 +02:00
private LinkedList < String > proxyCache = new LinkedList < String > ( ) ;
private TreeMap < String , List < String > > hostCache = new TreeMap < String , List < String > > ( ) ;
private LinkedList < String > groupCache = new LinkedList < String > ( ) ;
private long cacheDate = 0 ;
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?
2019-01-09 22:41:37 +01:00
// now = new net.ME1312.SubServers.Sync.Library.Compatibility.mc1_13.CommandX(cmd.name());
2018-07-15 07:23:11 +02:00
//}
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 ) {
2019-01-15 20:53:44 +01:00
if ( ! ( sender instanceof ProxiedPlayer ) ) {
2018-08-30 03:55:59 +02:00
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-10-18 05:17:23 +02:00
String osarch ;
if ( System . getProperty ( " os.name " ) . toLowerCase ( ) . startsWith ( " windows " ) ) {
String arch = System . getenv ( " PROCESSOR_ARCHITECTURE " ) ;
String wow64Arch = System . getenv ( " PROCESSOR_ARCHITEW6432 " ) ;
osarch = arch ! = null & & arch . endsWith ( " 64 " ) | | wow64Arch ! = null & & wow64Arch . endsWith ( " 64 " ) ? " x64 " : " x86 " ;
} else if ( System . getProperty ( " os.arch " ) . endsWith ( " 86 " ) ) {
osarch = " x86 " ;
} else if ( System . getProperty ( " os.arch " ) . endsWith ( " 64 " ) ) {
osarch = " x64 " ;
} else {
osarch = System . getProperty ( " os.arch " ) ;
}
String javaarch = null ;
switch ( System . getProperty ( " sun.arch.data.model " ) ) {
case " 32 " :
javaarch = " x86 " ;
break ;
case " 64 " :
javaarch = " x64 " ;
break ;
default :
if ( ! System . getProperty ( " sun.arch.data.model " ) . equalsIgnoreCase ( " unknown " ) )
javaarch = System . getProperty ( " sun.arch.data.model " ) ;
}
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > These are the platforms and versions that are running SubServers.Sync: " ) ;
2018-10-18 05:17:23 +02:00
sender . sendMessage ( " " + System . getProperty ( " os.name " ) + ( ( ! System . getProperty ( " os.name " ) . toLowerCase ( ) . startsWith ( " windows " ) ) ? ' ' + System . getProperty ( " os.version " ) : " " ) + ( ( osarch ! = null ) ? " [ " + osarch + ']' : " " ) + ',' ) ;
sender . sendMessage ( " Java " + System . getProperty ( " java.version " ) + ( ( javaarch ! = null ) ? " [ " + javaarch + ']' : " " ) + ',' ) ;
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " " + plugin . getBungeeName ( ) + ( ( plugin . isPatched ) ? " [Patched] " : " " ) + net . md_5 . bungee . Bootstrap . class . getPackage ( ) . getImplementationVersion ( ) + ',' ) ;
sender . sendMessage ( " SubServers.Sync v " + SubPlugin . version . toExtendedString ( ) + ( ( plugin . api . getWrapperBuild ( ) ! = null ) ? " ( " + plugin . api . getWrapperBuild ( ) + ')' : " " ) ) ;
sender . sendMessage ( " " ) ;
new Thread ( ( ) - > {
try {
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 ) ) ;
List < Version > versions = new LinkedList < Version > ( ) ;
2017-08-22 15:02:23 +02:00
2018-08-30 03:55:59 +02:00
Version updversion = plugin . version ;
int updcount = 0 ;
for ( YAMLSection tag : tags . getSectionList ( " tags " ) ) versions . add ( Version . fromString ( tag . getString ( " ref " ) . substring ( 10 ) ) ) ;
Collections . sort ( versions ) ;
for ( Version version : versions ) {
if ( version . compareTo ( updversion ) > 0 ) {
updversion = version ;
updcount + + ;
2018-03-14 04:38:26 +01:00
}
}
2018-08-30 03:55:59 +02:00
if ( updcount = = 0 ) {
sender . sendMessage ( " You are on the latest version. " ) ;
} else {
sender . sendMessage ( " SubServers.Sync v " + updversion + " is available. You are " + updcount + " version " + ( ( updcount = = 1 ) ? " " : " s " ) + " behind. " ) ;
2017-08-26 07:19:59 +02:00
}
2018-08-30 03:55:59 +02:00
} catch ( Exception e ) {
}
2019-01-06 07:58:13 +01:00
} , " SubServers.Sync::Update_Check " ) . start ( ) ;
2018-08-30 03:55:59 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " list " ) ) {
plugin . api . getGroups ( groups - > plugin . api . getHosts ( hosts - > plugin . api . getServers ( servers - > plugin . api . getMasterProxy ( proxymaster - > plugin . api . getProxies ( proxies - > {
int i = 0 ;
boolean sent = false ;
String div = ChatColor . RESET + " , " ;
if ( groups . keySet ( ) . size ( ) > 0 ) {
sender . sendMessage ( " Group/Server List: " ) ;
for ( String group : groups . keySet ( ) ) {
2018-07-23 05:44:20 +02:00
String message = " " ;
2018-08-30 03:55:59 +02:00
message + = ChatColor . GOLD + group + ChatColor . RESET + " : " ;
for ( Server server : groups . get ( group ) ) {
2017-08-22 15:02:23 +02:00
if ( i ! = 0 ) message + = div ;
2018-08-30 03:55:59 +02:00
if ( ! ( server instanceof SubServer ) ) {
message + = ChatColor . WHITE ;
} else if ( ( ( SubServer ) server ) . isRunning ( ) ) {
if ( ( ( SubServer ) server ) . getStopAction ( ) = = SubServer . StopAction . REMOVE_SERVER | | ( ( SubServer ) server ) . getStopAction ( ) = = SubServer . StopAction . DELETE_SERVER ) {
message + = ChatColor . AQUA ;
} else {
message + = ChatColor . GREEN ;
}
} else if ( ( ( SubServer ) server ) . isEnabled ( ) & & ( ( SubServer ) server ) . getCurrentIncompatibilities ( ) . size ( ) = = 0 ) {
2017-08-22 15:02:23 +02:00
message + = ChatColor . YELLOW ;
} else {
message + = ChatColor . RED ;
}
2018-08-30 03:55:59 +02:00
message + = server . getDisplayName ( ) + " ( " + server . getAddress ( ) . getAddress ( ) . getHostAddress ( ) + ':' + server . getAddress ( ) . getPort ( ) + ( ( server . getName ( ) . equals ( server . getDisplayName ( ) ) ) ? " " : ChatColor . stripColor ( div ) + server . getName ( ) ) + " ) " ;
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) " ) ;
2018-08-30 03:55:59 +02:00
sent = false ;
}
sender . sendMessage ( " Host/SubServer List: " ) ;
for ( Host host : hosts . values ( ) ) {
2018-07-23 05:44:20 +02:00
String message = " " ;
2018-08-30 03:55:59 +02:00
if ( host . isEnabled ( ) ) {
message + = ChatColor . AQUA ;
} else {
message + = ChatColor . RED ;
}
message + = host . getDisplayName ( ) + " ( " + host . getAddress ( ) . getHostAddress ( ) + ( ( host . getName ( ) . equals ( host . getDisplayName ( ) ) ) ? " " : ChatColor . stripColor ( div ) + host . getName ( ) ) + " ) " + ChatColor . RESET + " : " ;
for ( SubServer subserver : host . getSubServers ( ) . values ( ) ) {
2017-08-22 15:02:23 +02:00
if ( i ! = 0 ) message + = div ;
2018-08-30 03:55:59 +02:00
if ( subserver . isRunning ( ) ) {
if ( subserver . getStopAction ( ) = = SubServer . StopAction . REMOVE_SERVER | | subserver . getStopAction ( ) = = SubServer . StopAction . DELETE_SERVER ) {
message + = ChatColor . AQUA ;
} else {
message + = ChatColor . GREEN ;
}
} else if ( subserver . isEnabled ( ) & & subserver . getCurrentIncompatibilities ( ) . size ( ) = = 0 ) {
message + = ChatColor . YELLOW ;
} else {
message + = ChatColor . RED ;
}
message + = subserver . getDisplayName ( ) + " ( " + subserver . getAddress ( ) . getPort ( ) + ( ( subserver . getName ( ) . equals ( subserver . getDisplayName ( ) ) ) ? " " : ChatColor . stripColor ( div ) + subserver . getName ( ) ) + " ) " ;
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-30 03:55:59 +02:00
i = 0 ;
sent = true ;
}
if ( ! sent ) sender . sendMessage ( ChatColor . RESET + " (none) " ) ;
sender . sendMessage ( " Server List: " ) ;
String message = " " ;
for ( Server server : servers . values ( ) ) if ( ! ( server instanceof SubServer ) ) {
if ( i ! = 0 ) message + = div ;
message + = ChatColor . WHITE + server . getDisplayName ( ) + " ( " + server . getAddress ( ) . getAddress ( ) . getHostAddress ( ) + ':' + server . getAddress ( ) . getPort ( ) + ( ( server . getName ( ) . equals ( server . getDisplayName ( ) ) ) ? " " : ChatColor . stripColor ( div ) + server . getName ( ) ) + " ) " ;
i + + ;
}
if ( i = = 0 ) message + = ChatColor . RESET + " (none) " ;
sender . sendMessage ( message ) ;
if ( proxies . keySet ( ) . size ( ) > 0 ) {
sender . sendMessage ( " Proxy List: " ) ;
message = " (master) " ;
for ( Proxy proxy : proxies . values ( ) ) {
message + = div ;
if ( proxy . getSubData ( ) ! = null & & proxy . isRedis ( ) ) {
message + = ChatColor . GREEN ;
} else if ( proxy . getSubData ( ) ! = null ) {
message + = ChatColor . AQUA ;
} else if ( proxy . isRedis ( ) ) {
message + = ChatColor . WHITE ;
} else {
message + = ChatColor . RED ;
2018-08-05 23:41:17 +02:00
}
2018-08-30 03:55:59 +02:00
message + = proxy . getDisplayName ( ) + ( ( proxy . getName ( ) . equals ( proxy . getDisplayName ( ) ) ) ? " " : " ( " + proxy . getName ( ) + ')' ) ;
2018-08-05 23:41:17 +02:00
}
2018-08-30 03:55:59 +02:00
sender . sendMessage ( message ) ;
}
} ) ) ) ) ) ;
} else if ( args [ 0 ] . equalsIgnoreCase ( " info " ) | | args [ 0 ] . equalsIgnoreCase ( " status " ) ) {
if ( args . length > 1 ) {
String type = ( args . length > 2 ) ? args [ 1 ] : null ;
String name = args [ ( type ! = null ) ? 2 : 1 ] ;
2018-08-10 06:50:10 +02:00
2018-08-30 03:55:59 +02:00
Runnable getServer = ( ) - > plugin . api . getServer ( name , server - > {
if ( server ! = null ) {
sender . sendMessage ( " SubServers > Info on " + ( ( server instanceof SubServer ) ? " Sub " : " " ) + " Server: " + ChatColor . WHITE + server . getDisplayName ( ) ) ;
if ( ! server . getName ( ) . equals ( server . getDisplayName ( ) ) ) sender . sendMessage ( " -> System Name: " + ChatColor . WHITE + server . getName ( ) ) ;
if ( server instanceof SubServer ) {
sender . sendMessage ( " -> Enabled: " + ( ( ( ( SubServer ) server ) . isEnabled ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
if ( ! ( ( SubServer ) server ) . isEditable ( ) ) sender . sendMessage ( " -> Editable: " + ChatColor . RED + " no " ) ;
sender . sendMessage ( " -> Host: " + ChatColor . WHITE + ( ( SubServer ) server ) . getHost ( ) ) ;
}
if ( server . getGroups ( ) . size ( ) > 0 ) sender . sendMessage ( " -> Group " + ( ( server . getGroups ( ) . size ( ) > 1 ) ? " s: " : " : " + ChatColor . WHITE + server . getGroups ( ) . get ( 0 ) ) ) ;
if ( server . getGroups ( ) . size ( ) > 1 ) for ( String group : server . getGroups ( ) ) sender . sendMessage ( " - " + ChatColor . WHITE + group ) ;
sender . sendMessage ( " -> Address: " + ChatColor . WHITE + server . getAddress ( ) . getAddress ( ) . getHostAddress ( ) + ':' + server . getAddress ( ) . getPort ( ) ) ;
if ( server instanceof SubServer ) sender . sendMessage ( " -> Running: " + ( ( ( ( SubServer ) server ) . isRunning ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
if ( ! ( server instanceof SubServer ) | | ( ( SubServer ) server ) . isRunning ( ) ) {
sender . sendMessage ( " -> Connected: " + ( ( server . getSubData ( ) ! = null ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
sender . sendMessage ( " -> Players: " + ChatColor . AQUA + server . getPlayers ( ) . size ( ) + " online " ) ;
2018-08-10 06:50:10 +02:00
}
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " -> MOTD: " + ChatColor . WHITE + ChatColor . stripColor ( server . getMotd ( ) ) ) ;
if ( server instanceof SubServer & & ( ( SubServer ) server ) . getStopAction ( ) ! = SubServer . StopAction . NONE ) sender . sendMessage ( " -> Stop Action: " + ChatColor . WHITE + ( ( SubServer ) server ) . getStopAction ( ) . toString ( ) ) ;
sender . sendMessage ( " -> Signature: " + ChatColor . AQUA + server . getSignature ( ) ) ;
if ( server instanceof SubServer ) sender . sendMessage ( " -> Logging: " + ( ( ( ( SubServer ) server ) . isLogging ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
sender . sendMessage ( " -> Restricted: " + ( ( server . isRestricted ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
if ( server instanceof SubServer & & ( ( SubServer ) server ) . getIncompatibilities ( ) . size ( ) > 0 ) {
List < String > current = new ArrayList < String > ( ) ;
for ( String other : ( ( SubServer ) server ) . getCurrentIncompatibilities ( ) ) current . add ( other . toLowerCase ( ) ) ;
sender . sendMessage ( " -> Incompatibilities: " ) ;
for ( String other : ( ( SubServer ) server ) . getIncompatibilities ( ) ) sender . sendMessage ( " - " + ( ( current . contains ( other . toLowerCase ( ) ) ) ? ChatColor . WHITE : ChatColor . GRAY ) + other ) ;
}
sender . sendMessage ( " -> Hidden: " + ( ( server . isHidden ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
} else {
if ( type = = null ) {
sender . sendMessage ( " SubServers > There is no object with that name " ) ;
2018-08-10 06:50:10 +02:00
} else {
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > There is no server with that name " ) ;
2018-08-10 06:50:10 +02:00
}
2018-08-30 03:55:59 +02:00
}
} ) ;
Runnable getGroup = ( ) - > plugin . api . getGroup ( name , group - > {
if ( group ! = null ) {
sender . sendMessage ( " SubServers > Info on Group: " + ChatColor . WHITE + name ) ;
sender . sendMessage ( " -> Servers: " + ( ( group . size ( ) < = 0 ) ? ChatColor . GRAY + " (none) " : ChatColor . AQUA . toString ( ) + group . size ( ) ) ) ;
for ( Server server : group ) sender . sendMessage ( " - " + ChatColor . WHITE + server . getDisplayName ( ) + ( ( server . getName ( ) . equals ( server . getDisplayName ( ) ) ) ? " " : " ( " + server . getName ( ) + ')' ) ) ;
} else {
if ( type = = null ) {
getServer . run ( ) ;
2018-08-10 06:50:10 +02:00
} else {
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > There is no group with that name " ) ;
2018-08-10 06:50:10 +02:00
}
2018-08-30 03:55:59 +02:00
}
} ) ;
Runnable getHost = ( ) - > plugin . api . getHost ( name , host - > {
if ( host ! = null ) {
sender . sendMessage ( " SubServers > Info on Host: " + ChatColor . WHITE + host . getDisplayName ( ) ) ;
if ( ! host . getName ( ) . equals ( host . getDisplayName ( ) ) ) sender . sendMessage ( " -> System Name: " + ChatColor . WHITE + host . getName ( ) ) ;
sender . sendMessage ( " -> Available: " + ( ( host . isAvailable ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
sender . sendMessage ( " -> Enabled: " + ( ( host . isEnabled ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
sender . sendMessage ( " -> Address: " + ChatColor . WHITE + host . getAddress ( ) . getHostAddress ( ) ) ;
if ( host . getSubData ( ) ! = null ) sender . sendMessage ( " -> Connected: " + ChatColor . GREEN + " yes " ) ;
sender . sendMessage ( " -> SubServers: " + ( ( host . getSubServers ( ) . keySet ( ) . size ( ) < = 0 ) ? ChatColor . GRAY + " (none) " : ChatColor . AQUA . toString ( ) + host . getSubServers ( ) . keySet ( ) . size ( ) ) ) ;
for ( SubServer subserver : host . getSubServers ( ) . values ( ) ) sender . sendMessage ( " - " + ( ( subserver . isEnabled ( ) ) ? ChatColor . WHITE : ChatColor . GRAY ) + subserver . getDisplayName ( ) + ( ( subserver . getName ( ) . equals ( subserver . getDisplayName ( ) ) ) ? " " : " ( " + subserver . getName ( ) + ')' ) ) ;
sender . sendMessage ( " -> Templates: " + ( ( host . getCreator ( ) . getTemplates ( ) . keySet ( ) . size ( ) < = 0 ) ? ChatColor . GRAY + " (none) " : ChatColor . AQUA . toString ( ) + host . getCreator ( ) . getTemplates ( ) . keySet ( ) . size ( ) ) ) ;
for ( SubCreator . ServerTemplate template : host . getCreator ( ) . getTemplates ( ) . values ( ) ) sender . sendMessage ( " - " + ( ( template . isEnabled ( ) ) ? ChatColor . WHITE : ChatColor . GRAY ) + template . getDisplayName ( ) + ( ( template . getName ( ) . equals ( template . getDisplayName ( ) ) ) ? " " : " ( " + template . getName ( ) + ')' ) ) ;
sender . sendMessage ( " -> Signature: " + ChatColor . AQUA + host . getSignature ( ) ) ;
} else {
if ( type = = null ) {
getGroup . run ( ) ;
2018-08-10 06:50:10 +02:00
} else {
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > There is no host with that name " ) ;
2018-08-10 06:50:10 +02:00
}
2018-08-30 03:55:59 +02:00
}
} ) ;
Runnable getProxy = ( ) - > plugin . api . getProxy ( name , proxy - > {
if ( proxy ! = null ) {
sender . sendMessage ( " SubServers > Info on Proxy: " + ChatColor . WHITE + proxy . getDisplayName ( ) ) ;
if ( ! proxy . getName ( ) . equals ( proxy . getDisplayName ( ) ) ) sender . sendMessage ( " -> System Name: " + ChatColor . WHITE + proxy . getName ( ) ) ;
sender . sendMessage ( " -> Connected: " + ( ( proxy . getSubData ( ) ! = null ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
sender . sendMessage ( " -> Redis: " + ( ( proxy . isRedis ( ) ) ? ChatColor . GREEN : ChatColor . RED + " un " ) + " available " ) ;
if ( proxy . isRedis ( ) ) sender . sendMessage ( " -> Players: " + ChatColor . AQUA + proxy . getPlayers ( ) . size ( ) + " online " ) ;
sender . sendMessage ( " -> Signature: " + ChatColor . AQUA + proxy . getSignature ( ) ) ;
2018-08-10 06:50:10 +02:00
} else {
2018-08-30 03:55:59 +02:00
if ( type = = null ) {
getHost . run ( ) ;
} else {
sender . sendMessage ( " SubServers > There is no proxy with that name " ) ;
2017-08-22 15:02:23 +02:00
}
2018-08-10 06:50:10 +02:00
}
2018-08-30 03:55:59 +02:00
} ) ;
if ( type = = null ) {
getProxy . run ( ) ;
2017-08-22 15:02:23 +02:00
} else {
2018-08-30 03:55:59 +02:00
switch ( type . toLowerCase ( ) ) {
case " p " :
case " proxy " :
getProxy . run ( ) ;
break ;
case " h " :
case " host " :
getHost . run ( ) ;
break ;
case " g " :
case " group " :
getGroup . run ( ) ;
break ;
case " s " :
case " server " :
case " subserver " :
getServer . run ( ) ;
break ;
default :
sender . sendMessage ( " SubServers > There is no object type with that name " ) ;
}
2017-08-22 15:02:23 +02:00
}
2018-08-30 03:55:59 +02:00
} else {
2018-10-18 05:17:23 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " [proxy|host|group|server] <Name> " ) ;
2018-08-30 03:55:59 +02:00
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " start " ) ) {
if ( args . length > 1 ) {
plugin . subdata . sendPacket ( new PacketStartServer ( null , args [ 1 ] , data - > {
switch ( data . getInt ( " r " ) ) {
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's Host is not available " ) ;
break ;
case 6 :
sender . sendMessage ( " SubServers > That SubServer's Host is not enabled " ) ;
break ;
case 7 :
sender . sendMessage ( " SubServers > That SubServer is not enabled " ) ;
break ;
case 8 :
sender . sendMessage ( " SubServers > That SubServer is already running " ) ;
break ;
case 9 :
2019-01-07 22:09:20 +01:00
sender . sendMessage ( " SubServers > That SubServer cannot start while these server(s) are running: " + data . getRawString ( " m " ) . split ( " : \\ s " ) [ 1 ] ) ;
2018-08-30 03:55:59 +02:00
break ;
default :
System . out . println ( " PacketStartServer(null, " + args [ 1 ] + " ) responded with: " + data . getRawString ( " m " ) ) ;
2019-01-07 22:09:20 +01:00
case 0 :
case 1 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > Server was started successfully " ) ;
break ;
}
} ) ) ;
} else {
2019-01-07 22:09:20 +01:00
sender . sendMessage ( " Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <SubServer> " ) ;
2018-08-30 03:55:59 +02:00
}
2019-01-07 22:09:20 +01:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " restart " ) ) {
2018-08-30 03:55:59 +02:00
if ( args . length > 1 ) {
2019-01-07 22:09:20 +01:00
TimerTask starter = new TimerTask ( ) {
@Override
public void run ( ) {
plugin . subdata . sendPacket ( new PacketStartServer ( null , args [ 1 ] , data - > {
switch ( data . getInt ( " r " ) ) {
case 3 :
case 4 :
sender . sendMessage ( " SubServers > Could not restart server: That SubServer has disappeared " ) ;
break ;
case 5 :
sender . sendMessage ( " SubServers > Could not restart server: That SubServer's Host is no longer available " ) ;
break ;
case 6 :
sender . sendMessage ( " SubServers > Could not restart server: That SubServer's Host is no longer enabled " ) ;
break ;
case 7 :
sender . sendMessage ( " SubServers > Could not restart server: That SubServer is no longer enabled " ) ;
break ;
case 9 :
sender . sendMessage ( " SubServers > Could not restart server: That SubServer cannot start while these server(s) are running: " + data . getRawString ( " m " ) . split ( " : \\ s " ) [ 1 ] ) ;
break ;
default :
System . out . println ( " PacketStartServer(null, " + args [ 1 ] + " ) responded with: " + data . getRawString ( " m " ) ) ;
case 8 :
case 0 :
case 1 :
sender . sendMessage ( " SubServers > Server was started successfully " ) ;
break ;
}
} ) ) ;
}
} ;
final Container < Boolean > listening = new Container < Boolean > ( true ) ;
PacketInRunEvent . callback ( " SubStoppedEvent " , new Callback < YAMLSection > ( ) {
@Override
public void run ( YAMLSection json ) {
try {
if ( listening . get ( ) ) if ( ! json . getString ( " server " ) . equalsIgnoreCase ( args [ 1 ] ) ) {
PacketInRunEvent . callback ( " SubStoppedEvent " , this ) ;
} else {
new Timer ( " SubServers.Sync::Server_Restart_Command_Handler( " + args [ 1 ] + ')' ) . schedule ( starter , 100 ) ;
}
} catch ( Exception e ) { }
}
} ) ;
2018-08-30 03:55:59 +02:00
plugin . subdata . sendPacket ( new PacketStopServer ( null , args [ 1 ] , false , data - > {
2019-01-07 22:09:20 +01:00
if ( data . getInt ( " r " ) ! = 0 ) listening . set ( false ) ;
2018-08-30 03:55:59 +02:00
switch ( data . getInt ( " r " ) ) {
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 :
2019-01-07 22:09:20 +01:00
starter . run ( ) ;
2018-08-30 03:55:59 +02:00
break ;
2019-01-07 22:09:20 +01:00
default :
System . out . println ( " PacketStopServer(null, " + args [ 1 ] + " , false) responded with: " + data . getRawString ( " m " ) ) ;
2018-08-30 03:55:59 +02:00
case 0 :
case 1 :
sender . sendMessage ( " SubServers > Server was stopped successfully " ) ;
break ;
2019-01-07 22:09:20 +01:00
}
} ) ) ;
} else {
sender . sendMessage ( " Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <SubServer> " ) ;
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " stop " ) ) {
if ( args . length > 1 ) {
plugin . subdata . sendPacket ( new PacketStopServer ( null , args [ 1 ] , false , data - > {
switch ( data . getInt ( " r " ) ) {
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 ;
2018-08-30 03:55:59 +02:00
default :
System . out . println ( " PacketStopServer(null, " + args [ 1 ] + " , false) responded with: " + data . getRawString ( " m " ) ) ;
2019-01-07 22:09:20 +01:00
case 0 :
case 1 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > Server was stopped successfully " ) ;
break ;
}
} ) ) ;
} else {
2019-01-07 22:09:20 +01:00
sender . sendMessage ( " Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <SubServer> " ) ;
2018-08-30 03:55:59 +02:00
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " kill " ) | | args [ 0 ] . equalsIgnoreCase ( " terminate " ) ) {
if ( args . length > 1 ) {
plugin . subdata . sendPacket ( new PacketStopServer ( null , args [ 1 ] , true , data - > {
switch ( data . getInt ( " r " ) ) {
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 ;
default :
System . out . println ( " PacketStopServer(null, " + args [ 1 ] + " , true) responded with: " + data . getRawString ( " m " ) ) ;
2019-01-07 22:09:20 +01:00
case 0 :
case 1 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > Server was terminated successfully " ) ;
break ;
}
} ) ) ;
} else {
2019-01-07 22:09:20 +01:00
sender . sendMessage ( " Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <SubServer> " ) ;
2018-08-30 03:55:59 +02:00
}
} 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 ;
plugin . subdata . sendPacket ( new PacketCommandServer ( null , args [ 1 ] , cmd , data - > {
switch ( data . getInt ( " r " ) ) {
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 ;
default :
System . out . println ( " PacketCommandServer(null, " + args [ 1 ] + " , / " + cmd + " ) responded with: " + data . getRawString ( " m " ) ) ;
2019-01-07 22:09:20 +01:00
case 0 :
case 1 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > Command was sent successfully " ) ;
break ;
}
} ) ) ;
} else {
2019-01-07 22:09:20 +01:00
sender . sendMessage ( " Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <SubServer> <Command> [Args...] " ) ;
2018-08-30 03:55:59 +02:00
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " create " ) ) {
2018-10-08 23:07:44 +02:00
if ( args . length > 4 ) {
if ( args . length > 5 & & Util . isException ( ( ) - > Integer . parseInt ( args [ 5 ] ) ) ) {
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " Invalid Port Number " ) ;
} else {
2018-10-08 23:07:44 +02:00
plugin . subdata . sendPacket ( new PacketCreateServer ( null , args [ 1 ] , args [ 2 ] , args [ 3 ] , new Version ( args [ 4 ] ) , ( args . length > 5 ) ? Integer . parseInt ( args [ 5 ] ) : null , data - > {
2018-04-15 03:53:51 +02:00
switch ( data . getInt ( " r " ) ) {
2017-08-22 15:02:23 +02:00
case 3 :
case 4 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > There is already a SubServer with that name " ) ;
2017-08-22 15:02:23 +02:00
break ;
case 5 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > There is no host with that name " ) ;
2017-08-22 15:02:23 +02:00
break ;
case 6 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > That Host is not available " ) ;
2018-08-09 20:54:56 +02:00
break ;
case 7 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > That Host is not enabled " ) ;
2017-08-22 15:02:23 +02:00
break ;
2018-08-09 20:54:56 +02:00
case 8 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > There is no template with that name " ) ;
2017-08-22 15:02:23 +02:00
break ;
2018-08-30 03:55:59 +02:00
case 9 :
sender . sendMessage ( " SubServers > That Template is not available " ) ;
2017-08-22 15:02:23 +02:00
break ;
2018-08-30 03:55:59 +02:00
case 10 :
sender . sendMessage ( " SubServers > SubCreator cannot create servers before Minecraft 1.8 " ) ;
2017-08-22 15:02:23 +02:00
break ;
2018-08-30 03:55:59 +02:00
case 11 :
sender . sendMessage ( " SubServers > Invalid Port Number " ) ;
2017-08-22 15:02:23 +02:00
break ;
default :
2018-10-08 23:07:44 +02:00
System . out . println ( " PacketCreateServer(null, " + args [ 1 ] + " , " + args [ 2 ] + " , " + args [ 3 ] + " , " + args [ 4 ] + " , " + ( ( args . length > 5 ) ? args [ 5 ] : " null " ) + " ) responded with: " + data . getRawString ( " m " ) ) ;
2019-01-07 22:09:20 +01:00
case 0 :
case 1 :
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > Launching SubCreator... " ) ;
2017-08-22 15:02:23 +02:00
break ;
}
} ) ) ;
}
} else {
2019-01-07 22:09:20 +01:00
sender . sendMessage ( " Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Name> <Host> <Template> <Version> <Port> " ) ;
2017-08-22 15:02:23 +02:00
}
} else {
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " SubServers > Unknown sub-command: " + args [ 0 ] ) ;
2017-08-22 15:02:23 +02:00
}
2018-08-30 03:55:59 +02:00
} else {
sender . sendMessages ( printHelp ( ) ) ;
2017-08-22 15:02:23 +02:00
}
} 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 " ,
2018-08-10 06:50:10 +02:00
" Info: /sub info [proxy|host|group|server] <Name> " ,
2017-08-22 15:02:23 +02:00
" Start Server: /sub start <SubServer> " ,
2019-01-07 22:09:20 +01:00
" Restart Server: /sub restart <SubServer> " ,
2017-08-22 15:02:23 +02:00
" Stop Server: /sub stop <SubServer> " ,
" Terminate Server: /sub kill <SubServer> " ,
" Command Server: /sub cmd <SubServer> <Command> [Args...] " ,
2018-08-10 06:50:10 +02:00
" Create Server: /sub create <Name> <Host> <Template> <Version> <Port> " ,
2017-08-22 15:02:23 +02:00
" " ,
" 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 ) {
2019-01-20 23:49:12 +01:00
List < String > cmds = Arrays . asList ( " help " , " list " , " info " , " status " , " version " , " start " , " restart " , " stop " , " kill " , " terminate " , " cmd " , " command " , " create " ) ;
2018-01-02 23:29:25 +01:00
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 {
2018-08-10 06:50:10 +02:00
if ( args [ 0 ] . equals ( " info " ) | | args [ 0 ] . equals ( " status " ) ) {
if ( args . length = = 2 ) {
updateCache ( ) ;
List < String > list = new ArrayList < String > ( ) ;
List < String > subcommands = new ArrayList < String > ( ) ;
subcommands . add ( " proxy " ) ;
subcommands . add ( " host " ) ;
subcommands . add ( " group " ) ;
subcommands . add ( " server " ) ;
if ( last . length ( ) = = 0 ) {
list . addAll ( subcommands ) ;
for ( String proxy : proxyCache ) if ( ! list . contains ( proxy ) ) list . add ( proxy ) ;
for ( String host : hostCache . keySet ( ) ) if ( ! list . contains ( host ) ) list . add ( host ) ;
for ( String group : groupCache ) if ( ! list . contains ( group ) ) list . add ( group ) ;
2018-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) if ( ! list . contains ( server . getName ( ) ) ) list . add ( server . getName ( ) ) ;
2018-08-10 06:50:10 +02:00
} else {
for ( String command : subcommands ) {
if ( ! list . contains ( command ) & & command . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + command . substring ( last . length ( ) ) ) ;
}
for ( String proxy : proxyCache ) {
if ( ! list . contains ( proxy ) & & proxy . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + proxy . substring ( last . length ( ) ) ) ;
}
for ( String host : hostCache . keySet ( ) ) {
if ( ! list . contains ( host ) & & host . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + host . substring ( last . length ( ) ) ) ;
}
for ( String group : groupCache ) {
if ( ! list . contains ( group ) & & group . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + group . substring ( last . length ( ) ) ) ;
}
2018-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) {
2018-08-10 06:50:10 +02:00
if ( ! list . contains ( server . getName ( ) ) & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + server . getName ( ) . substring ( last . length ( ) ) ) ;
}
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Info.Unknown " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else if ( args . length = = 3 ) {
updateCache ( ) ;
List < String > list = new ArrayList < String > ( ) ;
if ( last . length ( ) = = 0 ) {
switch ( args [ 1 ] . toLowerCase ( ) ) {
case " p " :
case " proxy " :
list . addAll ( proxyCache ) ;
break ;
case " h " :
case " host " :
list . addAll ( hostCache . keySet ( ) ) ;
break ;
case " g " :
case " group " :
list . addAll ( groupCache ) ;
break ;
case " s " :
case " server " :
case " subserver " :
2018-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) list . add ( server . getName ( ) ) ;
2018-08-10 06:50:10 +02:00
break ;
}
} else {
switch ( args [ 1 ] . toLowerCase ( ) ) {
case " p " :
case " proxy " :
for ( String proxy : proxyCache ) {
if ( proxy . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + proxy . substring ( last . length ( ) ) ) ;
}
break ;
case " h " :
case " host " :
for ( String host : hostCache . keySet ( ) ) {
if ( host . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + host . substring ( last . length ( ) ) ) ;
}
break ;
case " g " :
case " group " :
for ( String group : groupCache ) {
if ( group . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + group . substring ( last . length ( ) ) ) ;
}
break ;
case " s " :
case " server " :
case " subserver " :
2018-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) {
2018-08-10 06:50:10 +02:00
if ( server . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( last + server . getName ( ) . substring ( last . length ( ) ) ) ;
}
break ;
}
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Info.Unknown " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else {
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
}
} else if ( args [ 0 ] . equals ( " start " ) | |
2019-01-07 22:09:20 +01:00
args [ 0 ] . equals ( " restart " ) ) {
List < String > list = new ArrayList < String > ( ) ;
if ( args . length = = 2 ) {
if ( last . length ( ) = = 0 ) {
for ( ServerContainer server : plugin . servers . values ( ) ) if ( server instanceof SubServerContainer ) list . add ( server . getName ( ) ) ;
} else {
for ( ServerContainer server : plugin . servers . values ( ) ) {
if ( server instanceof SubServerContainer & & 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 ( " stop " ) | |
2018-01-02 23:29:25 +01:00
args [ 0 ] . equals ( " kill " ) | | args [ 0 ] . equals ( " terminate " ) ) {
List < String > list = new ArrayList < String > ( ) ;
if ( args . length = = 2 ) {
if ( last . length ( ) = = 0 ) {
2019-01-07 22:09:20 +01:00
list . add ( " * " ) ;
2018-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) if ( server instanceof SubServerContainer ) list . add ( server . getName ( ) ) ;
2018-01-02 23:29:25 +01:00
} else {
2019-01-07 22:09:20 +01:00
if ( " * " . startsWith ( last ) ) list . add ( " * " ) ;
2018-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) {
2019-01-07 22:09:20 +01:00
if ( server instanceof SubServerContainer & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) ) list . add ( last + server . getName ( ) . substring ( last . length ( ) ) ) ;
2018-01-02 23:29:25 +01:00
}
}
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-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) if ( server instanceof SubServerContainer ) list . add ( server . getName ( ) ) ;
2018-01-02 23:29:25 +01:00
} else {
2018-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) {
if ( server instanceof SubServerContainer & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) ) list . add ( last + server . getName ( ) . substring ( last . length ( ) ) ) ;
2018-01-02 23:29:25 +01:00
}
}
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 ) {
2018-08-10 06:50:10 +02:00
updateCache ( ) ;
2018-01-02 23:29:25 +01:00
List < String > list = new ArrayList < String > ( ) ;
2018-08-10 06:50:10 +02:00
if ( cacheDate < = 0 ) {
2018-01-02 23:29:25 +01:00
list . add ( " <Host> " ) ;
} else if ( last . length ( ) = = 0 ) {
2018-08-10 06:50:10 +02:00
list . addAll ( hostCache . keySet ( ) ) ;
2018-01-02 23:29:25 +01:00
} else {
2018-08-10 06:50:10 +02:00
for ( String host : hostCache . keySet ( ) ) {
2018-01-02 23:29:25 +01:00
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 ) {
2018-08-10 06:50:10 +02:00
updateCache ( ) ;
2018-01-02 23:29:25 +01:00
List < String > list = new ArrayList < String > ( ) ;
2018-08-10 06:50:10 +02:00
if ( cacheDate < = 0 | | ! hostCache . keySet ( ) . contains ( args [ 2 ] . toLowerCase ( ) ) ) {
2018-01-02 23:29:25 +01:00
list . add ( " <Template> " ) ;
} else if ( last . length ( ) = = 0 ) {
2018-08-10 06:50:10 +02:00
list . addAll ( hostCache . get ( args [ 2 ] . toLowerCase ( ) ) ) ;
2018-01-02 23:29:25 +01:00
} else {
2018-08-10 06:50:10 +02:00
for ( String template : hostCache . 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 ( ) ) ;
}
}
}
2018-08-10 06:50:10 +02:00
private void updateCache ( ) {
2018-10-25 22:47:44 +02:00
if ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) - cacheDate > = TimeUnit . MINUTES . toMillis ( 1 ) ) {
2018-08-10 06:50:10 +02:00
cacheDate = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
plugin . api . getProxies ( proxies - > {
proxyCache = new LinkedList < String > ( proxies . keySet ( ) ) ;
cacheDate = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
} ) ;
2018-08-09 20:54:56 +02:00
plugin . api . getHosts ( hosts - > {
TreeMap < String , List < String > > cache = new TreeMap < String , List < String > > ( ) ;
for ( Host host : hosts . values ( ) ) {
2018-01-02 23:29:25 +01:00
List < String > templates = new ArrayList < String > ( ) ;
2018-08-09 20:54:56 +02:00
templates . addAll ( host . getCreator ( ) . getTemplates ( ) . keySet ( ) ) ;
cache . put ( host . getName ( ) . toLowerCase ( ) , templates ) ;
2018-01-02 23:29:25 +01:00
}
2018-08-10 06:50:10 +02:00
hostCache = cache ;
cacheDate = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
} ) ;
plugin . api . getGroups ( groups - > {
groupCache = new LinkedList < String > ( groups . keySet ( ) ) ;
cacheDate = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
2018-08-09 20:54:56 +02:00
} ) ;
2018-01-02 23:29:25 +01:00
}
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?
2019-01-09 22:41:37 +01:00
// now = new net.ME1312.SubServers.Sync.Library.Compatibility.mc1_13.CommandX(cmd.name());
2018-07-15 07:23:11 +02:00
//}
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-10-14 09:26:23 +02:00
Map < String , ServerContainer > 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-10-14 09:26:23 +02:00
for ( ServerContainer server : plugin . servers . values ( ) ) {
2018-11-21 22:52:03 +01:00
if ( ! server . isHidden ( ) & & server . canAccess ( sender ) & & ( ! ( server instanceof SubServerContainer ) | | ( ( SubServerContainer ) server ) . isRunning ( ) ) ) {
2017-08-22 15:02:23 +02:00
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 ( ) : " " ;
2019-01-14 01:52:44 +01:00
List < String > list = new ArrayList < String > ( ) ;
2017-08-22 15:02:23 +02:00
if ( last . length ( ) = = 0 ) {
2019-01-14 01:52:44 +01:00
for ( ServerContainer server : plugin . servers . values ( ) ) {
if ( ! server . isHidden ( ) ) list . add ( server . getName ( ) ) ;
}
return new NamedContainer < > ( null , new LinkedList < > ( list ) ) ;
2017-08-22 15:02:23 +02:00
} else {
2019-01-14 01:52:44 +01:00
for ( ServerContainer server : plugin . servers . values ( ) ) {
if ( server . getName ( ) . toLowerCase ( ) . startsWith ( last ) & & ! server . isHidden ( ) ) list . add ( server . getName ( ) ) ;
2017-08-22 15:02:23 +02:00
}
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-10-14 09:26:23 +02:00
for ( ServerContainer 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 ( ) ;
2018-10-14 09:26:23 +02:00
if ( ! server . isHidden ( ) & & ( ! ( server instanceof SubServerContainer ) | | ( ( SubServerContainer ) server ) . isRunning ( ) ) ) {
2017-08-22 15:02:23 +02:00
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
}
}
}