2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee ;
2016-12-05 04:21:04 +01:00
2018-07-27 21:36:51 +02:00
import com.google.gson.Gson ;
2020-06-12 07:45:49 +02:00
import net.ME1312.Galaxi.Library.Callback.Callback ;
import net.ME1312.Galaxi.Library.Callback.ReturnRunnable ;
import net.ME1312.Galaxi.Library.Platform ;
2019-05-11 23:23:31 +02:00
import net.ME1312.SubData.Server.SubDataClient ;
2018-08-05 23:41:17 +02:00
import net.ME1312.SubServers.Bungee.Host.* ;
2017-12-13 18:29:50 +01:00
import net.ME1312.SubServers.Bungee.Library.Compatibility.CommandX ;
2019-04-18 16:02:09 +02:00
import net.ME1312.Galaxi.Library.Map.ObjectMap ;
2020-06-12 07:45:49 +02:00
import net.ME1312.Galaxi.Library.Container.NamedContainer ;
2019-04-18 16:02:09 +02:00
import net.ME1312.Galaxi.Library.Util ;
import net.ME1312.Galaxi.Library.Version.Version ;
import net.ME1312.SubData.Server.ClientHandler ;
2020-01-18 06:13:10 +01:00
import net.ME1312.SubServers.Bungee.Library.Compatibility.Galaxi.GalaxiInfo ;
2019-05-17 00:36:41 +02:00
import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger ;
2019-10-19 00:24:58 +02:00
import net.ME1312.SubServers.Bungee.Network.Packet.PacketCheckPermission ;
2019-05-27 21:33:52 +02:00
import net.md_5.bungee.BungeeCord ;
2016-12-05 04:21:04 +01:00
import net.md_5.bungee.api.ChatColor ;
import net.md_5.bungee.api.CommandSender ;
2016-12-24 05:55:17 +01:00
import net.md_5.bungee.api.chat.ClickEvent ;
import net.md_5.bungee.api.chat.HoverEvent ;
import net.md_5.bungee.api.chat.TextComponent ;
2019-05-11 23:23:31 +02:00
import net.md_5.bungee.api.config.ServerInfo ;
2016-12-15 22:04:39 +01:00
import net.md_5.bungee.api.connection.ProxiedPlayer ;
2016-12-05 04:21:04 +01:00
import net.md_5.bungee.api.plugin.Command ;
import net.md_5.bungee.command.ConsoleCommandSender ;
2017-08-18 11:58:06 +02:00
import java.io.BufferedReader ;
2017-12-09 09:43:29 +01:00
import java.io.IOException ;
2017-08-18 11:58:06 +02:00
import java.io.InputStreamReader ;
import java.net.URL ;
import java.nio.charset.Charset ;
2017-01-01 20:34:46 +01:00
import java.util.* ;
2019-05-11 23:23:31 +02:00
import java.util.concurrent.TimeUnit ;
2016-12-05 04:21:04 +01:00
2020-01-18 06:13:10 +01:00
import static net.ME1312.SubServers.Bungee.Library.Compatibility.Galaxi.GalaxiCommand.* ;
2019-05-17 00:36:41 +02:00
2016-12-05 04:21:04 +01:00
/ * *
* Plugin Command Class
* /
2017-01-01 20:34:46 +01:00
@SuppressWarnings ( " deprecation " )
2017-12-13 18:29:50 +01:00
public final class SubCommand extends CommandX {
2019-05-11 23:23:31 +02:00
static HashMap < UUID , HashMap < ServerInfo , NamedContainer < Long , Boolean > > > players = new HashMap < UUID , HashMap < ServerInfo , NamedContainer < Long , Boolean > > > ( ) ;
2019-08-30 21:44:54 +02:00
private SubProxy plugin ;
2016-12-24 05:55:17 +01:00
private String label ;
2016-12-05 04:21:04 +01:00
2020-06-12 07:45:49 +02:00
static NamedContainer < SubCommand , CommandX > newInstance ( SubProxy plugin , String command ) {
2017-12-13 18:29:50 +01:00
NamedContainer < SubCommand , CommandX > cmd = new NamedContainer < > ( new SubCommand ( plugin , command ) , null ) ;
2017-12-22 00:37:39 +01:00
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.Bungee.Library.Compatibility.mc1_13.CommandX(cmd.name());
2018-07-15 07:23:11 +02:00
//}
2017-12-22 00:37:39 +01:00
cmd . set ( now ) ;
return cmd ;
2017-12-13 18:29:50 +01:00
}
2019-08-30 21:44:54 +02:00
private SubCommand ( SubProxy plugin , String command ) {
2016-12-24 05:55:17 +01:00
super ( command ) ;
2016-12-05 04:21:04 +01:00
this . plugin = plugin ;
2017-05-25 21:55:47 +02:00
this . label = '/' + command ;
2019-05-17 00:36:41 +02:00
description ( this , " The SubServers Command " ) ;
help ( this ,
" The command for accessing the SubServers Server Manager. " ,
" " ,
" Permission: subservers.command " ,
" Extended help entries: " ,
" /sub help "
) ;
2016-12-05 04:21:04 +01:00
}
/ * *
2017-01-08 03:30:03 +01:00
* Load / sub in console
2016-12-05 04:21:04 +01:00
*
2017-01-08 03:30:03 +01:00
* @param sender Sender
* @param args Arguments
2016-12-05 04:21:04 +01:00
* /
2018-07-27 21:36:51 +02:00
@SuppressWarnings ( " unchecked " )
2016-12-05 04:21:04 +01:00
public void execute ( CommandSender sender , String [ ] args ) {
2019-01-15 20:53:44 +01:00
if ( ! ( sender instanceof ProxiedPlayer ) ) {
2016-12-05 04:21:04 +01: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 " ) ) {
2019-05-17 00:36:41 +02:00
Version galaxi = GalaxiInfo . getVersion ( ) ;
2019-05-27 21:33:52 +02:00
Version bungee = Util . getDespiteException ( ( ) - > ( Version ) BungeeCord . class . getMethod ( " getBuildVersion " ) . invoke ( plugin ) , null ) ;
2019-05-17 00:36:41 +02:00
Version galaxibuild = GalaxiInfo . getSignature ( ) ;
2019-05-27 21:33:52 +02:00
Version bungeebuild = Util . getDespiteException ( ( ) - > ( Version ) BungeeCord . class . getMethod ( " getBuildSignature " ) . invoke ( plugin ) , null ) ;
2019-05-17 00:36:41 +02:00
2018-11-17 18:39:37 +01:00
sender . sendMessage ( " SubServers > These are the platforms and versions that are running SubServers.Bungee: " ) ;
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " " + Platform . getSystemName ( ) + ' ' + Platform . getSystemVersion ( ) + ( ( ! Platform . getSystemArchitecture ( ) . equals ( " unknown " ) ) ? " [ " + Platform . getSystemArchitecture ( ) + ']' : " " ) + ',' ) ;
sender . sendMessage ( " Java " + Platform . getJavaVersion ( ) + ( ( ! Platform . getJavaArchitecture ( ) . equals ( " unknown " ) ) ? " [ " + Platform . getJavaArchitecture ( ) + ']' : " " ) + ',' ) ;
if ( galaxi ! = null ) Util . isException ( ( ) - > sender . sendMessage ( " GalaxiEngine v " + galaxi . toExtendedString ( ) + ( ( galaxibuild ! = null ) ? " ( " + galaxibuild + ')' : " " ) + ',' ) ) ;
2019-05-27 21:33:52 +02:00
sender . sendMessage ( " " + plugin . getBungeeName ( ) + ( ( plugin . isGalaxi ) ? " v " : " " ) + ( ( bungee ! = null ) ? bungee : plugin . getVersion ( ) ) + ( ( bungeebuild ! = null ) ? " ( " + bungeebuild + ')' : " " ) + ( ( plugin . isPatched ) ? " [Patched] " : " " ) + ',' ) ;
2019-08-30 21:44:54 +02:00
sender . sendMessage ( " SubServers.Bungee v " + SubProxy . 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 {
2019-04-18 16:02:09 +02:00
ObjectMap < String > tags = new ObjectMap < String > ( 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-18 11:58:06 +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 ;
2019-04-18 16:02:09 +02:00
for ( ObjectMap < String > tag : tags . getMapList ( " tags " ) ) versions . add ( Version . fromString ( tag . getString ( " ref " ) . substring ( 10 ) ) ) ;
2018-07-29 20:39:42 +02:00
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-18 11:58:06 +02:00
}
2018-03-14 04:38:26 +01: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.Bungee v " + updversion + " is available. You are " + updcount + " version " + ( ( updcount = = 1 ) ? " " : " s " ) + " behind. " ) ;
2018-03-14 04:38:26 +01:00
}
} catch ( Exception e ) { }
2019-01-06 07:58:13 +01:00
} , " SubServers.Bungee::Update_Check " ) . start ( ) ;
2017-08-17 01:29:02 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " reload " ) ) {
if ( args . length > 1 ) {
switch ( args [ 1 ] . toLowerCase ( ) ) {
2018-08-30 03:55:59 +02:00
case " * " :
2017-08-17 01:29:02 +02:00
case " all " :
2017-12-09 09:43:29 +01:00
case " system " :
case " bungee " :
2019-06-17 05:13:48 +02:00
case " bungeecord " :
2017-12-09 09:43:29 +01:00
case " network " :
plugin . getPluginManager ( ) . dispatchCommand ( ConsoleCommandSender . getInstance ( ) , " greload " ) ;
break ;
2017-08-17 01:29:02 +02:00
case " host " :
case " hosts " :
case " server " :
case " servers " :
2017-12-09 09:43:29 +01:00
case " subserver " :
case " subservers " :
case " subdata " :
case " config " :
case " configs " :
try {
plugin . reload ( ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
2017-08-17 01:29:02 +02:00
break ;
case " creator " :
case " creators " :
2020-06-12 07:45:49 +02:00
case " subcreator " :
case " subcreators " :
2017-08-17 01:29:02 +02:00
case " template " :
case " templates " :
for ( Host host : plugin . api . getHosts ( ) . values ( ) ) {
host . getCreator ( ) . reload ( ) ;
}
sender . sendMessage ( " SubServers > SubCreator instances reloaded " ) ;
break ;
default :
sender . sendMessage ( " SubServers > Unknown reload type: " + args [ 1 ] ) ;
}
} else {
2017-12-09 09:43:29 +01:00
try {
plugin . reload ( ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
2017-08-17 01:29:02 +02:00
}
2016-12-05 04:21:04 +01:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " list " ) ) {
2017-08-18 11:58:06 +02:00
String div = ChatColor . RESET + " , " ;
int i = 0 ;
2017-10-07 18:49:36 +02:00
boolean sent = false ;
2018-01-22 03:49:18 +01:00
if ( plugin . api . getGroups ( ) . keySet ( ) . size ( ) > 0 ) {
2018-07-23 05:44:20 +02:00
sender . sendMessage ( " SubServers > Group/Server List: " ) ;
2018-01-22 03:49:18 +01:00
for ( String group : plugin . api . getGroups ( ) . keySet ( ) ) {
2018-07-23 05:44:20 +02:00
String message = " " ;
2018-01-22 03:49:18 +01:00
message + = ChatColor . GOLD + group + ChatColor . RESET + " : " ;
List < String > names = new ArrayList < String > ( ) ;
Map < String , Server > servers = plugin . api . getServers ( ) ;
2020-06-12 07:45:49 +02:00
for ( Server server : plugin . api . getGroup ( group ) . get ( ) ) names . add ( server . getName ( ) ) ;
2018-01-22 03:49:18 +01:00
Collections . sort ( names ) ;
for ( String name : names ) {
if ( i ! = 0 ) message + = div ;
Server server = servers . get ( name . toLowerCase ( ) ) ;
if ( ! ( servers . get ( name . toLowerCase ( ) ) instanceof SubServer ) ) {
message + = ChatColor . WHITE ;
} else if ( ( ( SubServer ) server ) . isRunning ( ) ) {
2019-04-18 16:02:09 +02:00
if ( ( ( SubServer ) server ) . getStopAction ( ) = = SubServer . StopAction . REMOVE_SERVER | | ( ( SubServer ) server ) . getStopAction ( ) = = SubServer . StopAction . RECYCLE_SERVER | | ( ( SubServer ) server ) . getStopAction ( ) = = SubServer . StopAction . DELETE_SERVER ) {
2018-08-30 03:55:59 +02:00
message + = ChatColor . AQUA ;
} else {
message + = ChatColor . GREEN ;
}
2019-06-17 05:13:48 +02:00
} else if ( ( ( SubServer ) server ) . getHost ( ) . isAvailable ( ) & & ( ( SubServer ) server ) . getHost ( ) . isEnabled ( ) & & ( ( SubServer ) server ) . isAvailable ( ) & & ( ( SubServer ) server ) . isEnabled ( ) & & ( ( SubServer ) server ) . getCurrentIncompatibilities ( ) . size ( ) = = 0 ) {
2018-01-22 03:49:18 +01:00
message + = ChatColor . YELLOW ;
} else {
message + = ChatColor . RED ;
}
2020-06-12 07:45:49 +02:00
message + = server . getDisplayName ( ) + ( ( server . getName ( ) . equals ( server . getDisplayName ( ) ) ) ? " " : " [ " + server . getName ( ) + ']' ) ;
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: " ) ;
2017-08-18 11:58:06 +02:00
for ( Host host : plugin . api . getHosts ( ) . values ( ) ) {
2018-07-23 05:44:20 +02:00
String message = " " ;
2018-08-30 03:55:59 +02:00
if ( host . isAvailable ( ) & & host . isEnabled ( ) ) {
2017-08-18 11:58:06 +02:00
message + = ChatColor . AQUA ;
} else {
message + = ChatColor . RED ;
}
2020-06-12 07:45:49 +02:00
message + = host . getDisplayName ( ) + " [ " + ( ( host . getName ( ) . equals ( host . getDisplayName ( ) ) ) ? " " : host . getName ( ) + ChatColor . stripColor ( div ) ) + host . getAddress ( ) . getHostAddress ( ) + " ] " + ChatColor . RESET + " : " ;
2017-08-18 11:58:06 +02:00
for ( SubServer subserver : host . getSubServers ( ) . values ( ) ) {
if ( i ! = 0 ) message + = div ;
2018-08-30 03:55:59 +02:00
if ( subserver . isRunning ( ) ) {
2019-04-18 16:02:09 +02:00
if ( subserver . getStopAction ( ) = = SubServer . StopAction . REMOVE_SERVER | | subserver . getStopAction ( ) = = SubServer . StopAction . RECYCLE_SERVER | | subserver . getStopAction ( ) = = SubServer . StopAction . DELETE_SERVER ) {
2018-08-30 03:55:59 +02:00
message + = ChatColor . AQUA ;
} else {
message + = ChatColor . GREEN ;
}
2019-06-17 05:13:48 +02:00
} else if ( subserver . getHost ( ) . isAvailable ( ) & & subserver . getHost ( ) . isEnabled ( ) & & subserver . isAvailable ( ) & & subserver . isEnabled ( ) & & subserver . getCurrentIncompatibilities ( ) . size ( ) = = 0 ) {
2017-08-18 11:58:06 +02:00
message + = ChatColor . YELLOW ;
} else {
message + = ChatColor . RED ;
}
2020-06-12 07:45:49 +02:00
message + = subserver . getDisplayName ( ) + " [ " + ( ( subserver . getName ( ) . equals ( subserver . getDisplayName ( ) ) ) ? " " : subserver . getName ( ) + ChatColor . stripColor ( div ) ) + subserver . getAddress ( ) . getPort ( ) + " ] " ;
2017-08-18 11:58:06 +02:00
i + + ;
}
2017-10-07 18:49:36 +02:00
if ( i = = 0 ) message + = ChatColor . RESET + " (none) " ;
2017-08-18 11:58:06 +02:00
sender . sendMessage ( message ) ;
i = 0 ;
2017-10-07 18:49:36 +02:00
sent = true ;
2016-12-24 05:55:17 +01:00
}
2017-10-07 18:49:36 +02:00
if ( ! sent ) sender . sendMessage ( ChatColor . RESET + " (none) " ) ;
2017-08-18 11:58:06 +02:00
sender . sendMessage ( " SubServers > Server List: " ) ;
2018-07-23 05:44:20 +02:00
String message = " " ;
2017-01-26 23:19:48 +01:00
for ( Server server : plugin . api . getServers ( ) . values ( ) ) {
2017-08-18 11:58:06 +02:00
if ( ! ( server instanceof SubServer ) ) {
if ( i ! = 0 ) message + = div ;
2020-06-12 07:45:49 +02:00
message + = ChatColor . WHITE + server . getDisplayName ( ) + " [ " + ( ( server . getName ( ) . equals ( server . getDisplayName ( ) ) ) ? " " : server . getName ( ) + ChatColor . stripColor ( div ) ) + server . getAddress ( ) . getAddress ( ) . getHostAddress ( ) + ':' + server . getAddress ( ) . getPort ( ) + " ] " ;
2017-08-18 11:58:06 +02:00
i + + ;
}
2017-01-26 23:19:48 +01:00
}
2017-10-07 18:49:36 +02:00
if ( i = = 0 ) message + = ChatColor . RESET + " (none) " ;
2017-08-18 11:58:06 +02:00
sender . sendMessage ( message ) ;
2018-08-05 23:41:17 +02:00
if ( plugin . api . getProxies ( ) . keySet ( ) . size ( ) > 0 ) {
sender . sendMessage ( " SubServers > Proxy List: " ) ;
message = " (master) " ;
for ( Proxy proxy : plugin . api . getProxies ( ) . values ( ) ) {
2018-08-06 04:07:18 +02:00
message + = div ;
2019-05-10 04:43:34 +02:00
if ( proxy . getSubData ( ) [ 0 ] ! = null & & proxy . isRedis ( ) ) {
2018-08-06 04:07:18 +02:00
message + = ChatColor . GREEN ;
2019-05-10 04:43:34 +02:00
} else if ( proxy . getSubData ( ) [ 0 ] ! = null ) {
2018-08-06 04:07:18 +02:00
message + = ChatColor . AQUA ;
} else if ( proxy . isRedis ( ) ) {
message + = ChatColor . WHITE ;
} else {
message + = ChatColor . RED ;
}
2020-06-12 07:45:49 +02:00
message + = proxy . getDisplayName ( ) + ( ( proxy . getName ( ) . equals ( proxy . getDisplayName ( ) ) ) ? " " : " [ " + proxy . getName ( ) + ']' ) ;
2018-08-05 23:41:17 +02:00
}
sender . sendMessage ( message ) ;
}
2017-08-15 11:58:48 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " info " ) | | args [ 0 ] . equalsIgnoreCase ( " status " ) ) {
if ( args . length > 1 ) {
2018-08-10 06:50:10 +02:00
String type = ( args . length > 2 ) ? args [ 1 ] : null ;
String name = args [ ( type ! = null ) ? 2 : 1 ] ;
2020-06-12 07:45:49 +02:00
Runnable getPlayer = ( ) - > {
RemotePlayer player = plugin . api . getGlobalPlayer ( name ) ;
if ( player ! = null ) {
sender . sendMessage ( " SubServers > Info on player: " + ChatColor . WHITE + player . getName ( ) ) ;
if ( player . getProxy ( ) ! = null ) sender . sendMessage ( " -> Proxy: " + ChatColor . WHITE + player . getProxy ( ) . getName ( ) ) ;
if ( player . getServer ( ) ! = null ) sender . sendMessage ( " -> Server: " + ChatColor . WHITE + player . getServer ( ) . getName ( ) ) ;
if ( player . getAddress ( ) ! = null ) sender . sendMessage ( " -> Address: " + ChatColor . WHITE + player . getAddress ( ) . getHostAddress ( ) ) ;
sender . sendMessage ( " -> UUID: " + ChatColor . AQUA + player . getUniqueId ( ) ) ;
} else {
if ( type = = null ) {
sender . sendMessage ( " SubServers > There is no object with that name " ) ;
} else {
sender . sendMessage ( " SubServers > There is no player with that name " ) ;
}
}
} ;
2018-08-10 06:50:10 +02:00
Runnable getServer = ( ) - > {
Server server = plugin . api . getServer ( name ) ;
if ( server ! = null ) {
2020-06-12 07:45:49 +02:00
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 ( ) ) ;
2018-08-10 06:50:10 +02:00
if ( server instanceof SubServer ) {
2019-06-17 05:13:48 +02:00
sender . sendMessage ( " -> Available: " + ( ( ( ( SubServer ) server ) . isAvailable ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
2018-08-10 06:50:10 +02:00
sender . sendMessage ( " -> Enabled: " + ( ( ( ( SubServer ) server ) . isEnabled ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
if ( ! ( ( SubServer ) server ) . isEditable ( ) ) sender . sendMessage ( " -> Editable: " + ChatColor . RED + " no " ) ;
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " -> Host: " + ChatColor . WHITE + ( ( SubServer ) server ) . getHost ( ) . getName ( ) ) ;
if ( ( ( SubServer ) server ) . getTemplate ( ) ! = null ) sender . sendMessage ( " -> Template: " + ChatColor . WHITE + ( ( SubServer ) server ) . getTemplate ( ) . getName ( ) ) ;
2018-08-10 06:50:10 +02:00
}
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 ( ) ) {
2019-05-13 05:28:27 +02:00
sender . sendMessage ( " -> Connected: " + ( ( server . getSubData ( ) [ 0 ] ! = null ) ? ChatColor . GREEN + " yes " + ( ( server . getSubData ( ) . length > 1 ) ? ChatColor . AQUA + " + " + ( server . getSubData ( ) . length - 1 ) + " subchannel " + ( ( server . getSubData ( ) . length = = 2 ) ? " " : " s " ) : " " ) : ChatColor . RED + " no " ) ) ;
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " -> Players: " + ChatColor . AQUA + server . getGlobalPlayers ( ) . size ( ) + " online " ) ;
2018-08-10 06:50:10 +02:00
}
sender . sendMessage ( " -> MOTD: " + ChatColor . WHITE + ChatColor . stripColor ( server . getMotd ( ) ) ) ;
2018-08-30 03:55:59 +02:00
if ( server instanceof SubServer & & ( ( SubServer ) server ) . getStopAction ( ) ! = SubServer . StopAction . NONE ) sender . sendMessage ( " -> Stop Action: " + ChatColor . WHITE + ( ( SubServer ) server ) . getStopAction ( ) . toString ( ) ) ;
2018-08-10 06:50:10 +02:00
sender . sendMessage ( " -> Signature: " + ChatColor . AQUA + server . getSignature ( ) ) ;
2018-08-30 03:55:59 +02:00
if ( server instanceof SubServer ) sender . sendMessage ( " -> Logging: " + ( ( ( ( SubServer ) server ) . isLogging ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
2018-08-10 06:50:10 +02:00
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 ( SubServer other : ( ( SubServer ) server ) . getCurrentIncompatibilities ( ) ) current . add ( other . getName ( ) . toLowerCase ( ) ) ;
sender . sendMessage ( " -> Incompatibilities: " ) ;
for ( SubServer other : ( ( SubServer ) server ) . getIncompatibilities ( ) ) sender . sendMessage ( " - " + ( ( current . contains ( other . getName ( ) . toLowerCase ( ) ) ) ? ChatColor . WHITE : ChatColor . GRAY ) + other ) ;
}
sender . sendMessage ( " -> Hidden: " + ( ( server . isHidden ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
} else {
if ( type = = null ) {
2020-06-12 07:45:49 +02:00
getPlayer . run ( ) ;
2018-08-10 06:50:10 +02:00
} else {
sender . sendMessage ( " SubServers > There is no server with that name " ) ;
}
2017-08-26 07:19:59 +02:00
}
2018-08-10 06:50:10 +02:00
} ;
Runnable getGroup = ( ) - > {
2020-06-12 07:45:49 +02:00
NamedContainer < String , List < Server > > group = plugin . api . getGroup ( name ) ;
2018-08-10 06:50:10 +02:00
if ( group ! = null ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Info on group: " + ChatColor . WHITE + group . name ( ) ) ;
sender . sendMessage ( " -> Servers: " + ( ( group . get ( ) . size ( ) < = 0 ) ? ChatColor . GRAY + " (none) " : ChatColor . AQUA . toString ( ) + group . get ( ) . size ( ) ) ) ;
for ( Server server : group . get ( ) ) sender . sendMessage ( " - " + ChatColor . WHITE + server . getDisplayName ( ) + ( ( server . getName ( ) . equals ( server . getDisplayName ( ) ) ) ? " " : " [ " + server . getName ( ) + ']' ) ) ;
2018-08-10 06:50:10 +02:00
} else {
if ( type = = null ) {
getServer . run ( ) ;
} else {
sender . sendMessage ( " SubServers > There is no group with that name " ) ;
}
2017-08-15 11:58:48 +02:00
}
2018-08-10 06:50:10 +02:00
} ;
Runnable getHost = ( ) - > {
Host host = plugin . api . getHost ( name ) ;
if ( host ! = null ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Info on host: " + ChatColor . WHITE + host . getDisplayName ( ) ) ;
if ( ! host . getName ( ) . equals ( host . getDisplayName ( ) ) ) sender . sendMessage ( " -> System Name: " + ChatColor . WHITE + host . getName ( ) ) ;
2018-08-30 03:55:59 +02:00
sender . sendMessage ( " -> Available: " + ( ( host . isAvailable ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
2018-08-10 06:50:10 +02:00
sender . sendMessage ( " -> Enabled: " + ( ( host . isEnabled ( ) ) ? ChatColor . GREEN + " yes " : ChatColor . RED + " no " ) ) ;
sender . sendMessage ( " -> Address: " + ChatColor . WHITE + host . getAddress ( ) . getHostAddress ( ) ) ;
2019-05-13 05:28:27 +02:00
if ( host instanceof ClientHandler ) sender . sendMessage ( " -> Connected: " + ( ( ( ( ClientHandler ) host ) . getSubData ( ) [ 0 ] ! = null ) ? ChatColor . GREEN + " yes " + ( ( ( ( ClientHandler ) host ) . getSubData ( ) . length > 1 ) ? ChatColor . AQUA + " + " + ( ( ( ClientHandler ) host ) . getSubData ( ) . length - 1 ) + " subchannel " + ( ( ( ( ClientHandler ) host ) . getSubData ( ) . length = = 2 ) ? " " : " s " ) : " " ) : ChatColor . RED + " no " ) ) ;
2018-08-10 06:50:10 +02:00
sender . sendMessage ( " -> SubServers: " + ( ( host . getSubServers ( ) . keySet ( ) . size ( ) < = 0 ) ? ChatColor . GRAY + " (none) " : ChatColor . AQUA . toString ( ) + host . getSubServers ( ) . keySet ( ) . size ( ) ) ) ;
2020-06-12 07:45:49 +02:00
for ( SubServer subserver : host . getSubServers ( ) . values ( ) ) sender . sendMessage ( " - " + ( ( subserver . isEnabled ( ) ) ? ChatColor . WHITE : ChatColor . GRAY ) + subserver . getDisplayName ( ) + ( ( subserver . getName ( ) . equals ( subserver . getDisplayName ( ) ) ) ? " " : " [ " + subserver . getName ( ) + ']' ) ) ;
2018-08-10 06:50:10 +02:00
sender . sendMessage ( " -> Templates: " + ( ( host . getCreator ( ) . getTemplates ( ) . keySet ( ) . size ( ) < = 0 ) ? ChatColor . GRAY + " (none) " : ChatColor . AQUA . toString ( ) + host . getCreator ( ) . getTemplates ( ) . keySet ( ) . size ( ) ) ) ;
2020-06-12 07:45:49 +02:00
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 ( ) + ']' ) ) ;
2018-08-10 06:50:10 +02:00
sender . sendMessage ( " -> Signature: " + ChatColor . AQUA + host . getSignature ( ) ) ;
} else {
if ( type = = null ) {
getGroup . run ( ) ;
} else {
sender . sendMessage ( " SubServers > There is no host with that name " ) ;
}
}
} ;
Runnable getProxy = ( ) - > {
Proxy proxy = plugin . api . getProxy ( name ) ;
if ( proxy ! = null ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Info on proxy: " + ChatColor . WHITE + proxy . getDisplayName ( ) ) ;
if ( ! proxy . getName ( ) . equals ( proxy . getDisplayName ( ) ) ) sender . sendMessage ( " -> System Name: " + ChatColor . WHITE + proxy . getName ( ) ) ;
if ( ! proxy . isMaster ( ) ) sender . sendMessage ( " -> Connected: " + ( ( proxy . getSubData ( ) [ 0 ] ! = null ) ? ChatColor . GREEN + " yes " + ( ( proxy . getSubData ( ) . length > 1 ) ? ChatColor . AQUA + " + " + ( proxy . getSubData ( ) . length - 1 ) + " subchannel " + ( ( proxy . getSubData ( ) . length = = 2 ) ? " " : " s " ) : " " ) : ChatColor . RED + " no " ) ) ;
else if ( ! proxy . getDisplayName ( ) . toLowerCase ( ) . contains ( " master " ) ) sender . sendMessage ( " -> Type: " + ChatColor . WHITE + " Master " ) ;
sender . sendMessage ( " -> Redis: " + ( ( proxy . isRedis ( ) ) ? ChatColor . GREEN : ChatColor . RED + " un " ) + " available " ) ;
2018-08-10 06:50:10 +02:00
if ( proxy . isRedis ( ) ) sender . sendMessage ( " -> Players: " + ChatColor . AQUA + proxy . getPlayers ( ) . size ( ) + " online " ) ;
sender . sendMessage ( " -> Signature: " + ChatColor . AQUA + proxy . getSignature ( ) ) ;
} else {
if ( type = = null ) {
getHost . run ( ) ;
} else {
sender . sendMessage ( " SubServers > There is no proxy with that name " ) ;
}
}
} ;
2017-08-15 11:58:48 +02:00
2018-08-10 06:50:10 +02:00
if ( type = = null ) {
getProxy . run ( ) ;
} else {
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 ;
2020-06-12 07:45:49 +02:00
case " player " :
getPlayer . run ( ) ;
break ;
2018-08-10 06:50:10 +02:00
default :
sender . sendMessage ( " SubServers > There is no object type with that name " ) ;
}
2017-08-15 11:58:48 +02:00
}
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " [proxy|host|group|server|player] <Name> " ) ;
2017-08-15 11:58:48 +02:00
}
2016-12-05 04:21:04 +01:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " start " ) ) {
if ( args . length > 1 ) {
2020-06-12 07:45:49 +02:00
ServerSelection select = selectServers ( sender , args , 1 , true ) ;
if ( select . subservers . length > 0 ) {
int success = 0 , running = 0 ;
for ( SubServer server : select . subservers ) {
if ( ! server . getHost ( ) . isAvailable ( ) ) {
sender . sendMessage ( " SubServers > The host for " + server . getName ( ) + " is not available " ) ;
} else if ( ! server . getHost ( ) . isEnabled ( ) ) {
sender . sendMessage ( " SubServers > The host for " + server . getName ( ) + " is not enabled " ) ;
} else if ( ! server . isAvailable ( ) ) {
sender . sendMessage ( " SubServers > Subserver " + server . getName ( ) + " is not available " ) ;
} else if ( ! server . isEnabled ( ) ) {
sender . sendMessage ( " SubServers > SubServer " + server . getName ( ) + " is not enabled " ) ;
} else if ( server . isRunning ( ) ) {
running + + ;
} else if ( server . getCurrentIncompatibilities ( ) . size ( ) ! = 0 ) {
String list = " " ;
List < SubServer > others = server . getCurrentIncompatibilities ( ) ;
for ( SubServer other : others ) {
if ( list . length ( ) ! = 0 ) list + = " , " ;
list + = other . getName ( ) ;
}
sender . sendMessages ( " SubServers > Subserver " + server . getName ( ) + " cannot start while these server " + ( ( others . size ( ) = = 1 ) ? " " : " s " ) + " are running: " , list ) ;
} else if ( server . start ( ) ) {
success + + ;
}
2017-07-21 22:45:41 +02:00
}
2020-06-12 07:45:49 +02:00
if ( running > 0 ) sender . sendMessage ( " SubServers > " + running + " subserver " + ( ( running = = 1 ) ? " " : " s " ) + " were already running " ) ;
if ( success > 0 ) sender . sendMessage ( " SubServers > Started " + success + " subserver " + ( ( success = = 1 ) ? " " : " s " ) ) ;
2016-12-05 04:21:04 +01:00
}
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Subservers> " ) ;
2016-12-05 04:21:04 +01:00
}
2019-01-07 22:09:20 +01:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " restart " ) ) {
2016-12-05 04:21:04 +01:00
if ( args . length > 1 ) {
2020-06-12 07:45:49 +02:00
ServerSelection select = selectServers ( sender , args , 1 , true ) ;
if ( select . subservers . length > 0 ) {
Callback < SubServer > starter = server - > {
Map < String , Server > servers = plugin . api . getServers ( ) ;
if ( ! servers . keySet ( ) . contains ( server . getName ( ) . toLowerCase ( ) ) | | ! ( servers . get ( server . getName ( ) . toLowerCase ( ) ) instanceof SubServer ) ) {
sender . sendMessage ( " SubServers > Could not restart server: Subserver " + server . getName ( ) + " has disappeared " ) ;
} else if ( ! ( server = ( SubServer ) servers . get ( server . getName ( ) . toLowerCase ( ) ) ) . isRunning ( ) ) {
if ( ! server . getHost ( ) . isAvailable ( ) ) {
sender . sendMessage ( " SubServers > Could not restart server: The host for " + server . getName ( ) + " is no longer available " ) ;
} else if ( ! server . getHost ( ) . isEnabled ( ) ) {
sender . sendMessage ( " SubServers > Could not restart server: The host for " + server . getName ( ) + " is no longer enabled " ) ;
} else if ( ! server . isAvailable ( ) ) {
sender . sendMessage ( " SubServers > Could not restart server: Subserver " + server . getName ( ) + " is no longer available " ) ;
} else if ( ! server . isEnabled ( ) ) {
sender . sendMessage ( " SubServers > Could not restart server: Subserver " + server . getName ( ) + " is no longer enabled " ) ;
} else if ( server . getCurrentIncompatibilities ( ) . size ( ) ! = 0 ) {
String list = " " ;
List < SubServer > others = server . getCurrentIncompatibilities ( ) ;
for ( SubServer other : others ) {
if ( list . length ( ) ! = 0 ) list + = " , " ;
list + = other . getName ( ) ;
}
sender . sendMessages ( " Could not restart server: Subserver " + server . getName ( ) + " cannot start while these server " + ( ( others . size ( ) = = 1 ) ? " " : " s " ) + " are running: " , list ) ;
} else {
server . start ( ) ;
2019-01-07 22:09:20 +01:00
}
}
2020-06-12 07:45:49 +02:00
} ;
2019-01-07 22:09:20 +01:00
2020-06-12 07:45:49 +02:00
int success = 0 ;
for ( SubServer server : select . subservers ) {
if ( server . isRunning ( ) ) {
if ( server . stop ( ) ) {
new Thread ( ( ) - > {
try {
server . waitFor ( ) ;
Thread . sleep ( 100 ) ;
starter . run ( server ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
} , " SubServers.Bungee::Server_Restart_Command_Handler( " + server . getName ( ) + ')' ) . start ( ) ;
success + + ;
}
} else {
starter . run ( server ) ;
success + + ;
2019-01-07 22:09:20 +01:00
}
2020-06-12 07:45:49 +02:00
}
if ( success > 0 ) sender . sendMessage ( " SubServers > Restarting " + success + " subserver " + ( ( success = = 1 ) ? " " : " s " ) ) ;
2019-01-07 22:09:20 +01:00
}
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Subservers> " ) ;
2019-01-07 22:09:20 +01:00
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " stop " ) ) {
if ( args . length > 1 ) {
2020-06-12 07:45:49 +02:00
ServerSelection select = selectServers ( sender , args , 1 , true ) ;
if ( select . subservers . length > 0 ) {
int success = 0 , running = 0 ;
for ( SubServer server : select . subservers ) {
if ( ! server . isRunning ( ) ) {
running + + ;
} else if ( server . stop ( ) ) {
success + + ;
2019-01-07 22:09:20 +01:00
}
}
2020-06-12 07:45:49 +02:00
if ( running > 0 ) sender . sendMessage ( " SubServers > " + running + " subserver " + ( ( running = = 1 ) ? " " : " s " ) + " were already offline " ) ;
if ( success > 0 ) sender . sendMessage ( " SubServers > Stopping " + success + " subserver " + ( ( success = = 1 ) ? " " : " s " ) ) ;
2016-12-05 04:21:04 +01:00
}
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Subservers> " ) ;
2016-12-05 04:21:04 +01:00
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " kill " ) | | args [ 0 ] . equalsIgnoreCase ( " terminate " ) ) {
if ( args . length > 1 ) {
2020-06-12 07:45:49 +02:00
ServerSelection select = selectServers ( sender , args , 1 , true ) ;
if ( select . subservers . length > 0 ) {
int success = 0 , running = 0 ;
for ( SubServer server : select . subservers ) {
if ( ! server . isRunning ( ) ) {
running + + ;
} else if ( server . terminate ( ) ) {
success + + ;
2019-01-07 22:09:20 +01:00
}
}
2020-06-12 07:45:49 +02:00
if ( running > 0 ) sender . sendMessage ( " SubServers > " + running + " subserver " + ( ( running = = 1 ) ? " " : " s " ) + " were already offline " ) ;
if ( success > 0 ) sender . sendMessage ( " SubServers > Terminated " + success + " subserver " + ( ( success = = 1 ) ? " " : " s " ) ) ;
2016-12-05 04:21:04 +01:00
}
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Subservers> " ) ;
2016-12-05 04:21:04 +01:00
}
} else if ( args [ 0 ] . equalsIgnoreCase ( " cmd " ) | | args [ 0 ] . equalsIgnoreCase ( " command " ) ) {
2020-06-12 07:45:49 +02:00
if ( args . length > 1 ) {
ServerSelection select = selectServers ( sender , args , 1 , true ) ;
if ( select . subservers . length > 0 ) {
if ( select . args . length > 2 ) {
StringBuilder builder = new StringBuilder ( select . args [ 2 ] ) ;
for ( int i = 3 ; i < select . args . length ; i + + ) {
builder . append ( ' ' ) ;
builder . append ( select . args [ i ] ) ;
}
int success = 0 , running = 0 ;
String command = builder . toString ( ) ;
for ( SubServer server : select . subservers ) {
if ( ! server . isRunning ( ) ) {
running + + ;
} else if ( server . command ( command ) ) {
success + + ;
2017-04-23 21:56:09 +02:00
}
}
2020-06-12 07:45:49 +02:00
if ( running > 0 ) sender . sendMessage ( " SubServers > " + running + " subserver " + ( ( running = = 1 ) ? " " : " s " ) + " were offline " ) ;
if ( success > 0 ) sender . sendMessage ( " SubServers > Sent command to " + success + " subserver " + ( ( success = = 1 ) ? " " : " s " ) ) ;
2017-04-23 21:56:09 +02:00
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > No command was entered " ) ;
2017-04-23 21:56:09 +02:00
}
2016-12-05 04:21:04 +01:00
}
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Subservers> <Command> [Args...] " ) ;
2016-12-05 04:21:04 +01:00
}
2017-08-15 11:58:48 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " sudo " ) | | args [ 0 ] . equalsIgnoreCase ( " screen " ) ) {
2018-05-24 07:05:54 +02:00
if ( plugin . canSudo ) {
if ( args . length > 1 ) {
Map < String , Server > servers = plugin . api . getServers ( ) ;
2020-06-12 07:45:49 +02:00
if ( ! servers . keySet ( ) . contains ( args [ 1 ] . toLowerCase ( ) ) | | ! ( servers . get ( args [ 1 ] . toLowerCase ( ) ) instanceof SubServer ) ) {
sender . sendMessage ( " SubServers > There is no subserver with that name " ) ;
2018-06-02 21:02:03 +02:00
} else if ( ! ( ( SubServer ) servers . get ( args [ 1 ] . toLowerCase ( ) ) ) . isRunning ( ) ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > That subserver is not running " ) ;
2018-05-24 07:05:54 +02:00
} else {
plugin . sudo = ( SubServer ) servers . get ( args [ 1 ] . toLowerCase ( ) ) ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Now forwarding commands to " + plugin . sudo . getDisplayName ( ) + " . Type \" exit \" to return. " ) ;
2018-05-24 07:05:54 +02:00
}
2017-08-15 11:58:48 +02:00
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Subserver> " ) ;
2017-08-15 11:58:48 +02:00
}
} else {
2018-05-24 07:05:54 +02:00
sender . sendMessage ( " SubServers > The BungeeCord library provided does not support console sudo. " ) ;
2017-08-15 11:58:48 +02:00
}
2016-12-05 04:21:04 +01:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " create " ) ) {
2019-04-18 16:02:09 +02:00
if ( args . length > 3 ) {
2017-07-23 06:32:57 +02:00
if ( plugin . api . getSubServers ( ) . keySet ( ) . contains ( args [ 1 ] . toLowerCase ( ) ) | | SubCreator . isReserved ( args [ 1 ] ) ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > There is already a subserver with that name " ) ;
2016-12-15 22:04:39 +01:00
} else if ( ! plugin . hosts . keySet ( ) . contains ( args [ 2 ] . toLowerCase ( ) ) ) {
sender . sendMessage ( " SubServers > There is no host with that name " ) ;
2018-08-30 03:55:59 +02:00
} else if ( ! plugin . hosts . get ( args [ 2 ] . toLowerCase ( ) ) . isAvailable ( ) ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > That host is not available " ) ;
2018-08-30 03:55:59 +02:00
} else if ( ! plugin . hosts . get ( args [ 2 ] . toLowerCase ( ) ) . isEnabled ( ) ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > That host is not enabled " ) ;
2018-08-30 03:55:59 +02:00
} else if ( ! plugin . hosts . get ( args [ 2 ] . toLowerCase ( ) ) . getCreator ( ) . getTemplates ( ) . keySet ( ) . contains ( args [ 3 ] . toLowerCase ( ) ) ) {
2017-05-29 07:00:02 +02:00
sender . sendMessage ( " SubServers > There is no template with that name " ) ;
2019-12-19 03:52:15 +01:00
} else if ( ! plugin . hosts . get ( args [ 2 ] . toLowerCase ( ) ) . getCreator ( ) . getTemplate ( args [ 3 ] . toLowerCase ( ) ) . isEnabled ( ) ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > That template is not enabled " ) ;
2019-12-19 03:52:15 +01:00
} else if ( args . length < = 4 & & plugin . hosts . get ( args [ 2 ] . toLowerCase ( ) ) . getCreator ( ) . getTemplate ( args [ 3 ] . toLowerCase ( ) ) . requiresVersion ( ) ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > That template requires a Minecraft version to be specified " ) ;
2018-10-08 23:07:44 +02:00
} else if ( args . length > 5 & & ( Util . isException ( ( ) - > Integer . parseInt ( args [ 5 ] ) ) | | Integer . parseInt ( args [ 5 ] ) < = 0 | | Integer . parseInt ( args [ 5 ] ) > 65535 ) ) {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Invalid port number " ) ;
2016-12-15 22:04:39 +01:00
} else {
2019-12-19 03:52:15 +01:00
plugin . hosts . get ( args [ 2 ] . toLowerCase ( ) ) . getCreator ( ) . create ( args [ 1 ] , plugin . hosts . get ( args [ 2 ] . toLowerCase ( ) ) . getCreator ( ) . getTemplate ( args [ 3 ] . toLowerCase ( ) ) , ( args . length > 4 ) ? new Version ( args [ 4 ] ) : null , ( args . length > 5 ) ? Integer . parseInt ( args [ 5 ] ) : null ) ;
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Creating subserver " + args [ 1 ] ) ;
2016-12-15 22:04:39 +01:00
}
} else {
2019-04-18 16:02:09 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Name> <Host> <Template> [Version] [Port] " ) ;
2016-12-15 22:04:39 +01:00
}
2019-06-17 05:13:48 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " update " ) | | args [ 0 ] . equalsIgnoreCase ( " upgrade " ) ) {
if ( args . length > 1 ) {
2020-06-12 07:45:49 +02:00
ServerSelection select = selectServers ( sender , args , 1 , true ) ;
if ( select . subservers . length > 0 ) {
int success = 0 ;
for ( SubServer server : select . subservers ) {
if ( ! server . isAvailable ( ) ) {
sender . sendMessage ( " SubServers > The host for " + server . getName ( ) + " is not available " ) ;
} else if ( ! server . getHost ( ) . isEnabled ( ) ) {
sender . sendMessage ( " SubServers > The host for " + server . getName ( ) + " is not enabled " ) ;
} else if ( ! server . isAvailable ( ) ) {
sender . sendMessage ( " SubServers > Subserver " + server . getName ( ) + " is not available " ) ;
} else if ( server . isRunning ( ) ) {
sender . sendMessage ( " SubServers > Cannot update " + server . getName ( ) + " while it is still running " ) ;
} else if ( server . getTemplate ( ) = = null ) {
sender . sendMessage ( " SubServers > We don't know which template built " + server . getName ( ) ) ;
} else if ( ! server . getTemplate ( ) . isEnabled ( ) ) {
sender . sendMessage ( " SubServers > The template that created " + server . getName ( ) + " is not enabled " ) ;
} else if ( ! server . getTemplate ( ) . canUpdate ( ) ) {
sender . sendMessage ( " SubServers > The template that created " + server . getName ( ) + " does not support subserver updating " ) ;
} else if ( select . args . length < = 2 & & server . getTemplate ( ) . requiresVersion ( ) ) {
sender . sendMessage ( " SubServers > The template that created " + server . getName ( ) + " requires a Minecraft version to be specified " ) ;
} else if ( server . getHost ( ) . getCreator ( ) . update ( server , ( select . args . length > 2 ) ? new Version ( select . args [ 2 ] ) : null ) ) {
success + + ;
}
}
if ( success > 0 ) sender . sendMessage ( " SubServers > Updating " + success + " subserver " + ( ( success = = 1 ) ? " " : " s " ) ) ;
2019-06-17 05:13:48 +02:00
}
} else {
2020-06-12 07:45:49 +02:00
sender . sendMessage ( " SubServers > Usage: " + label + " " + args [ 0 ] . toLowerCase ( ) + " <Subservers> [Version] " ) ;
2019-06-17 05:13:48 +02:00
}
2020-06-12 07:45:49 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " remove " ) | | args [ 0 ] . equalsIgnoreCase ( " del " ) | | args [ 0 ] . equalsIgnoreCase ( " delete " ) ) {
2017-01-01 20:34:46 +01:00
if ( args . length > 1 ) {
2020-06-12 07:45:49 +02:00
ServerSelection select = selectServers ( sender , args , 1 , true ) ;
if ( select . subservers . length > 0 ) {
int success = 0 ;
for ( SubServer server : select . subservers ) try {
if ( server . isRunning ( ) ) {
sender . sendMessage ( " SubServers > Subserver " + server . getName ( ) + " is still running " ) ;
} else if ( server . getHost ( ) . recycleSubServer ( server . getName ( ) ) ) {
success + + ;
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2017-01-01 20:34:46 +01:00
}
2020-06-12 07:45:49 +02:00
if ( success > 0 ) sender . sendMessage ( " SubServers > Removing " + success + " subserver " + ( ( success = = 1 ) ? " " : " s " ) ) ;
2017-01-01 20:34:46 +01:00
}
}
2019-06-17 05:13:48 +02:00
} else if ( args [ 0 ] . equalsIgnoreCase ( " restore " ) ) {
// TODO
2016-12-24 05:55:17 +01:00
} else {
sender . sendMessage ( " SubServers > Unknown sub-command: " + args [ 0 ] ) ;
2016-12-05 04:21:04 +01:00
}
} else {
sender . sendMessages ( printHelp ( ) ) ;
}
} else {
2017-01-01 20:34:46 +01:00
String str = label ;
for ( String arg : args ) str + = ' ' + arg ;
( ( ProxiedPlayer ) sender ) . chat ( str ) ;
}
}
2020-06-12 07:45:49 +02:00
private ServerSelection selectServers ( CommandSender sender , String [ ] rargs , int index , boolean mode ) {
LinkedList < String > msgs = new LinkedList < String > ( ) ;
LinkedList < String > args = new LinkedList < String > ( ) ;
LinkedList < String > selection = new LinkedList < > ( ) ;
LinkedList < Server > servers = new LinkedList < Server > ( ) ;
String last = null ;
int i = 0 ;
while ( i < index ) {
args . add ( rargs [ i ] ) ;
+ + i ;
}
Map < String , Host > hostMap = null ;
Map < String , List < Server > > groupMap = null ;
Map < String , Server > serverMap = null ;
StringBuilder completed = new StringBuilder ( ) ;
for ( boolean run = true ; run & & i < rargs . length ; i + + ) {
String current = last = rargs [ i ] ;
completed . append ( current ) ;
if ( current . endsWith ( " , " ) ) {
current = current . substring ( 0 , current . length ( ) - 1 ) ;
completed . append ( ' ' ) ;
} else run = false ;
selection . add ( current . toLowerCase ( ) ) ;
if ( current . length ( ) > 0 ) {
LinkedList < Server > select = new LinkedList < Server > ( ) ;
if ( current . startsWith ( " :: " ) & & current . length ( ) > 2 ) {
current = current . substring ( 2 ) ;
if ( hostMap = = null ) hostMap = plugin . api . getHosts ( ) ;
if ( current . equals ( " * " ) ) {
for ( Host host : hostMap . values ( ) ) {
select . addAll ( host . getSubServers ( ) . values ( ) ) ;
}
} else {
Host host = hostMap . getOrDefault ( current . toLowerCase ( ) , null ) ;
if ( host ! = null ) {
select . addAll ( host . getSubServers ( ) . values ( ) ) ;
if ( select . size ( ) < = 0 ) {
String msg = " SubServers > There are no " + ( ( mode ) ? " sub " : " " ) + " servers on host: " + host . getName ( ) ;
if ( sender ! = null ) sender . sendMessage ( msg ) ;
msgs . add ( msg ) ;
}
} else {
String msg = " SubServers > There is no host with name: " + current ;
if ( sender ! = null ) sender . sendMessage ( msg ) ;
msgs . add ( msg ) ;
}
}
} else if ( current . startsWith ( " : " ) & & current . length ( ) > 1 ) {
current = current . substring ( 1 ) ;
if ( groupMap = = null ) groupMap = plugin . api . getGroups ( ) ;
if ( current . equals ( " * " ) ) {
for ( List < Server > group : groupMap . values ( ) ) for ( Server server : group ) {
if ( ! mode | | server instanceof SubServer ) select . add ( server ) ;
}
} else {
Map . Entry < String , List < Server > > group = null ;
for ( Map . Entry < String , List < Server > > entry : groupMap . entrySet ( ) ) if ( current . equalsIgnoreCase ( entry . getKey ( ) ) ) {
group = entry ;
break ;
}
if ( group ! = null ) {
for ( Server server : group . getValue ( ) ) {
if ( ! mode | | server instanceof SubServer ) select . add ( server ) ;
}
if ( select . size ( ) < = 0 ) {
String msg = " SubServers > There are no " + ( ( mode ) ? " sub " : " " ) + " servers in group: " + group . getKey ( ) ;
if ( sender ! = null ) sender . sendMessage ( msg ) ;
msgs . add ( msg ) ;
}
} else {
String msg = " SubServers > There is no group with name: " + current ;
if ( sender ! = null ) sender . sendMessage ( msg ) ;
msgs . add ( msg ) ;
}
}
} else {
if ( serverMap = = null ) serverMap = plugin . api . getServers ( ) ;
if ( current . equals ( " * " ) ) {
for ( Server server : serverMap . values ( ) ) {
if ( ! mode | | server instanceof SubServer ) select . add ( server ) ;
}
} else {
Server server = serverMap . getOrDefault ( current . toLowerCase ( ) , null ) ;
if ( server ! = null ) {
select . add ( server ) ;
} else {
String msg = " SubServers > There is no " + ( ( mode ) ? " sub " : " " ) + " server with name: " + current ;
if ( sender ! = null ) sender . sendMessage ( msg ) ;
msgs . add ( msg ) ;
}
}
}
for ( Server server : select ) {
if ( ! servers . contains ( server ) ) servers . add ( server ) ;
}
}
}
args . add ( completed . toString ( ) ) ;
while ( i < rargs . length ) {
args . add ( rargs [ i ] ) ;
last = null ;
i + + ;
}
LinkedList < SubServer > subservers = new LinkedList < SubServer > ( ) ;
for ( Server server : servers ) if ( server instanceof SubServer ) subservers . add ( ( SubServer ) server ) ;
if ( ( ! mode & & servers . size ( ) < = 0 ) | | ( mode & & subservers . size ( ) < = 0 ) ) {
String msg = " SubServers > No " + ( ( mode ) ? " sub " : " " ) + " servers were selected " ;
if ( sender ! = null ) sender . sendMessage ( msg ) ;
msgs . add ( msg ) ;
}
return new ServerSelection ( msgs , selection , servers , subservers , args , last ) ;
}
private static final class ServerSelection {
private final String [ ] msgs ;
private final String [ ] selection ;
private final Server [ ] servers ;
private final SubServer [ ] subservers ;
private final String [ ] args ;
private final String last ;
private ServerSelection ( List < String > msgs , List < String > selection , List < Server > servers , List < SubServer > subservers , List < String > args , String last ) {
this . msgs = msgs . toArray ( new String [ 0 ] ) ;
this . selection = selection . toArray ( new String [ 0 ] ) ;
this . servers = servers . toArray ( new Server [ 0 ] ) ;
this . subservers = subservers . toArray ( new SubServer [ 0 ] ) ;
this . args = args . toArray ( new String [ 0 ] ) ;
this . last = last ;
Arrays . sort ( this . selection ) ;
}
}
2017-12-13 18:29:50 +01:00
private String [ ] printHelp ( ) {
return new String [ ] {
" SubServers > Console Command Help: " ,
" Help: /sub help " ,
" List: /sub list " ,
" Version: /sub version " ,
2018-09-09 00:06:21 +02:00
" Reload: /sub reload [all|config|templates] " ,
2020-06-12 07:45:49 +02:00
" Info: /sub info [proxy|host|group|server|player] <Name> " ,
" Start Server: /sub start <Subservers> " ,
" Restart Server: /sub restart <Subservers> " ,
" Stop Server: /sub stop <Subservers> " ,
" Terminate Server: /sub kill <Subservers> " ,
" Command Server: /sub cmd <Subservers> <Command> [Args...] " ,
" Sudo Server: /sub sudo <Subserver> " ,
2019-04-18 16:02:09 +02:00
" Create Server: /sub create <Name> <Host> <Template> [Version] [Port] " ,
2020-06-12 07:45:49 +02:00
" Update Server: /sub update <Subservers> [Version] " ,
" Remove Server: /sub delete <Subservers> " ,
//" Restore Server: /sub restore <Subservers>",
2017-12-13 18:29:50 +01:00
" " ,
" To see BungeeCord supplied commands, please visit: " ,
" https://www.spigotmc.org/wiki/bungeecord-commands/ "
} ;
}
2017-01-08 03:30:03 +01:00
/ * *
2017-12-13 18:29:50 +01:00
* Suggest command arguments
2017-01-08 03:30:03 +01:00
*
* @param sender Sender
* @param args Arguments
2017-12-13 18:29:50 +01:00
* @return The validator ' s response and list of possible arguments
2017-01-08 03:30:03 +01:00
* /
2020-06-12 07:45:49 +02:00
@SuppressWarnings ( " unchecked " )
2017-12-13 18:29:50 +01:00
public NamedContainer < String , List < String > > suggestArguments ( CommandSender sender , String [ ] args ) {
2020-06-12 07:45:49 +02:00
String Last = ( args . length > 0 ) ? args [ args . length - 1 ] : " " ;
String last = Last . toLowerCase ( ) ;
2019-05-11 23:23:31 +02:00
if ( sender instanceof ProxiedPlayer & & ( ! players . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) | | ! players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) )
| | ! players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) . get ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) ) . get ( ) ) ) {
if ( players . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) & & players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) )
& & players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) . get ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) ) . name ( ) = = null ) {
// do nothing
} else if ( ! players . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) | | ! players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) )
| | Calendar . getInstance ( ) . getTime ( ) . getTime ( ) - players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) . get ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) ) . name ( ) > = TimeUnit . MINUTES . toMillis ( 1 ) ) {
if ( ! ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) instanceof Server ) | | ( ( Server ) ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) ) . getSubData ( ) [ 0 ] = = null ) {
HashMap < ServerInfo , NamedContainer < Long , Boolean > > map = ( players . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) ) ? players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) : new HashMap < ServerInfo , NamedContainer < Long , Boolean > > ( ) ;
map . put ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) , new NamedContainer < > ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) , false ) ) ;
players . put ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) , map ) ;
} else {
HashMap < ServerInfo , NamedContainer < Long , Boolean > > map = ( players . keySet ( ) . contains ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) ) ? players . get ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) ) : new HashMap < ServerInfo , NamedContainer < Long , Boolean > > ( ) ;
map . put ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) , new NamedContainer < > ( null , false ) ) ;
players . put ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) , map ) ;
2019-10-19 00:24:58 +02:00
( ( SubDataClient ) ( ( Server ) ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) ) . getSubData ( ) [ 0 ] ) . sendPacket ( new PacketCheckPermission ( ( ( ProxiedPlayer ) sender ) . getUniqueId ( ) , " subservers.command " , result - > {
2019-05-11 23:23:31 +02:00
map . put ( ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) , new NamedContainer < > ( Calendar . getInstance ( ) . getTime ( ) . getTime ( ) , result ) ) ;
} ) ) ;
}
}
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
} else if ( args . length < = 1 ) {
2019-01-17 20:20:13 +01:00
List < String > cmds = new ArrayList < > ( ) ;
2019-10-19 00:24:58 +02:00
cmds . addAll ( Arrays . asList ( " help " , " list " , " info " , " status " , " version " , " start " , " restart " , " stop " , " kill " , " terminate " , " cmd " , " command " , " create " , " update " , " upgrade " ) ) ;
2020-06-12 07:45:49 +02:00
if ( ! ( sender instanceof ProxiedPlayer ) ) cmds . addAll ( Arrays . asList ( " reload " , " sudo " , " screen " , " remove " , " delete " , " restore " ) ) ;
List < String > list = new ArrayList < String > ( ) ;
for ( String cmd : cmds ) {
if ( cmd . startsWith ( last ) ) list . add ( Last + cmd . substring ( last . length ( ) ) ) ;
2017-01-01 20:34:46 +01:00
}
2020-06-12 07:45:49 +02:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Invalid-Subcommand " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
2017-01-01 20:34:46 +01:00
} else {
2018-08-10 06:50:10 +02:00
if ( args [ 0 ] . equals ( " info " ) | | args [ 0 ] . equals ( " status " ) ) {
2020-06-12 07:45:49 +02:00
ReturnRunnable < Collection < String > > getPlayers = ( ) - > {
LinkedList < String > names = new LinkedList < String > ( ) ;
for ( ProxiedPlayer player : plugin . getPlayers ( ) ) names . add ( player . getName ( ) ) ;
if ( plugin . redis ! = null ) {
for ( String name : Util . < Collection < String > > getDespiteException ( ( ) - > ( Collection < String > ) plugin . redis ( " getHumanPlayersOnline " ) , Collections . emptyList ( ) ) ) if ( ! names . contains ( name ) ) names . add ( name ) ;
}
Collections . sort ( names ) ;
return names ;
} ;
2018-08-10 06:50:10 +02:00
if ( args . length = = 2 ) {
List < String > list = new ArrayList < String > ( ) ;
List < String > subcommands = new ArrayList < String > ( ) ;
subcommands . add ( " proxy " ) ;
subcommands . add ( " host " ) ;
subcommands . add ( " group " ) ;
subcommands . add ( " server " ) ;
2020-06-12 07:45:49 +02:00
subcommands . add ( " subserver " ) ;
subcommands . add ( " player " ) ;
for ( String command : subcommands ) {
if ( ! list . contains ( command ) & & command . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + command . substring ( last . length ( ) ) ) ;
}
Proxy master = plugin . api . getMasterProxy ( ) ;
if ( master ! = null & & ! list . contains ( master . getName ( ) ) & & master . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + master . getName ( ) . substring ( last . length ( ) ) ) ;
for ( Proxy proxy : plugin . api . getProxies ( ) . values ( ) ) {
if ( ! list . contains ( proxy . getName ( ) ) & & proxy . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + proxy . getName ( ) . substring ( last . length ( ) ) ) ;
}
for ( Host host : plugin . api . getHosts ( ) . values ( ) ) {
if ( ! list . contains ( host . getName ( ) ) & & host . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + host . getName ( ) . substring ( last . length ( ) ) ) ;
}
for ( String group : plugin . api . getGroups ( ) . keySet ( ) ) {
if ( ! list . contains ( group ) & & group . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + group . substring ( last . length ( ) ) ) ;
}
for ( Server server : plugin . api . getServers ( ) . values ( ) ) {
if ( ! list . contains ( server . getName ( ) ) & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + server . getName ( ) . substring ( last . length ( ) ) ) ;
}
for ( String player : getPlayers . run ( ) ) {
if ( ! list . contains ( player ) & & player . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + player . substring ( last . length ( ) ) ) ;
2018-08-10 06:50:10 +02:00
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Info.Unknown " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else if ( args . length = = 3 ) {
List < String > list = new ArrayList < String > ( ) ;
2020-06-12 07:45:49 +02:00
switch ( args [ 1 ] . toLowerCase ( ) ) {
case " p " :
case " proxy " :
Proxy master = plugin . api . getMasterProxy ( ) ;
if ( master ! = null & & master . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + master . getName ( ) . substring ( last . length ( ) ) ) ;
for ( Proxy proxy : plugin . api . getProxies ( ) . values ( ) ) {
if ( ! list . contains ( proxy . getName ( ) ) & & proxy . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + proxy . getName ( ) . substring ( last . length ( ) ) ) ;
}
break ;
case " h " :
case " host " :
for ( Host host : plugin . api . getHosts ( ) . values ( ) ) {
if ( host . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + host . getName ( ) . substring ( last . length ( ) ) ) ;
}
break ;
case " g " :
case " group " :
for ( String group : plugin . api . getGroups ( ) . keySet ( ) ) {
if ( group . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + group . substring ( last . length ( ) ) ) ;
}
break ;
case " s " :
case " server " :
case " subserver " :
for ( Server server : plugin . api . getServers ( ) . values ( ) ) {
if ( ( ! args [ 1 ] . equalsIgnoreCase ( " subserver " ) | | server instanceof SubServer ) & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + server . getName ( ) . substring ( last . length ( ) ) ) ;
}
break ;
case " player " :
for ( String player : getPlayers . run ( ) ) {
if ( player . toLowerCase ( ) . startsWith ( last ) )
list . add ( Last + player . substring ( last . length ( ) ) ) ;
}
break ;
2018-08-10 06:50:10 +02:00
}
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 ( ) ) ;
}
2019-06-17 05:13:48 +02:00
} else if ( ! ( sender instanceof ProxiedPlayer ) & & ( args [ 0 ] . equals ( " reload " ) | | args [ 0 ] . equals ( " restore " ) ) ) {
if ( args [ 0 ] . equals ( " reload " ) ) {
List < String > list = new ArrayList < String > ( ) ,
completes = Arrays . asList ( " all " , " config " , " templates " ) ;
if ( args . length = = 2 ) {
2020-06-12 07:45:49 +02:00
for ( String complete : completes ) {
if ( complete . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + complete . substring ( last . length ( ) ) ) ;
2019-01-17 20:20:13 +01:00
}
2019-06-17 05:13:48 +02:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
} else {
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
}
} else /* if (args[0].equals("restore")) */ {
if ( args . length = = 2 ) {
2020-06-12 07:45:49 +02:00
return new NamedContainer < > ( null , Collections . singletonList ( " <Subserver> " ) ) ;
2019-06-17 05:13:48 +02:00
} else {
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
2019-01-17 20:20:13 +01:00
}
}
2018-08-10 06:50:10 +02:00
} else if ( args [ 0 ] . equals ( " start " ) | |
2020-06-12 07:45:49 +02:00
args [ 0 ] . equals ( " restart " ) | |
args [ 0 ] . equals ( " stop " ) | |
args [ 0 ] . equals ( " kill " ) | | args [ 0 ] . equals ( " terminate " ) | |
args [ 0 ] . equals ( " cmd " ) | | args [ 0 ] . equals ( " command " ) | |
args [ 0 ] . equals ( " update " ) | | args [ 0 ] . equals ( " upgrade " ) | |
2019-01-17 20:20:13 +01:00
( ! ( sender instanceof ProxiedPlayer ) & & (
args [ 0 ] . equals ( " sudo " ) | | args [ 0 ] . equals ( " screen " ) | |
2020-06-12 07:45:49 +02:00
args [ 0 ] . equals ( " remove " ) | | args [ 0 ] . equals ( " del " ) | | args [ 0 ] . equals ( " delete " )
2019-01-17 20:20:13 +01:00
) ) ) {
List < String > list = new ArrayList < String > ( ) ;
2020-06-12 07:45:49 +02:00
ServerSelection select = selectServers ( null , args , 1 , true ) ;
if ( select . last ! = null ) {
if ( last . startsWith ( " :: " ) ) {
Map < String , Host > hosts = plugin . api . getHosts ( ) ;
if ( hosts . size ( ) > 0 ) {
if ( Arrays . binarySearch ( select . selection , " ::* " ) < 0 & & " ::* " . startsWith ( last ) ) list . add ( " ::* " ) ;
if ( sender instanceof ProxiedPlayer & & Arrays . binarySearch ( select . selection , " ::. " ) < 0 & & " ::. " . startsWith ( last ) ) list . add ( " ::. " ) ;
for ( Host host : hosts . values ( ) ) {
String name = " :: " + host . getName ( ) ;
if ( Arrays . binarySearch ( select . selection , name . toLowerCase ( ) ) < 0 & & name . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + name . substring ( last . length ( ) ) ) ;
}
2019-01-07 22:09:20 +01:00
}
2020-06-12 07:45:49 +02:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown-Host " ) . replace ( " $str$ " , select . last ) : null , list ) ;
} else if ( last . startsWith ( " : " ) ) {
Map < String , List < Server > > groups = plugin . api . getGroups ( ) ;
if ( groups . size ( ) > 0 ) {
if ( Arrays . binarySearch ( select . selection , " :* " ) < 0 & & " :* " . startsWith ( last ) ) list . add ( " :* " ) ;
if ( sender instanceof ProxiedPlayer & & Arrays . binarySearch ( select . selection , " :. " ) < 0 & & " :. " . startsWith ( last ) ) list . add ( " :. " ) ;
for ( String group : groups . keySet ( ) ) {
group = " : " + group ;
if ( Arrays . binarySearch ( select . selection , group . toLowerCase ( ) ) < 0 & & group . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + group . substring ( last . length ( ) ) ) ;
}
}
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown-Group " ) . replace ( " $str$ " , select . last ) : null , list ) ;
2019-01-07 22:09:20 +01:00
} else {
2020-06-12 07:45:49 +02:00
Map < String , SubServer > subservers = plugin . api . getSubServers ( ) ;
if ( subservers . size ( ) > 0 ) {
if ( Arrays . binarySearch ( select . selection , " * " ) < 0 & & " * " . startsWith ( last ) ) list . add ( " * " ) ;
if ( sender instanceof ProxiedPlayer & & Arrays . binarySearch ( select . selection , " . " ) < 0 & & " . " . startsWith ( last ) ) list . add ( " . " ) ;
for ( SubServer server : subservers . values ( ) ) {
if ( Arrays . binarySearch ( select . selection , server . getName ( ) . toLowerCase ( ) ) < 0 & & server . getName ( ) . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + server . getName ( ) . substring ( last . length ( ) ) ) ;
}
2017-01-01 20:34:46 +01:00
}
2020-06-12 07:45:49 +02:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown-SubServer " ) . replace ( " $str$ " , select . last ) : null , list ) ;
2017-01-01 20:34:46 +01:00
}
2020-06-12 07:45:49 +02:00
} else if ( args [ 0 ] . equals ( " cmd " ) | | args [ 0 ] . equals ( " command " ) ) {
if ( select . args . length = = 3 ) {
return new NamedContainer < > ( null , Collections . singletonList ( " <Command> " ) ) ;
2017-01-01 20:34:46 +01:00
} else {
2020-06-12 07:45:49 +02:00
return new NamedContainer < > ( null , Collections . singletonList ( " [Args...] " ) ) ;
}
} else if ( args [ 0 ] . equals ( " update " ) | | args [ 0 ] . equals ( " upgrade " ) ) {
if ( select . args . length = = 3 ) {
return new NamedContainer < > ( null , Collections . singletonList ( " [Version] " ) ) ;
2017-01-01 20:34:46 +01:00
}
}
2020-06-12 07:45:49 +02:00
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
2017-01-01 20:34:46 +01:00
} else if ( args [ 0 ] . equals ( " create " ) ) {
if ( args . length = = 2 ) {
2017-12-13 18:29:50 +01:00
return new NamedContainer < > ( null , Collections . singletonList ( " <Name> " ) ) ;
2017-01-01 20:34:46 +01:00
} else if ( args . length = = 3 ) {
List < String > list = new ArrayList < String > ( ) ;
2020-06-12 07:45:49 +02:00
for ( Host host : plugin . api . getHosts ( ) . values ( ) ) {
if ( host . getName ( ) . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + host . getName ( ) . substring ( last . length ( ) ) ) ;
2017-01-01 20:34:46 +01:00
}
2018-01-02 23:29:25 +01:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Generic.Unknown-Host " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
2017-01-01 20:34:46 +01:00
} else if ( args . length = = 4 ) {
List < String > list = new ArrayList < String > ( ) ;
2017-05-29 07:00:02 +02:00
Map < String , Host > hosts = plugin . api . getHosts ( ) ;
2018-01-02 23:29:25 +01:00
if ( ! hosts . keySet ( ) . contains ( args [ 2 ] . toLowerCase ( ) ) ) {
list . add ( " <Template> " ) ;
2017-05-29 07:00:02 +02:00
} else {
2017-12-13 18:29:50 +01:00
for ( SubCreator . ServerTemplate template : hosts . get ( args [ 2 ] . toLowerCase ( ) ) . getCreator ( ) . getTemplates ( ) . values ( ) ) {
2020-06-12 07:45:49 +02:00
if ( template . getName ( ) . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + template . getName ( ) . substring ( last . length ( ) ) ) ;
2017-12-13 18:29:50 +01:00
}
2017-01-01 20:34:46 +01:00
}
2018-01-02 23:29:25 +01:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Command.Creator.Invalid-Template " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
2017-01-01 20:34:46 +01:00
} else if ( args . length = = 5 ) {
2019-05-09 22:17:15 +02:00
return new NamedContainer < > ( null , Collections . singletonList ( " [Version] " ) ) ;
2017-01-01 20:34:46 +01:00
} else if ( args . length = = 6 ) {
2017-12-13 18:29:50 +01:00
if ( last . length ( ) > 0 ) {
if ( Util . isException ( ( ) - > Integer . parseInt ( last ) ) | | Integer . parseInt ( last ) < = 0 | | Integer . parseInt ( last ) > 65535 ) {
2018-01-02 23:29:25 +01:00
return new NamedContainer < > ( plugin . api . getLang ( " SubServers " , " Command.Creator.Invalid-Port " ) , Collections . emptyList ( ) ) ;
2017-12-13 18:29:50 +01:00
}
2017-01-01 20:34:46 +01:00
}
2019-06-17 05:13:48 +02:00
return new NamedContainer < > ( null , Collections . singletonList ( " [Port] " ) ) ;
} else {
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
}
2020-06-12 07:45:49 +02:00
} else if ( sender instanceof ProxiedPlayer & & ( args [ 0 ] . equals ( " tp " ) | | args [ 0 ] . equals ( " teleport " ) ) ) {
if ( args . length = = 2 | | args . length = = 3 ) {
2019-06-17 05:13:48 +02:00
List < String > list = new ArrayList < String > ( ) ;
2020-06-12 07:45:49 +02:00
if ( args . length = = 2 ) {
list . add ( " @p " ) ;
list . add ( " @a " ) ;
list . add ( " @r " ) ;
list . add ( " @s " ) ;
List < UUID > used = new ArrayList < UUID > ( ) ;
for ( ProxiedPlayer player : ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) . getPlayers ( ) ) {
if ( player . getName ( ) . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + player . getName ( ) . substring ( last . length ( ) ) ) ;
used . add ( player . getUniqueId ( ) ) ;
}
if ( plugin . redis ! = null ) {
try {
for ( UUID id : ( Set < UUID > ) plugin . redis ( " getPlayersOnServer " , new NamedContainer < > ( String . class , ( ( ProxiedPlayer ) sender ) . getServer ( ) . getInfo ( ) . getName ( ) ) ) ) {
if ( ! used . contains ( id ) ) {
String name = ( String ) plugin . redis ( " getNameFromUuid " , new NamedContainer < > ( UUID . class , id ) , new NamedContainer < > ( boolean . class , false ) ) ;
if ( name . toLowerCase ( ) . startsWith ( last ) ) list . add ( Last + name . substring ( last . length ( ) ) ) ;
used . add ( id ) ;
}
}
} catch ( Exception e ) { }
2019-06-17 05:13:48 +02:00
}
}
2020-06-12 07:45:49 +02:00
for ( Server server : plugin . api . getServers ( ) . values ( ) ) {
if ( 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-Server " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
2017-12-13 18:29:50 +01:00
} else {
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
2017-01-01 20:34:46 +01:00
}
} else {
2018-01-02 23:29:25 +01:00
return new NamedContainer < > ( plugin . api . getLang ( " SubServers " , " Command.Generic.Invalid-Subcommand " ) . replace ( " $str$ " , args [ 0 ] ) , Collections . emptyList ( ) ) ;
2016-12-15 22:04:39 +01:00
}
2016-12-05 04:21:04 +01:00
}
}
2017-01-08 03:30:03 +01:00
/ * *
* BungeeCord / server
* /
2017-12-22 00:37:39 +01:00
public static final class BungeeServer extends CommandX {
2019-08-30 21:44:54 +02:00
private SubProxy plugin ;
private BungeeServer ( SubProxy plugin , String command ) {
2016-12-24 05:55:17 +01:00
super ( command , " bungeecord.command.server " ) ;
this . plugin = plugin ;
2019-05-17 00:36:41 +02:00
description ( this , " Displays a list of or connects you to servers " ) ;
help ( this ,
" Displays a list of all players connected to BungeeCord. " ,
" This list is separated into groups by server. " ,
" " ,
" Permission: bungeecord.command.list " ,
" Example: " ,
" /glist "
) ;
2016-12-24 05:55:17 +01:00
}
2020-06-12 07:45:49 +02:00
static NamedContainer < BungeeServer , CommandX > newInstance ( SubProxy plugin , String command ) {
2017-12-13 18:29:50 +01:00
NamedContainer < BungeeServer , CommandX > cmd = new NamedContainer < > ( new BungeeServer ( plugin , command ) , null ) ;
2017-12-22 00:37:39 +01:00
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.Bungee.Library.Compatibility.mc1_13.CommandX(cmd.name());
2018-07-15 07:23:11 +02:00
//}
2017-12-22 00:37:39 +01:00
cmd . set ( now ) ;
return cmd ;
2017-12-13 18:29:50 +01:00
}
2017-01-08 03:30:03 +01:00
/ * *
* Override / server
*
* @param sender Sender
* @param args Arguments
* /
2016-12-24 05:55:17 +01:00
@SuppressWarnings ( " deprecation " )
@Override
public void execute ( CommandSender sender , String [ ] args ) {
if ( sender instanceof ProxiedPlayer ) {
if ( args . length > 0 ) {
Map < String , Server > servers = plugin . api . getServers ( ) ;
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 " ) ) ;
2016-12-24 05:55:17 +01: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 " ) ) ;
2016-12-24 05:55:17 +01:00
for ( Server server : plugin . api . getServers ( ) . values ( ) ) {
2018-11-21 22:52:03 +01:00
if ( ! server . isHidden ( ) & & server . canAccess ( sender ) & & ( ! ( server instanceof SubServer ) | | ( ( SubServer ) server ) . isRunning ( ) ) ) {
2016-12-24 05:55:17 +01: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 ( server . getGlobalPlayers ( ) . size ( ) ) ) ) } ) ) ;
2017-12-08 08:35:50 +01:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2016-12-24 05:55:17 +01: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 " ) ) ;
2016-12-24 05:55:17 +01:00
sender . sendMessage ( serverm ) ;
}
} else {
2018-01-02 23:29:25 +01:00
sender . sendMessage ( plugin . api . getLang ( " SubServers " , " Command.Generic.Player-Only " ) ) ;
2016-12-24 05:55:17 +01:00
}
}
2017-01-01 20:34:46 +01:00
2017-01-08 03:30:03 +01:00
/ * *
2017-12-13 18:29:50 +01:00
* Suggest command arguments
2017-01-08 03:30:03 +01:00
*
* @param sender Sender
* @param args Arguments
2017-12-13 18:29:50 +01:00
* @return The validator ' s response and list of possible arguments
2017-01-08 03:30:03 +01:00
* /
2017-12-13 18:29:50 +01:00
public NamedContainer < String , List < String > > suggestArguments ( CommandSender sender , String [ ] args ) {
2017-01-01 20:34:46 +01: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 > ( ) ;
2020-06-12 07:45:49 +02:00
for ( Server server : plugin . api . getServers ( ) . values ( ) ) {
if ( server . getName ( ) . toLowerCase ( ) . startsWith ( last ) & & ! server . isHidden ( ) ) list . add ( server . getName ( ) ) ;
2017-01-01 20:34:46 +01:00
}
2020-06-12 07:45:49 +02:00
return new NamedContainer < > ( ( list . size ( ) < = 0 ) ? plugin . api . getLang ( " SubServers " , " Bungee.Server.Invalid " ) . replace ( " $str$ " , args [ 0 ] ) : null , list ) ;
2017-01-01 20:34:46 +01:00
} else {
2017-12-13 18:29:50 +01:00
return new NamedContainer < > ( null , Collections . emptyList ( ) ) ;
2017-01-01 20:34:46 +01:00
}
}
2016-12-24 05:55:17 +01:00
}
2017-01-08 03:30:03 +01:00
/ * *
* BungeeCord / glist
* /
public static final class BungeeList extends Command {
2019-08-30 21:44:54 +02:00
private SubProxy plugin ;
2020-06-12 07:45:49 +02:00
BungeeList ( SubProxy plugin , String command ) {
2016-12-24 05:55:17 +01:00
super ( command , " bungeecord.command.list " ) ;
this . plugin = plugin ;
2019-05-17 00:36:41 +02:00
description ( this , " Displays a list of all players " ) ;
help ( this ,
" Displays a list of all players connected to BungeeCord. " ,
" This list is separated into groups by server. " ,
" " ,
" Permission: bungeecord.command.list " ,
" Example: " ,
" /glist "
) ;
2016-12-24 05:55:17 +01:00
}
2017-01-08 03:30:03 +01:00
/ * *
* Override / glist
*
* @param sender
* @param args
* /
2016-12-24 05:55:17 +01:00
@SuppressWarnings ( " deprecation " )
@Override
public void execute ( CommandSender sender , String [ ] args ) {
List < String > messages = new LinkedList < String > ( ) ;
int players = 0 ;
for ( Server server : plugin . api . getServers ( ) . values ( ) ) {
2017-12-08 08:35:50 +01:00
List < String > playerlist = new ArrayList < String > ( ) ;
2020-06-12 07:45:49 +02:00
for ( RemotePlayer player : server . getGlobalPlayers ( ) ) playerlist . add ( player . getName ( ) ) ;
2017-12-08 08:35:50 +01:00
Collections . sort ( playerlist ) ;
players + = playerlist . size ( ) ;
2016-12-24 05:55:17 +01: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 ) ;
2016-12-24 05:55:17 +01: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 ) ) ) ;
2016-12-24 05:55:17 +01:00
}
}
2016-12-05 04:21:04 +01:00
}