package net.glowstone.command; import net.glowstone.util.ReflectionProcessor; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.command.defaults.BukkitCommand; import org.bukkit.entity.Entity; import org.bukkit.util.StringUtil; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.util.*; public class GlowstoneCommand extends BukkitCommand { private static final List<String> SUBCOMMANDS = Arrays.asList("about", "eval", "help", "property", "vm"); public GlowstoneCommand() { super("glowstone", "A handful of Glowstone commands for debugging purposes", "/glowstone help", Arrays.asList("gs")); setPermission("glowstone.debug"); } @Override public boolean execute(CommandSender sender, String label, String[] args) { if (!testPermission(sender)) { return true; } if (args.length == 0 || (args.length > 0 && args[0].equalsIgnoreCase("about"))) { // some info about this Glowstone server sender.sendMessage("Information about this server:"); sender.sendMessage(" - " + ChatColor.GOLD + "Server brand: " + ChatColor.AQUA + Bukkit.getName() + ChatColor.RESET + "."); sender.sendMessage(" - " + ChatColor.GOLD + "Server name: " + ChatColor.AQUA + Bukkit.getServerName() + ChatColor.RESET + "."); sender.sendMessage(" - " + ChatColor.GOLD + "Glowstone version: " + ChatColor.AQUA + Bukkit.getVersion() + ChatColor.RESET + "."); sender.sendMessage(" - " + ChatColor.GOLD + "API version: " + ChatColor.AQUA + Bukkit.getBukkitVersion() + ChatColor.RESET + "."); sender.sendMessage(" - " + ChatColor.GOLD + "Players: " + ChatColor.AQUA + Bukkit.getOnlinePlayers().size() + ChatColor.RESET + "."); sender.sendMessage(" - " + ChatColor.GOLD + "Worlds: " + ChatColor.AQUA + Bukkit.getWorlds().size() + ChatColor.RESET + "."); sender.sendMessage(" - " + ChatColor.GOLD + "Plugins: " + ChatColor.AQUA + Bukkit.getPluginManager().getPlugins().length + ChatColor.RESET + "."); // thread count int threadCount = 0; Set<Thread> threads = Thread.getAllStackTraces().keySet(); for (Thread t : threads) { if (t.getThreadGroup() == Thread.currentThread().getThreadGroup()) { threadCount++; } } sender.sendMessage(" - " + ChatColor.GOLD + "Threads: " + ChatColor.AQUA + threadCount + ChatColor.RESET + "."); return false; } if (args[0].equalsIgnoreCase("help")) { // some help return false; } if (args[0].equalsIgnoreCase("property")) { if (args.length == 1) { // list all System.getProperties().forEach((key, value) -> { sender.sendMessage("Property '" + ChatColor.AQUA + key + ChatColor.RESET + "' = \"" + ChatColor.GOLD + value + ChatColor.RESET + "\"."); }); } else { // get a property String key = args[1].toLowerCase(); String value = System.getProperty(key); if (value == null) { sender.sendMessage(ChatColor.RED + "Unknown system property '" + key + "'."); } else { sender.sendMessage("Property '" + ChatColor.AQUA + key + ChatColor.RESET + "' = \"" + ChatColor.GOLD + value + ChatColor.RESET + "\"."); } } return false; } if (args[0].equalsIgnoreCase("vm")) { RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); List<String> arguments = runtimeMxBean.getInputArguments(); if (arguments.size() == 0) { sender.sendMessage("There are no VM arguments."); } else { sender.sendMessage("Glowstone VM arguments (" + arguments.size() + "):"); for (String argument : arguments) { sender.sendMessage(" - '" + ChatColor.AQUA + argument + ChatColor.RESET + "'."); } } return false; } if (args[0].equals("eval")) { if (args.length == 1) { // no args, send usage sender.sendMessage(ChatColor.RED + "Usage: /" + label + " eval <eval>"); return false; } StringBuilder builder = new StringBuilder(); for (int i = 1; i < args.length; i++) { builder.append(args[i] + (i == args.length - 1 ? "" : " ")); } ReflectionProcessor processor = new ReflectionProcessor(builder.toString(), sender instanceof Entity ? sender : Bukkit.getServer()); Object result = processor.process(); sender.sendMessage(ChatColor.GOLD + "Eval returned: " + (result == null ? ChatColor.RED + "<no value>" : ChatColor.AQUA + result.toString())); } return false; } @Override public List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { Validate.notNull(sender, "Sender cannot be null"); Validate.notNull(args, "Arguments cannot be null"); Validate.notNull(alias, "Alias cannot be null"); if (args.length == 0) { return Collections.emptyList(); } if (args.length == 1) { return (List) StringUtil.copyPartialMatches(args[0], SUBCOMMANDS, new ArrayList(SUBCOMMANDS.size())); } if (args.length == 2 && args[0].equalsIgnoreCase("property")) { return (List) StringUtil.copyPartialMatches(args[1], System.getProperties().stringPropertyNames(), new ArrayList(System.getProperties().stringPropertyNames().size())); } return Collections.emptyList(); } }