package xyz.etztech.minecraftmanager.command; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import xyz.etztech.core.web.Http; import xyz.etztech.core.web.ICallback; import xyz.etztech.minecraftmanager.MCMAPI; import xyz.etztech.minecraftmanager.MinecraftManager; import xyz.etztech.minecraftmanager.objects.MCMResponse; import xyz.etztech.minecraftmanager.objects.MinecraftManagerThread; import xyz.etztech.minecraftmanager.tasks.ReportRunnable; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.Map; public class CommandMain implements CommandExecutor { MinecraftManager plugin; private MinecraftManagerThread cmdThread; public CommandMain(MinecraftManager plugin) { this.plugin = plugin; this.cmdThread = new MinecraftManagerThread(plugin); plugin.getCommand("minecraftmanager").setExecutor(this); } @Override public boolean onCommand(CommandSender sender, Command command, String base, String[] args) { if (args.length == 0) { other(sender); } else if (args.length == 1) { switch (args[0].toLowerCase()) { case "help": sender.sendMessage(ChatColor.GOLD + "----- MinecraftManager Commands -----"); sender.sendMessage(ChatColor.YELLOW + "/mcm reload - Reload the config"); sender.sendMessage(ChatColor.YELLOW + "/mcm port - Display the port MinecraftManager is on"); sender.sendMessage(ChatColor.YELLOW + "/mcm register - Register for the web application"); sender.sendMessage(ChatColor.GOLD + "----- Application Command -----"); sender.sendMessage(ChatColor.YELLOW + "/application [accept|deny] "); sender.sendMessage(ChatColor.YELLOW + "/application [search|info] "); break; case "port": port(sender); break; case "reload": reload(sender); break; case "register": register(sender); break; case "report": report(sender); break; default: other(sender); } } return true; } private void other(CommandSender sender) { String version = Bukkit.getPluginManager().getPlugin("MinecraftManager").getDescription().getVersion(); sender.sendMessage(ChatColor.GOLD + "----- MinecraftManager v" + version + " -----"); sender.sendMessage(ChatColor.YELLOW + "Developed by EtzTech"); sender.sendMessage(ChatColor.YELLOW + "Use \"/mcm help\" for help."); } private void port(CommandSender sender) { if (!sender.hasPermission("minecraftmanager.use")) { sender.sendMessage(ChatColor.RED + "You do not have permission to use this command."); return; } sender.sendMessage("MinecraftManager is listening on port " + plugin.getConfig().getInt("port")); } private void reload(CommandSender sender) { if (!sender.hasPermission("minecraftmanager.use")) { sender.sendMessage(ChatColor.RED + "You do not have permission to use this command."); return; } try { sender.sendMessage("Reloading MinecraftManager..."); stopThread(); Thread.sleep(1000); this.plugin.reloadConfig(); Thread.sleep(1000); startThread(); sender.sendMessage("MinecraftManager reloaded."); } catch (Exception ex) { sender.sendMessage("MinecraftManager reload was interrupted."); } } private class RegisterCallback implements ICallback { private Player player; RegisterCallback(Player player) { this.player = player; } @Override public void invoke(String s) { MCMResponse response = new MCMResponse(s); if (response.getStatus()) { TextComponent password = new TextComponent(ChatColor.YELLOW + response.getMessage()); password.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, response.getMessage())); TextComponent message = new TextComponent(ChatColor.GREEN + "Your password is "); message.addExtra(password); message.addExtra(new TextComponent(ChatColor.GREEN + ".")); player.spigot().sendMessage(message); player.sendMessage(ChatColor.GREEN + "This password is not shown in Console, however you should consider changing it immediately from the web application."); player.sendMessage(ChatColor.GREEN + "You can click the password to bring it into your chat for easy copying."); } else { player.sendMessage(ChatColor.RED + response.getMessage()); } } } private void register(CommandSender sender) { if (!(sender instanceof Player)) { sender.sendMessage(ChatColor.RED + "Console cannot register for the web application."); return; } if (!sender.hasPermission("minecraftmanager.register")) { sender.sendMessage(ChatColor.RED + "You do not have permission to register for the web application."); return; } Player player = (Player) sender; String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/register/"; Map data = MCMAPI.setup(); data.put("uuid", player.getUniqueId().toString()); Http.asyncPostCallback(plugin, djangoUrl, data, new RegisterCallback(player)); } private void report(CommandSender sender) { String name = sender instanceof Player ? sender.getName() : "Console"; if (sender.hasPermission("minecraftmanager.report")) { if (MinecraftManager.getReportRunning()) { MinecraftManager.setReportStop(true); sender.sendMessage(ChatColor.GREEN + "Stopping report generation."); } Bukkit.getScheduler().runTaskAsynchronously(plugin, new ReportRunnable(name)); } else { sender.sendMessage(ChatColor.RED + "You do not have permission to generate a report."); } } public void startThread() { Bukkit.getConsoleSender().sendMessage("Starting MinecraftManager on Port " + plugin.getConfig().get("port")); cmdThread.setRunning(true); Thread th = new Thread(cmdThread); th.start(); } public void stopThread() { cmdThread.setRunning(false); try { Socket trashSock = new Socket("127.0.0.1", plugin.getConfig().getInt("port")); DataOutputStream trashStream = new DataOutputStream(trashSock.getOutputStream()); trashStream.writeUTF("trash"); trashStream.flush(); trashStream.close(); } catch (IOException ex) { Bukkit.getConsoleSender().sendMessage("Error: " + ex.getMessage()); } } }