MinecraftManagerPlugin/src/main/java/xyz/etztech/minecraftmanager/command/CommandApplication.java

263 lines
11 KiB
Java

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<String, String> 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<String, String> 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<String, String> 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<String, String> 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.");
}
}
}