package tv.mineinthebox.essentials.commands;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.Callable;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import tv.mineinthebox.essentials.xEssentials;
import tv.mineinthebox.essentials.enums.LogType;
import tv.mineinthebox.essentials.enums.PermissionKey;
import tv.mineinthebox.essentials.enums.ServiceType;
import tv.mineinthebox.essentials.interfaces.CommandTemplate;
import tv.mineinthebox.essentials.interfaces.XOfflinePlayer;
public class CmdLookup extends CommandTemplate {
private final xEssentials pl;
public CmdLookup(xEssentials pl, Command cmd, CommandSender sender) {
super(pl, cmd, sender);
this.pl = pl;
}
public boolean execute(CommandSender sender, Command cmd, String[] args) {
if(cmd.getName().equalsIgnoreCase("lookup")) {
if(sender.hasPermission(PermissionKey.CMD_LOOKUP.getPermission())) {
if(args.length == 0) {
showHelp();
} else if(args.length == 1) {
if(args[0].equalsIgnoreCase("help")) {
showHelp();
} else if(args[0].equalsIgnoreCase("services")) {
StringBuilder build = new StringBuilder();
for(int i = 0; i < ServiceType.values().length;i++) {
ServiceType type = ServiceType.values()[i];
if(i == (ServiceType.values().length-1)) {
build.append(type.getService());
} else {
build.append(type.getService() + ", ");
}
}
sendMessage(ChatColor.GRAY + "services: " + build.toString());
} else {
if(pl.getManagers().getPlayerManager().isEssentialsPlayer(args[0])) {
XOfflinePlayer off = pl.getManagers().getPlayerManager().getOfflinePlayer(args[0]);
try {
EnumMap<ServiceType, List<String>> messages = getLookupReasons(off.getName());
for(ServiceType type : ServiceType.values()) {
if(messages.containsKey(type)) {
sender.sendMessage(ChatColor.GOLD + ".oO___["+type.getService()+"]___Oo.");
for(String s : messages.get(type)) {
String[] argss = s.split(":");
sender.sendMessage(argss[0] + ": " + ChatColor.GRAY + argss[1]);
}
} else {
sender.sendMessage(ChatColor.GOLD + ".oO___["+type.getService()+"]___Oo.");
sender.sendMessage(ChatColor.GRAY + "no bans found for this service.");
}
}
} catch (Exception e) {
xEssentials.log("could not lookup ban status of player " + off.getName() + " on api.fishbans.com", LogType.SEVERE);
}
} else {
try {
EnumMap<ServiceType, List<String>> messages = getLookupReasons(args[0]);
for(ServiceType type : ServiceType.values()) {
if(messages.containsKey(type)) {
sender.sendMessage(ChatColor.GOLD + ".oO___["+type.getService()+"]___Oo.");
for(String s : messages.get(type)) {
String[] argss = s.split(":");
sender.sendMessage(argss[0] + ": " + ChatColor.GRAY + argss[1]);
}
} else {
sender.sendMessage(ChatColor.GOLD + ".oO___["+type.getService()+"]___Oo.");
sender.sendMessage(ChatColor.GRAY + "no bans found for this service.");
}
}
} catch (Exception e) {
xEssentials.log("could not lookup ban status of player " + args[0] + " on api.fishbans.com", LogType.SEVERE);
}
}
}
} else if(args.length == 2) {
try {
if(ServiceType.valueOf(args[0].toUpperCase()) instanceof ServiceType) {
ServiceType type = ServiceType.valueOf(args[0].toUpperCase());
try {
EnumMap<ServiceType, List<String>> map = getLookupReasons(args[1], type);
List<String> list = new ArrayList<String>(map.get(type));
if(!list.isEmpty()) {
sender.sendMessage(ChatColor.GOLD + ".oO___["+type.getService()+"]___Oo.");
for(String s : list) {
String[] argss = s.split(":");
sender.sendMessage(argss[0] + ": " + ChatColor.GRAY + argss[1]);
}
} else {
sendMessage("this player is not banned on this service!");
}
} catch (Exception e) {
e.printStackTrace();
xEssentials.log("could not lookup ban status of player " + args[1] + " on api.fishbans.com", LogType.SEVERE);
}
}
} catch(IllegalArgumentException r) {
sendMessage("invalid service name!");
}
}
} else {
getWarning(WarningType.NO_PERMISSION);
}
}
return false;
}
/**
* @author xize
* @param returns all the ban reasons of this player!
* @return EnumMap<ServiceType, List<String>()
* @throws Exception
*/
@SuppressWarnings("unchecked")
public EnumMap<ServiceType, List<String>> getLookupReasons(String name) throws Exception {
EnumMap<ServiceType, List<String>> map = new EnumMap<ServiceType, List<String>>(ServiceType.class);
Callable<JSONObject> args = new BanServices(name, pl);
JSONObject obj = args.call();
List<String> bans = new ArrayList<String>();
if(obj.containsKey("bans")) {
if(((JSONObject)obj.get("bans")).containsKey("service")) {
JSONObject service = (JSONObject) ((JSONObject) obj.get("bans")).get("service");
for(ServiceType type : ServiceType.values()) {
if(service.containsKey(type.getService())) {
JSONObject ser = (JSONObject)service.get(type.getService());
Object object = ser.get("ban_info");
if(object instanceof JSONObject) {
JSONObject ob = (JSONObject) object;
Iterator<Entry<String, String>> it = (Iterator<Entry<String, String>>) ob.entrySet().iterator();
while(it.hasNext()) {
Entry<String, String> entry = it.next();
bans.add(entry.getKey()+":"+entry.getValue());
}
}
}
map.put(type, bans);
}
}
}
return map;
}
/**
* @author xize
* @param returns all the ban reasons of this player!
* @return EnumMap<ServiceType, List<String>()
* @throws Exception
*/
@SuppressWarnings("unchecked")
public EnumMap<ServiceType, List<String>> getLookupReasons(String name, ServiceType type) throws Exception {
EnumMap<ServiceType, List<String>> map = new EnumMap<ServiceType, List<String>>(ServiceType.class);
Callable<JSONObject> args = new BanServices(name, pl);
JSONObject obj = args.call();
List<String> bans = new ArrayList<String>();
if(obj.containsKey("bans")) {
if(((JSONObject)obj.get("bans")).containsKey("service")) {
JSONObject service = (JSONObject) ((JSONObject) obj.get("bans")).get("service");
if(service.containsKey(type.getService())) {
JSONObject ser = (JSONObject)service.get(type.getService());
Object object = ser.get("ban_info");
if(object instanceof JSONObject) {
JSONObject ob = (JSONObject) object;
Iterator<Entry<String, String>> it = (Iterator<Entry<String, String>>) ob.entrySet().iterator();
while(it.hasNext()) {
Entry<String, String> entry = it.next();
bans.add(entry.getKey()+":"+entry.getValue());
}
}
}
}
}
map.put(type, bans);
return map;
}
@Override
public void showHelp() {
sender.sendMessage(ChatColor.GOLD + ".oO___[lookup]___Oo.");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/lookup help " + ChatColor.WHITE + ": shows help");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/lookup services " + ChatColor.WHITE + ": get a list of all services");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/lookup <player> " + ChatColor.WHITE + ": lookup a player on every service");
sender.sendMessage(ChatColor.RED + "Admin: " + ChatColor.GRAY + "/lookup <service> <player> " + ChatColor.WHITE + ": lookup a player on a service");
}
}
class BanServices implements Callable<JSONObject> {
private final String api = "http://api.fishbans.com/bans/";
private final String player;
private final xEssentials pl;
public BanServices(String player, xEssentials pl) {
this.player = player;
this.pl = pl;
}
@Override
public JSONObject call() throws Exception {
JSONParser parser = new JSONParser();
URL url = new URL(api + player);
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
httpcon.addRequestProperty("User-Agent", pl.getName() + " " + pl.getDescription().getVersion() + " ban checker (By xize)");
InputStreamReader rd = new InputStreamReader(httpcon.getInputStream());
BufferedReader reader = new BufferedReader(rd);
JSONObject json = (JSONObject) parser.parse(reader);
reader.close();
rd.close();
httpcon.disconnect();
return json;
}
}