package tc.oc.commons.core.commands; import java.util.Map; import java.util.logging.Logger; import javax.inject.Inject; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.minecraft.util.commands.CommandPermissions; import tc.oc.api.docs.virtual.DeployInfo; import tc.oc.api.minecraft.servers.StartupServerDocument; import tc.oc.api.util.Permissions; import tc.oc.commons.core.chat.Component; import tc.oc.commons.core.scheduler.Scheduler; import tc.oc.minecraft.api.command.CommandSender; import tc.oc.minecraft.api.server.LocalServer; import tc.oc.parse.primitive.DurationParser; public class DebugCommands implements Commands { private final LocalServer minecraftServer; private final StartupServerDocument startupDocument; private final Scheduler scheduler; private final DurationParser durationParser; @Inject DebugCommands(LocalServer minecraftServer, StartupServerDocument startupDocument, Scheduler scheduler, DurationParser durationParser) { this.minecraftServer = minecraftServer; this.startupDocument = startupDocument; this.scheduler = scheduler; this.durationParser = durationParser; } @Command( aliases = "sleep", desc = "Put the main server thread to sleep for the given duration", usage = "<time>", flags = "", min = 1, max = 1 ) @CommandPermissions(Permissions.DEVELOPER) public void sleep(CommandContext args, CommandSender sender) throws CommandException { try { Thread.sleep(durationParser.parse(args.getString(0)).toMillis()); } catch(InterruptedException e) { throw new CommandException("Sleep was interrupted", e); } } @Command( aliases = "throw", desc = "Throw a test RuntimeException", usage = "[message]", flags = "tr", min = 0, max = 1 ) @CommandPermissions(Permissions.DEVELOPER) public void throwError(CommandContext args, CommandSender sender) throws CommandException { if(args.hasFlag('r')) { Logger.getLogger("").severe("Test root logger error from " + sender.getName()); } else if(args.hasFlag('t')) { scheduler.createTask(() -> { throwError(args, sender, "task"); }); } else { throwError(args, sender, "command"); } } private void throwError(CommandContext args, CommandSender sender, String type) { final String message; if(args.argsLength() == 0) { message = "Test " + type + " error from " + sender.getName(); } else { message = args.getJoinedStrings(0); } throw new RuntimeException(message); } @Command( aliases = "port", desc = "Get the server listening port", min = 0, max = 0 ) @CommandPermissions(Permissions.DEVELOPER) public void port(CommandContext args, CommandSender sender) throws CommandException { sender.sendMessage(String.valueOf(minecraftServer.getAddress())); } @Command( aliases = "deployinfo", desc = "What is deployed on this server?", min = 0, max = 0 ) @CommandPermissions(Permissions.DEVELOPER) public void deployInfo(CommandContext args, CommandSender sender) throws CommandException { final DeployInfo info = startupDocument.deploy_info(); if(info == null) { throw new CommandException("No deploy info was loaded"); } else { sender.sendMessage(new Component("Nextgen")); sender.sendMessage(new Component(" path: " + info.nextgen().path())); sender.sendMessage(new Component(" version: " + format(info.nextgen().version()))); for(Map.Entry<String, DeployInfo.Version> entry : info.packages().entrySet()) { sender.sendMessage(new Component(entry.getKey() + ": " + format(entry.getValue()))); } } } private static String format(DeployInfo.Version version) { return version.branch() + "/" + version.commit(); } }