diff --git a/Artifacts/SubServers.Bungee.jar b/Artifacts/SubServers.Bungee.jar index 3af66da0..aa69f267 100644 Binary files a/Artifacts/SubServers.Bungee.jar and b/Artifacts/SubServers.Bungee.jar differ diff --git a/Artifacts/SubServers.Client.Bukkit.jar b/Artifacts/SubServers.Client.Bukkit.jar index 1c9d198f..13afd8d0 100644 Binary files a/Artifacts/SubServers.Client.Bukkit.jar and b/Artifacts/SubServers.Client.Bukkit.jar differ diff --git a/Artifacts/SubServers.Host.jar b/Artifacts/SubServers.Host.jar index 122e32a8..fd7f0b35 100644 Binary files a/Artifacts/SubServers.Host.jar and b/Artifacts/SubServers.Host.jar differ diff --git a/Javadoc/SubServers.Bungee/index-all.html b/Javadoc/SubServers.Bungee/index-all.html index 2c1c31a8..9ce0193e 100644 --- a/Javadoc/SubServers.Bungee/index-all.html +++ b/Javadoc/SubServers.Bungee/index-all.html @@ -2274,6 +2274,8 @@
Renames the Container
+
resetSudo(SubStoppedEvent) - Method in class net.ME1312.SubServers.Bungee.SubPlugin
+
 
run(JSONObject) - Method in interface net.ME1312.SubServers.Bungee.Library.JSONCallback
Run the Callback
@@ -2688,6 +2690,8 @@
Server Shell Exit Event
+
sudo - Variable in class net.ME1312.SubServers.Bungee.SubPlugin
+
 
superSection() - Method in class net.ME1312.SubServers.Bungee.Library.Config.YAMLSection
Go up a level in the config (or null if this is the top layer)
diff --git a/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubPlugin.html b/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubPlugin.html index 86975b0c..459e55f7 100644 --- a/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubPlugin.html +++ b/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubPlugin.html @@ -17,7 +17,7 @@ catch(err) { } //--> -var methods = {"i0":10,"i1":10,"i2":10}; +var methods = {"i0":10,"i1":10,"i2":10,"i3":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -115,10 +115,15 @@ var activeTableTab = "activeTableTab";
@@ -179,6 +184,10 @@ extends net.md_5.bungee.BungeeCord subdata  +SubServer +sudo  + + Version version  @@ -212,11 +221,15 @@ extends net.md_5.bungee.BungeeCord void +resetSudo(SubStoppedEvent e)  + + +void startListeners()
Load Hosts, Servers, SubServers, and SubData Direct
- + void stopListeners()
Reset all changes made by startListeners
@@ -330,6 +343,15 @@ extends net.md_5.bungee.BungeeCord
public SubDataServer subdata
+ + + + @@ -400,7 +422,7 @@ extends net.md_5.bungee.BungeeCord - diff --git a/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/package-tree.html b/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/package-tree.html index 706fcc1a..3d8658c8 100644 --- a/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/package-tree.html +++ b/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/package-tree.html @@ -91,7 +91,7 @@ diff --git a/Javadoc/SubServers.Bungee/overview-tree.html b/Javadoc/SubServers.Bungee/overview-tree.html index 83ee2ce8..44dcd1f4 100644 --- a/Javadoc/SubServers.Bungee/overview-tree.html +++ b/Javadoc/SubServers.Bungee/overview-tree.html @@ -173,7 +173,7 @@ diff --git a/Javadoc/SubServers.Host/allclasses-frame.html b/Javadoc/SubServers.Host/allclasses-frame.html index d7846a37..1ec64b0a 100644 --- a/Javadoc/SubServers.Host/allclasses-frame.html +++ b/Javadoc/SubServers.Host/allclasses-frame.html @@ -90,6 +90,7 @@
  • SubStoppedEvent
  • SubTask
  • SystemLogger
  • +
  • TextColor
  • UniversalFile
  • Util
  • Util.ExceptionRunnable
  • diff --git a/Javadoc/SubServers.Host/allclasses-noframe.html b/Javadoc/SubServers.Host/allclasses-noframe.html index a1fbf38f..56445fb0 100644 --- a/Javadoc/SubServers.Host/allclasses-noframe.html +++ b/Javadoc/SubServers.Host/allclasses-noframe.html @@ -90,6 +90,7 @@
  • SubStoppedEvent
  • SubTask
  • SystemLogger
  • +
  • TextColor
  • UniversalFile
  • Util
  • Util.ExceptionRunnable
  • diff --git a/Javadoc/SubServers.Host/index-all.html b/Javadoc/SubServers.Host/index-all.html index 21609711..ffa9e336 100644 --- a/Javadoc/SubServers.Host/index-all.html +++ b/Javadoc/SubServers.Host/index-all.html @@ -575,6 +575,8 @@
    Gets the Server Socket
    +
    getColorChar() - Static method in enum net.ME1312.SubServers.Host.Library.TextColor
    +
     
    getCommand() - Method in class net.ME1312.SubServers.Host.API.Event.CommandPreProcessEvent
    Gets the full Command String
    @@ -1005,6 +1007,8 @@
    Get a UUID List by Handle
    +
    getValue() - Method in enum net.ME1312.SubServers.Host.Library.TextColor
    +
     
    getValue() - Method in enum net.ME1312.SubServers.Host.Network.Packet.PacketExUpdateServer.UpdateType
     
    getValues() - Method in class net.ME1312.SubServers.Host.Library.Config.YAMLSection
    @@ -1633,6 +1637,8 @@
    New PacketTeleportPlayer (Out)
    +
    parseColor(char, String) - Static method in enum net.ME1312.SubServers.Host.Library.TextColor
    +
     
    plugin() - Method in class net.ME1312.SubServers.Host.API.Command
    Gets the Plugin that registering this Command
    @@ -1891,6 +1897,8 @@
    Stop SubServers.Host
    +
    stripColor(String) - Static method in enum net.ME1312.SubServers.Host.Library.TextColor
    +
     
    StrongEncryptionNotAvailableException(int) - Constructor for exception net.ME1312.SubServers.Host.Network.AES.StrongEncryptionNotAvailableException
     
    SubAddServerEvent - Class in net.ME1312.SubServers.Host.API.Event
    @@ -2076,6 +2084,8 @@
    Terminates the Server
    +
    TextColor - Enum in net.ME1312.SubServers.Host.Library
    +
     
    toFile() - Method in class net.ME1312.SubServers.Host.Executable.Executable
    Get Executable File
    @@ -2100,6 +2110,8 @@
     
    toString() - Method in class net.ME1312.SubServers.Host.Library.Event.Event
     
    +
    toString() - Method in enum net.ME1312.SubServers.Host.Library.TextColor
    +
     
    toString() - Method in class net.ME1312.SubServers.Host.Library.Version.Version
     
    @@ -2172,6 +2184,10 @@
    Returns the enum constant of this type with the specified name.
    +
    valueOf(String) - Static method in enum net.ME1312.SubServers.Host.Library.TextColor
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    valueOf(String) - Static method in enum net.ME1312.SubServers.Host.Network.Packet.PacketExUpdateServer.UpdateType
    Returns the enum constant of this type with the specified name.
    @@ -2185,6 +2201,11 @@
    Returns an array containing the constants of this enum type, in the order they are declared.
    +
    values() - Static method in enum net.ME1312.SubServers.Host.Library.TextColor
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    values() - Static method in enum net.ME1312.SubServers.Host.Network.Packet.PacketExUpdateServer.UpdateType
    Returns an array containing the constants of this enum type, in diff --git a/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/NamedContainer.html b/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/NamedContainer.html index a56e81ed..724ef25c 100644 --- a/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/NamedContainer.html +++ b/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/NamedContainer.html @@ -48,7 +48,7 @@ var activeTableTab = "activeTableTab"; diff --git a/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-summary.html b/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-summary.html index 8488c358..1b423df0 100644 --- a/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-summary.html +++ b/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-summary.html @@ -138,6 +138,21 @@ +
  • + + + + + + + + + + + + +
    Enum Summary 
    EnumDescription
    TextColor 
    +
  • diff --git a/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-tree.html b/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-tree.html index 5501809c..c97e24ad 100644 --- a/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-tree.html +++ b/Javadoc/SubServers.Host/net/ME1312/SubServers/Host/Library/package-tree.html @@ -100,6 +100,18 @@
  • net.ME1312.SubServers.Host.Library.Util.ExceptionRunnable
  • net.ME1312.SubServers.Host.Library.Util.ReturnRunnable<R>
  • +

    Enum Hierarchy

    +
    diff --git a/Javadoc/SubServers.Host/overview-tree.html b/Javadoc/SubServers.Host/overview-tree.html index e19e8b61..e7049079 100644 --- a/Javadoc/SubServers.Host/overview-tree.html +++ b/Javadoc/SubServers.Host/overview-tree.html @@ -232,6 +232,7 @@
  • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) diff --git a/SubServers.Bungee/META-INF/MANIFEST.MF b/SubServers.Bungee/META-INF/MANIFEST.MF index be1fe0cf..99d7144e 100644 --- a/SubServers.Bungee/META-INF/MANIFEST.MF +++ b/SubServers.Bungee/META-INF/MANIFEST.MF @@ -1,5 +1,5 @@ Manifest-Version: 1.0 Class-Path: BungeeCord.jar Main-Class: net.ME1312.SubServers.Bungee.Launch -Implementation-Version: 2.12d -Specification-Version: 1 +Implementation-Version: 2.12.1a +Specification-Version: 0 diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java index 22af2c11..687aa7cf 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java @@ -5,6 +5,7 @@ import net.ME1312.SubServers.Bungee.Host.SubLogger; import net.ME1312.SubServers.Bungee.Library.Container; import net.ME1312.SubServers.Bungee.Library.Util; import net.ME1312.SubServers.Bungee.Network.Packet.PacketInExLogMessage; +import net.ME1312.SubServers.Bungee.SubAPI; import net.md_5.bungee.api.ProxyServer; import java.io.File; @@ -85,6 +86,7 @@ public class ExternalSubLogger extends SubLogger { * * @param line Message */ + @SuppressWarnings("deprecation") public void log(String line) { if (started) { String msg = line; @@ -92,12 +94,12 @@ public class ExternalSubLogger extends SubLogger { // REGEX Formatting String type = ""; - Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg); + Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg.replaceAll("\u001B\\[[;\\d]*m", "")); while (matcher.find()) { type = matcher.group(3).toUpperCase(); } - msg = msg.replaceAll("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)", ""); + msg = msg.substring(msg.length() - msg.replaceAll("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)", "").length()); // Determine LOG LEVEL switch (type) { @@ -115,18 +117,18 @@ public class ExternalSubLogger extends SubLogger { } // Filter Message - boolean allow = true; + boolean allow = log.get() && (SubAPI.getInstance().getInternals().sudo == null || SubAPI.getInstance().getInternals().sudo == getHandler()); List filters = new ArrayList(); filters.addAll(this.filters); for (SubLogFilter filter : filters) try { - if (allow) allow = filter.log(level, msg); + allow = (filter.log(level, msg) && allow); } catch (Throwable e) { new InvocationTargetException(e, "Exception while running SubLogger Event").printStackTrace(); } // Log to CONSOLE - if (log.get() && allow) ProxyServer.getInstance().getLogger().log(level, name + " > " + msg); + if (allow) ProxyServer.getInstance().getLogger().log(level, name + " > " + msg); // Log to MEMORY messages.add(new LogMessage(level, msg)); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java index 7cc597d7..96e42e6a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java @@ -5,6 +5,7 @@ import net.ME1312.SubServers.Bungee.Host.SubLogger; import net.ME1312.SubServers.Bungee.Library.Container; import net.ME1312.SubServers.Bungee.Library.NamedContainer; import net.ME1312.SubServers.Bungee.Library.Util; +import net.ME1312.SubServers.Bungee.SubAPI; import net.md_5.bungee.api.ProxyServer; import java.io.*; @@ -72,6 +73,7 @@ public class InternalSubLogger extends SubLogger { } } + @SuppressWarnings("deprecation") private void start(InputStream in, boolean isErr) { try { BufferedReader br = new BufferedReader(new InputStreamReader(in)); @@ -83,7 +85,7 @@ public class InternalSubLogger extends SubLogger { // REGEX Formatting String type = ""; - Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg); + Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg.replaceAll("\u001B\\[[;\\d]*m", "")); while (matcher.find()) { type = matcher.group(3).toUpperCase(); } @@ -106,18 +108,18 @@ public class InternalSubLogger extends SubLogger { } // Filter Message - boolean allow = true; + boolean allow = log.get() && (SubAPI.getInstance().getInternals().sudo == null || SubAPI.getInstance().getInternals().sudo == getHandler()); List filters = new ArrayList(); filters.addAll(this.filters); for (SubLogFilter filter : filters) try { - if (allow) allow = filter.log(level, msg); + allow = (filter.log(level, msg) && allow); } catch (Throwable e) { new InvocationTargetException(e, "Exception while running SubLogger Event").printStackTrace(); } // Log to CONSOLE - if (log.get() && allow) ProxyServer.getInstance().getLogger().log(level, name + " > " + msg); + if (allow) ProxyServer.getInstance().getLogger().log(level, name + " > " + msg); // Log to MEMORY messages.add(new LogMessage(level, msg)); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java index fe46867d..59743255 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java @@ -90,8 +90,15 @@ public final class Launch { if (!options.has("noconsole")) { String line; while (plugin.isRunning && (line = plugin.getConsoleReader().readLine(">")) != null) { - if (!plugin.getPluginManager().dispatchCommand(net.md_5.bungee.command.ConsoleCommandSender.class.cast(net.md_5.bungee.command.ConsoleCommandSender.class.getMethod("getInstance").invoke(null)), line)) { - plugin.getConsole().sendMessage(net.md_5.bungee.api.ChatColor.RED + "Command not found"); + if (plugin.sudo == null) { + if (!plugin.getPluginManager().dispatchCommand(net.md_5.bungee.command.ConsoleCommandSender.class.cast(net.md_5.bungee.command.ConsoleCommandSender.class.getMethod("getInstance").invoke(null)), line)) { + plugin.getConsole().sendMessage(net.md_5.bungee.api.ChatColor.RED + "Command not found"); + } + } else if (line.equals("exit")) { + plugin.sudo = null; + System.out.println("SubServers > Reverting to the BungeeCord Console"); + } else { + plugin.sudo.command(line); } } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml index b8c03cd4..af7f7786 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml @@ -1,4 +1,4 @@ -Version: '2.12b+' +Version: '2.12.1a+' Lang: 'Bungee.Server.Current': '&6You are currently connected to $str$' 'Bungee.Server.Available': '&6You may connect to the following servers at this time:' @@ -6,7 +6,7 @@ Lang: 'Bungee.Server.Hover': '$int$ player(s)\n&oClick to connect to the server' 'Bungee.Server.Divider': '&6, ' 'Bungee.Server.Invalid': '&cThe specified server does not exist.' - 'Bungee.List.Format': '&a[$str$] &e($int$): ' + 'Bungee.List.Format': '&a[$str$] &e($int$)&r: ' 'Bungee.List.List': '&f$str$' 'Bungee.List.Divider': '&f, ' 'Bungee.List.Total': 'Total players online: $int$' @@ -19,6 +19,7 @@ Lang: 'Command.Help.Help': ' &7Help:&f $str$' 'Command.Help.List': ' &7List:&f $str$' 'Command.Help.Version': ' &7Version:&f $str$' + 'Command.Help.Info': ' &Info:&f $str$' 'Command.Help.Terminate': ' &7Teleport to Server:&f $str$' 'Command.Help.Host.Create': ' &7Create Server:&f $str$' 'Command.Help.Server.Teleport': ' &7Teleport to Server:&f $str$' @@ -30,6 +31,11 @@ Lang: 'Command.List.Host-Header': '&7SubServers \u00BB Host List:' 'Command.List.Server-Header': '&7SubServers \u00BB Server List:' 'Command.List.Divider': '&7, ' + 'Command.Info': '&7SubServers \u00BB Info on &f$str$&7:' + 'Command.Info.Unknown': '&cSubServers \u00BB There is no server with that name' + 'Command.Info.Invalid': '&cSubServers \u00BB That Server is not a SubServer' + 'Command.Info.Format': '- &f$str$&7: &r' + 'Command.Info.List': ' - $str$' 'Command.Start': '&aSubServers \u00BB Starting SubServer' 'Command.Start.Unknown': '&cSubServers \u00BB There is no server with that name' 'Command.Start.Invalid': '&cSubServers \u00BB That Server is not a SubServer' diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index 28bbd489..6eb623c0 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -48,16 +48,44 @@ public final class SubCommand extends Command implements TabExecutor { sender.sendMessage("SubServers > SubServers.Bungee is running version " + plugin.version.toString() + ((plugin.bversion != null)?" BETA "+plugin.bversion.toString():"")); } else if (args[0].equalsIgnoreCase("list")) { List hosts = new ArrayList(); - for (Host host : plugin.hosts.values()) { - hosts.add(host.getDisplayName() + ((host.getName().equals(host.getDisplayName()))?"":" (" + host.getName() + ')')); + for (Host host : plugin.hosts.values()) { + hosts.add(host.getDisplayName() + ((host.getName().equals(host.getDisplayName())) ? "" : " (" + host.getName() + ')')); } List servers = new ArrayList(); for (Server server : plugin.api.getServers().values()) { - servers.add(server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" (" + server.getName() + ')')); + servers.add(server.getDisplayName() + ((server.getName().equals(server.getDisplayName())) ? "" : " (" + server.getName() + ')')); } sender.sendMessages( "SubServers > Host List:", hosts.toString().substring(1, hosts.toString().length() - 1), "SubServers > Server List:", servers.toString().substring(1, servers.toString().length() - 1)); + } else if (args[0].equalsIgnoreCase("info") || args[0].equalsIgnoreCase("status")) { + if (args.length > 1) { + Map servers = plugin.api.getServers(); + if (!servers.keySet().contains(args[1].toLowerCase())) { + sender.sendMessage("SubServers > There is no server with that name"); + } else if (!(servers.get(args[1].toLowerCase()) instanceof SubServer)) { + sender.sendMessage("SubServers > That Server is not a SubServer"); + } else { + SubServer server = (SubServer) servers.get(args[1].toLowerCase()); + sender.sendMessage("SubServers > Info on " + server.getDisplayName() + ':'); + if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(" - Real Name: " + server.getName()); + sender.sendMessage(" - Host: " + server.getHost().getDisplayName() + ((!server.getHost().getName().equals(server.getHost().getDisplayName()))?" ("+server.getHost().getName()+')':"")); + sender.sendMessage(" - Enabled: " + ((server.isEnabled())?"yes":"no")); + if (server.isTemporary()) sender.sendMessage(" - Temporary: yes"); + sender.sendMessage(" - Running: " + ((server.isRunning())?"yes":"no")); + sender.sendMessage(" - Logging: " + ((server.isLogging())?"yes":"no")); + sender.sendMessage(" - Auto Restart: " + ((server.willAutoRestart())?"yes":"no")); + sender.sendMessage(" - Hidden: " + ((server.isHidden())?"yes":"no")); + if (server.getIncompatibilities().size() > 0) { + List current = server.getCurrentIncompatibilities(); + sender.sendMessage(" - Incompatibilities:"); + for (SubServer other : server.getIncompatibilities()) sender.sendMessage(" - " + other.getDisplayName() + ((current.contains(other))?"*":"") + ((!other.getName().equals(other.getDisplayName()))?" ("+other.getName()+')':"")); + } + + } + } else { + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + } } else if (args[0].equalsIgnoreCase("start")) { if (args.length > 1) { Map servers = plugin.api.getServers(); @@ -141,6 +169,22 @@ public final class SubCommand extends Command implements TabExecutor { } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " [Args...]"); } + } else if (args[0].equalsIgnoreCase("sudo") || args[0].equalsIgnoreCase("screen")) { + if (args[0].length() > 1) { + Map servers = plugin.api.getServers(); + if (!args[1].equals("*") && !servers.keySet().contains(args[1].toLowerCase())) { + sender.sendMessage("SubServers > There is no server with that name"); + } else if (!args[1].equals("*") && !(servers.get(args[1].toLowerCase()) instanceof SubServer)) { + sender.sendMessage("SubServers > That Server is not a SubServer"); + } else if (!args[1].equals("*") && !((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { + sender.sendMessage("SubServers > That SubServer is not running"); + } else { + plugin.sudo = (SubServer) servers.get(args[1].toLowerCase()); + System.out.println("SubServers > Now forwarding commands to " + plugin.sudo.getDisplayName() + ". Type \"exit\" to return."); + } + } else { + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + } } else if (args[0].equalsIgnoreCase("create")) { if (args.length > 5) { if (plugin.api.getSubServers().keySet().contains(args[1].toLowerCase()) || SubCreator.isReserved(args[1])) { @@ -202,7 +246,7 @@ public final class SubCommand extends Command implements TabExecutor { public Iterable onTabComplete(CommandSender sender, String[] args) { String last = (args.length > 0)?args[args.length - 1].toLowerCase():""; if (args.length <= 1) { - List cmds = Arrays.asList("help", "list", "version", "start", "stop", "kill", "terminate", "cmd", "command", "create"); + List cmds = Arrays.asList("help", "list", "info", "status", "version", "start", "stop", "kill", "terminate", "cmd", "command", "create"); if (last.length() == 0) { return cmds; } else { @@ -213,7 +257,8 @@ public final class SubCommand extends Command implements TabExecutor { return list; } } else { - if (args[0].equals("start") || + if (args[0].equals("info") || args[0].equals("status") || + args[0].equals("start") || args[0].equals("stop") || args[0].equals("kill") || args[0].equals("terminate")) { if (args.length == 2) { @@ -301,14 +346,16 @@ public final class SubCommand extends Command implements TabExecutor { " Help: /sub help", " List: /sub list", " Version: /sub version", + " Server Status: /sub info ", " Start Server: /sub start ", " Stop Server: /sub stop ", " Terminate Server: /sub kill ", " Command Server: /sub cmd [Args...]", + " Sudo Server: /sub sudo ", " Create Server: /sub create