package xyz.etztech.minecraftmanager.command; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; import org.apache.commons.lang.StringUtils; 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.ModelResponse; import java.util.Map; public class CommandApplication implements CommandExecutor { MinecraftManager plugin; public CommandApplication(MinecraftManager plugin) { this.plugin = plugin; plugin.getCommand("application").setExecutor(this); } @Override public boolean onCommand(CommandSender sender, Command command, String base, String[] args) { if (args.length != 2) { sender.sendMessage(ChatColor.RED + "This command takes two arguments."); return true; } String subcommand = args[0].toLowerCase(); switch (subcommand) { case "search": search(sender, args[1]); break; case "info": info(sender, args[1]); break; case "accept": action(sender, args[1], true); break; case "deny": action(sender, args[1], false); break; case "clear": clear(sender, args[1]); break; default: sender.sendMessage(ChatColor.RED + "Unknown sub-command. You can search, accept, or deny applications."); break; } return true; } private class SearchCallback implements ICallback { private CommandSender commandSender; SearchCallback(CommandSender commandSender) { this.commandSender = commandSender; } @Override public void invoke(String s) { ModelResponse modelResponse = new ModelResponse(s); JsonArray results = modelResponse.getResults(); StringBuffer response = new StringBuffer(); if (results.size() > 0) { response.append(ChatColor.GOLD).append("===== Results ====="); int max = results.size() >= 10 ? 10 : results.size(); for (int i = 0; i < max; i++) { JsonObject result = results.get(i).getAsJsonObject(); response.append("\n").append(ChatColor.YELLOW).append("#") .append(result.get("id")).append(" - ").append(result.get("username").getAsString()); } if (results.size() > 10) { response.append("\n").append(ChatColor.YELLOW).append("This search returned more than ten results. " + "Try to refine your search if you didn't find what you needed."); } } else { response.append(ChatColor.YELLOW).append("No results found..."); } commandSender.sendMessage(response.toString()); } } private void search(CommandSender sender, String name) { if (sender.hasPermission("minecraftmanager.application.search")) { Map filter = MCMAPI.setup(); filter.put("username__icontains", name); Http.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filter, new SearchCallback(sender)); } else { sender.sendMessage(ChatColor.RED + "You do not have permission to search applications."); } } private String getAsStringOrNull(JsonElement json) { if (json.isJsonNull()) { return "None"; } else { return json.getAsString(); } } private class InfoCallback implements ICallback { private CommandSender commandSender; InfoCallback(CommandSender commandSender) { this.commandSender = commandSender; } @Override public void invoke(String s) { ModelResponse modelResponse = new ModelResponse(s); JsonArray results = modelResponse.getResults(); StringBuilder response = new StringBuilder(); TextComponent text = new TextComponent(); if (results.size() == 1) { JsonObject result = results.get(0).getAsJsonObject(); response.append(ChatColor.GOLD).append("===== " + result.get("username").getAsString() + " ====="); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Application ID: "); response.append(ChatColor.RESET); response.append(getAsStringOrNull(result.get("id"))); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Age: "); response.append(ChatColor.RESET); response.append(getAsStringOrNull(result.get("age"))); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Player Type: "); response.append(ChatColor.RESET); response.append(getAsStringOrNull(result.get("player_type"))); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Ever Banned: "); response.append(ChatColor.RESET); response.append(getAsStringOrNull(result.get("ever_banned"))); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Explanation: "); response.append(ChatColor.RESET); response.append(getAsStringOrNull(result.get("ever_banned_explanation"))); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Reference: "); response.append(ChatColor.RESET); response.append(getAsStringOrNull(result.get("reference"))); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Read Rules: "); response.append(ChatColor.RESET); response.append(getAsStringOrNull(result.get("read_rules"))); response.append("\n").append(ChatColor.RESET).append(ChatColor.YELLOW).append(ChatColor.BOLD); response.append("Accepted: "); response.append(ChatColor.RESET); response.append(result.get("accepted").isJsonNull() ? "Unanswered" : result.get("accepted").getAsString()); response.append("\n").append(ChatColor.RESET).append(ChatColor.GOLD).append(ChatColor.ITALIC); response.append("More info can be found on the MCM web app."); text.setText(response.toString()); text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Click for more info").create())); text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, result.get("link").getAsString())); } else { response.append(ChatColor.RED).append("Could not identify an application."); text.setText(response.toString()); } commandSender.spigot().sendMessage(text); } } private void info(CommandSender sender, String key) { if (sender.hasPermission("minecraftmanager.application.search")) { Map filter = MCMAPI.setup(); if (StringUtils.isNumeric(key)) { filter.put("id__exact", key); } else { filter.put("username__iexact", key); } Http.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filter, new InfoCallback(sender)); } else { sender.sendMessage(ChatColor.RED + "You do not have permission to search applications."); } } private class ActionCallback implements ICallback { private CommandSender commandSender; ActionCallback(CommandSender commandSender) { this.commandSender = commandSender; } @Override public void invoke(String s) { MCMResponse response = new MCMResponse(s); commandSender.spigot().sendMessage(response.getMCJSON()); } } private void action(CommandSender sender, String id, boolean accepted) { if (sender.hasPermission("minecraftmanager.application.action")) { String username; if (sender instanceof Player) { username = sender.getName(); } else { username = "Console"; } if (StringUtils.isNumeric(id)) { String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/application_action/"; Map data = MCMAPI.setup(); data.put("application_id", id); data.put("action", accepted ? "True" : "False"); data.put("username", username); Http.asyncPostCallback(plugin, djangoUrl, data, new ActionCallback(sender)); } else { sender.sendMessage(ChatColor.RED + "You must use an application ID to ensure accuracy."); } } else { sender.sendMessage(ChatColor.RED + "You do not have permission to take action on an application."); } } private class ClearCallback implements ICallback { private CommandSender commandSender; ClearCallback(CommandSender commandSender) { this.commandSender = commandSender; } @Override public void invoke(String s) { MCMResponse response = new MCMResponse(s); commandSender.spigot().sendMessage(response.getMCJSON()); } } private void clear(CommandSender sender, String id) { if (sender.hasPermission("minecraftmanager.application.action")) { if (StringUtils.isNumeric(id)) { String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/application_clear/"; Map data = MCMAPI.setup(); data.put("application_id", id); Http.asyncPostCallback(plugin, djangoUrl, data, new ClearCallback(sender)); } else { sender.sendMessage(ChatColor.RED + "You must use an application ID to ensure accuracy."); } } else { sender.sendMessage(ChatColor.RED + "You do not have permission to take action on an application."); } } }