package com.nyancraft.reportrts.command; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; import java.util.logging.Level; import com.nyancraft.reportrts.data.Ticket; import com.nyancraft.reportrts.data.User; import com.nyancraft.reportrts.persistence.DataProvider; 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 com.nyancraft.reportrts.RTSFunctions; import com.nyancraft.reportrts.RTSPermissions; import com.nyancraft.reportrts.ReportRTS; import com.nyancraft.reportrts.data.NotificationType; import com.nyancraft.reportrts.util.Message; import com.nyancraft.reportrts.util.BungeeCord; import org.bukkit.entity.Player; public class ReportRTSCommand implements CommandExecutor{ private ReportRTS plugin; private DataProvider data; private boolean storageHostname = false; private boolean storagePort = false; private boolean storageDatabase = false; private boolean storageUsername = false; private boolean storagePassword = false; private boolean storageRefresh = false; public ReportRTSCommand(ReportRTS plugin) { this.plugin = plugin; this.data = plugin.getDataProvider(); } public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if(args.length == 0) return false; switch(args[0].toUpperCase()) { case "RELOAD": if(!RTSPermissions.canReloadPlugin(sender)) return true; plugin.reloadPlugin(); sender.sendMessage(ChatColor.YELLOW + "[ReportRTS] Reloaded configuration and requests."); break; case "BAN": if(!RTSPermissions.canBanUser(sender)) return true; if(args.length < 2) { sender.sendMessage(Message.errorUserNotSpecified()); return true; } // Attempt to get the target that you wish to ban. Player target = plugin.getServer().getPlayer(args[1]); if(target == null) { UUID uuid = null; // Target is not online, let's attempt to find them by open tickets. for(Map.Entry<Integer, Ticket> entry : plugin.tickets.entrySet()) { if(!entry.getValue().getName().equalsIgnoreCase(args[1])) continue; uuid = entry.getValue().getUUID(); break; } // User did not have any open tickets, we have to get him/her from the data-provider. if(uuid == null) { // LAST RESORT ONLY! User user = data.getUnsafeUser(args[1]); // User doesn't actually exist. if(user == null) { sender.sendMessage(Message.errorUserNotExists(args[1])); return true; } if(data.setUserStatus(user.getUuid(), true) < 1) { sender.sendMessage(Message.errorBanUser(args[1])); return true; } } else { // We found the data using open tickets. if(data.setUserStatus(uuid, true) < 1) { sender.sendMessage(Message.errorBanUser(args[1])); return true; } } } else { // Target is online. if(data.setUserStatus(target.getUniqueId(), true) < 1) { sender.sendMessage(Message.errorBanUser(target.getName())); return true; } } RTSFunctions.messageStaff(Message.banUser(sender.getName(), args[1]), false); try { BungeeCord.globalNotify(Message.banUser(sender.getName(), args[1]), -1, NotificationType.NOTIFYONLY); } catch (IOException e) { e.printStackTrace(); } break; case "UNBAN": if(!RTSPermissions.canBanUser(sender)) return true; if(args.length < 2) { sender.sendMessage(Message.errorUserNotSpecified()); return true; } // Attempt to get the target that you wish to un-ban. Player target1 = plugin.getServer().getPlayer(args[1]); if(target1 == null) { UUID uuid = null; // Target is not online, let's attempt to find them by open tickets. for(Map.Entry<Integer, Ticket> entry : plugin.tickets.entrySet()) { if(!entry.getValue().getName().equalsIgnoreCase(args[1])) continue; uuid = entry.getValue().getUUID(); break; } // User did not have any open tickets, we have to get him/her from the data-provider. if(uuid == null) { // LAST RESORT ONLY! User user = data.getUnsafeUser(args[1]); // User doesn't actually exist. if(user == null) { sender.sendMessage(Message.errorUserNotExists(args[1])); return true; } if(data.setUserStatus(user.getUuid(), false) < 1) { sender.sendMessage(Message.errorUnbanUser(args[1])); return true; } } else { // We found the data using open tickets. if(data.setUserStatus(uuid, false) < 1) { sender.sendMessage(Message.errorUnbanUser(args[1])); return true; } } } else { // Target is online. if(data.setUserStatus(target1.getUniqueId(), false) < 1) { sender.sendMessage(Message.errorUnbanUser(target1.getName())); return true; } } RTSFunctions.messageStaff(Message.banRemove(sender.getName(), args[1]), false); try { BungeeCord.globalNotify(Message.banRemove(sender.getName(), args[1]), -1, NotificationType.NOTIFYONLY); } catch (IOException e) { e.printStackTrace(); } break; case "RESET": if(!RTSPermissions.canResetPlugin(sender)) return true; data.reset(); // Reload the plugin after resetting the data-provider. plugin.reloadPlugin(); sender.sendMessage(ChatColor.GOLD + "[ReportRTS] You deleted all users and tickets from ReportRTS."); plugin.getLogger().log(Level.INFO, sender.getName() + " deleted all users and tickets from ReportRTS!"); break; case "STATS": if(!RTSPermissions.canCheckStats(sender)) return true; // Make sure map is sorted by insert order. LinkedHashMap<String, Integer> result = data.getTop(10); if(result == null) { sender.sendMessage(Message.error("No results!")); return true; } sender.sendMessage(ChatColor.YELLOW + "---- Top 10 ----"); sender.sendMessage(ChatColor.YELLOW + "<Player> : <Resolved Tickets>"); for(Map.Entry<String, Integer> entry : result.entrySet()) { sender.sendMessage(ChatColor.YELLOW + entry.getKey() + " : " + entry.getValue().toString()); } break; case "SEARCH": case "FIND": if(!RTSPermissions.canCheckStats(sender)) return true; if(args.length < 3) return false; String action = args[2]; // Check if the provided action is valid. if(!action.equalsIgnoreCase("closed") && !action.equalsIgnoreCase("opened")) return false; int pageNumber = 1; // If a page has been specified, use that instead of the default 1. if(args.length == 4 && RTSFunctions.isNumber(args[3])) pageNumber = Integer.parseInt(args[3]); // Also ensure that pageNumber is 1 or higher. if(pageNumber < 1) pageNumber = 1; // Start position of query. int cursor = (pageNumber * plugin.ticketsPerPage) - plugin.ticketsPerPage; User user = data.getUnsafeUser(args[1]); if(user == null) { sender.sendMessage(Message.errorUserNotExists(args[1])); return true; } // Store map as null so we can check it later. LinkedHashMap<Integer, Ticket> tickets = null; if(action.equalsIgnoreCase("closed")) { tickets = data.getHandledBy(user.getUuid(), cursor, plugin.ticketsPerPage); } else if(action.equalsIgnoreCase("opened")) { tickets = data.getOpenedBy(user.getUuid(), cursor, plugin.ticketsPerPage); } // Tickets should only be null if the player does not exist. if(tickets == null) { sender.sendMessage(Message.errorUserNotExists(args[1])); return true; } SimpleDateFormat sdf = new SimpleDateFormat("MMM.dd kk:mm z"); // Send header. sender.sendMessage(ChatColor.AQUA + "------ Page " + pageNumber + " - " + ChatColor.YELLOW + " " + (action.equalsIgnoreCase("closed") ? "Handled" : "Opened") + " by " + user.getUsername() + ChatColor.AQUA + " ------"); for(Map.Entry<Integer, Ticket> entry : tickets.entrySet()) { Ticket ticket = entry.getValue(); // Is the player online? ChatColor online = RTSFunctions.isUserOnline(user.getUuid()) ? ChatColor.GREEN : ChatColor.RED; // Send body. sender.sendMessage(ChatColor.GOLD + "#" + ticket.getId() + " " + sdf.format(new Date(ticket.getTimestamp() * 1000)) + " by " + online + ticket.getName() + ChatColor.GOLD + " - " + ChatColor.GRAY + RTSFunctions.shortenMessage(ticket.getMessage())); } break; case "HELP": if(!RTSPermissions.canSeeHelpPage(sender)) return true; sender.sendMessage(ChatColor.GREEN + "====[ " + ChatColor.GOLD + "ReportRTS Help " + ChatColor.GREEN + "]===="); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("readTicket") : "/ticket " + plugin.commandMap.get("readTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [STATUS] [ID/PAGE]" + ChatColor.RESET + ChatColor.YELLOW + " - See ticket details"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("claimTicket") : "/ticket " + plugin.commandMap.get("claimTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [ID]" + ChatColor.RESET + ChatColor.YELLOW + " - Claim ticket, stops toe stepping"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("closeTicket") : "/ticket " + plugin.commandMap.get("closeTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [ID] [COMMENT]" + ChatColor.RESET + ChatColor.YELLOW + " - Close ticket"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("holdTicket") : "/ticket " + plugin.commandMap.get("holdTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [ID] [COMMENT]" + ChatColor.RESET + ChatColor.YELLOW + " - Put ticket on hold"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("openTicket") : "/ticket " + plugin.commandMap.get("openTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [MESSAGE]" + ChatColor.RESET + ChatColor.YELLOW + " - Opens a ticket"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("listStaff") : "/ticket " + plugin.commandMap.get("listStaff")) + ChatColor.YELLOW + " - See online staff"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("broadcastToStaff") : "/ticket " + plugin.commandMap.get("broadcastToStaff")) + ChatColor.GOLD + ChatColor.BOLD + " [MESSAGE]" + ChatColor.RESET + ChatColor.YELLOW + " - Send a message to all online staff"); sender.sendMessage(ChatColor.RED + "/reportrts " + ChatColor.GOLD + ChatColor.BOLD + " [ACTION]" + ChatColor.RESET + ChatColor.YELLOW + " - General command for ReportRTS"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("reopenTicket") : "/ticket " + plugin.commandMap.get("reopenTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [ID]" + ChatColor.RESET + ChatColor.YELLOW + " - Reopens a held or closed ticket"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("teleportToTicket") : "/ticket " + plugin.commandMap.get("teleportToTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [ID]" + ChatColor.RESET + ChatColor.YELLOW + " - Teleport to specified ticket"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("unclaimTicket") : "/ticket " + plugin.commandMap.get("unclaimTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [ID]" + ChatColor.RESET + ChatColor.YELLOW + " - Unclaim ticket"); sender.sendMessage(ChatColor.RED + (plugin.legacyCommands ? "/" + plugin.commandMap.get("commentTicket") : "/ticket " + plugin.commandMap.get("commentTicket")) + ChatColor.GOLD + ChatColor.BOLD + " [ID] [COMMENT]" + ChatColor.RESET + ChatColor.YELLOW + " - Comments on a ticket"); break; case "NOTIFICATIONS": if(!RTSPermissions.canManageNotifications(sender)) return true; if(args.length <= 1){ sender.sendMessage(ChatColor.YELLOW + "There are currently " + plugin.notifications.size() + " players left to notify."); sender.sendMessage("Reset them using /reportrts notifications reset"); return true; } if(!args[1].equalsIgnoreCase("reset")){ sender.sendMessage(ChatColor.RED + "Syntax is /reportrts notifications reset"); return true; } if(!data.resetNotifications()) { sender.sendMessage(ChatColor.RED + "Notifications did not reset correctly!"); return true; } plugin.notifications.clear(); sender.sendMessage(ChatColor.GREEN + "Notifications have been reset."); break; case "DUTY": if(!(sender instanceof Player)){ sender.sendMessage("[ReportRTS] You cannot change your duty status from the console."); return true; } Player player1 = (Player) sender; if(!RTSPermissions.isStaff((Player) sender)) return true; if(args.length <= 1){ if(plugin.staff.contains(player1.getUniqueId())) sender.sendMessage(ChatColor.GREEN + "You are currently on duty."); else sender.sendMessage(ChatColor.RED + "You are currently off duty."); return true; } String duty = args[1]; if(!duty.equalsIgnoreCase("on") && !duty.equalsIgnoreCase("off")){ sender.sendMessage(ChatColor.RED + "Syntax is /reportrts duty on|off"); return true; } if(duty.equalsIgnoreCase("on")){ if(!plugin.staff.contains(player1.getUniqueId())) plugin.staff.add(player1.getUniqueId()); sender.sendMessage(ChatColor.YELLOW + "You are now on duty."); }else{ if(plugin.staff.contains(player1.getUniqueId())) plugin.staff.remove(player1.getUniqueId()); sender.sendMessage(ChatColor.YELLOW + "You are now off duty."); } break; case "SETUP": if(!sender.isOp()) return false; if(args.length <= 1){ sender.sendMessage(ChatColor.RED + "Missing argument! Arguments: HOSTNAME, PORT, DATABASE, USERNAME, PASSWORD, PREFIX, REFRESH"); return true; } if(args[1].equalsIgnoreCase("HOSTNAME")){ if(args.length < 3 || args[2] == null || args[2].isEmpty()){ sender.sendMessage(ChatColor.RED + "Hostname cannot be empty or null! Default is localhost or 127.0.0.1"); return true; } plugin.getConfig().set("storage.hostname", args[2]); plugin.saveConfig(); plugin.reloadConfig(); this.storageHostname = true; sender.sendMessage(ChatColor.GREEN + "Hostname set to " + args[2] + ", you should configure PORT next."); if(storageHostname && storagePort && storageDatabase && storageUsername && storagePassword && storageRefresh){ plugin.setupDone = true; plugin.reloadSettings(); if(data.load()){ sender.sendMessage(ChatColor.GREEN + "ReportRTS should be set up now! Restart for the plugin to work correctly."); plugin.getServer().getPluginManager().disablePlugin(plugin); } } return true; } if(args[1].equalsIgnoreCase("PORT")){ if(args.length < 3 || args[2] == null || !StringUtils.isNumeric(args[2])){ sender.sendMessage(ChatColor.RED + "Port can only contain numbers and may not be left blank! Default is 3306."); return true; } plugin.getConfig().set("storage.port", args[2]); plugin.saveConfig(); plugin.reloadConfig(); this.storagePort = true; sender.sendMessage(ChatColor.GREEN + "Port set to " + args[2] + ", you should configure DATABASE next."); if(storageHostname && storagePort && storageDatabase && storageUsername && storagePassword && storageRefresh){ plugin.setupDone = true; plugin.reloadSettings(); if(data.load()){ sender.sendMessage(ChatColor.GREEN + "ReportRTS should be set up now! Restart for the plugin to work correctly."); plugin.getServer().getPluginManager().disablePlugin(plugin); } } return true; } if(args[1].equalsIgnoreCase("DATABASE")){ if(args.length < 3 || args[2] == null || args[2].isEmpty()){ sender.sendMessage(ChatColor.RED + "Database cannot be empty or null!"); return true; } plugin.getConfig().set("storage.database", args[2]); plugin.saveConfig(); plugin.reloadConfig(); this.storageDatabase = true; sender.sendMessage(ChatColor.GREEN + "Database set to " + args[2] + ", you should configure USERNAME next."); if(storageHostname && storagePort && storageDatabase && storageUsername && storagePassword && storageRefresh){ plugin.setupDone = true; plugin.reloadSettings(); if(data.load()){ sender.sendMessage(ChatColor.GREEN + "ReportRTS should be set up now! Restart for the plugin to work correctly."); plugin.getServer().getPluginManager().disablePlugin(plugin); } } return true; } if(args[1].equalsIgnoreCase("USERNAME")){ if(args.length < 3 || args[2] == null || args[2].isEmpty()){ sender.sendMessage(ChatColor.RED + "Username cannot be empty or null!"); return true; } plugin.getConfig().set("storage.username", args[2]); plugin.saveConfig(); plugin.reloadConfig(); this.storageUsername = true; sender.sendMessage(ChatColor.GREEN + "Username set to " + args[2] + ", you should configure PASSWORD next."); if(storageHostname && storagePort && storageDatabase && storageUsername && storagePassword && storageRefresh){ plugin.setupDone = true; plugin.reloadSettings(); if(data.load()){ sender.sendMessage(ChatColor.GREEN + "ReportRTS should be set up now! Restart for the plugin to work correctly."); plugin.getServer().getPluginManager().disablePlugin(plugin); } } return true; } if(args[1].equalsIgnoreCase("PASSWORD")){ if(args.length < 3 || args[2] == null || args[2].isEmpty()){ sender.sendMessage(ChatColor.RED + "Password cannot be empty or null!"); return true; } plugin.getConfig().set("storage.password", args[2]); plugin.saveConfig(); plugin.reloadConfig(); this.storagePassword = true; sender.sendMessage(ChatColor.GREEN + "Password set to " + args[2] + ", next up is PREFIX. Prefix is optional, if you want to have no prefix, do NOT configure it! You may skip PREFIX and jump straight to REFRESH."); if(storageHostname && storagePort && storageDatabase && storageUsername && storagePassword && storageRefresh){ plugin.setupDone = true; plugin.reloadSettings(); if(data.load()){ sender.sendMessage(ChatColor.GREEN + "ReportRTS should be set up now! Restart for the plugin to work correctly."); plugin.getServer().getPluginManager().disablePlugin(plugin); } } return true; } if(args[1].equalsIgnoreCase("PREFIX")){ if(args.length < 3 || args[2] == null || args[2].isEmpty()){ plugin.getConfig().set("storage.prefix", ""); }else{ plugin.getConfig().set("storage.prefix", args[2]); } plugin.saveConfig(); plugin.reloadConfig(); sender.sendMessage(ChatColor.GREEN + "Prefix set to " + args[2] + ", you should configure REFRESH next."); if(storageHostname && storagePort && storageDatabase && storageUsername && storagePassword && storageRefresh){ plugin.setupDone = true; plugin.reloadSettings(); if(data.load()){ sender.sendMessage(ChatColor.GREEN + "ReportRTS should be set up now! Restart for the plugin to work correctly."); plugin.getServer().getPluginManager().disablePlugin(plugin); } } return true; } if(args[1].equalsIgnoreCase("REFRESH")){ if(args.length < 3 || args[2] == null || !StringUtils.isNumeric(args[2])){ sender.sendMessage(ChatColor.RED + "Refresh time can only contain numbers and may not be left blank! Default is 600 seconds."); return true; } plugin.getConfig().set("storage.refreshTime", args[2]); plugin.saveConfig(); plugin.reloadConfig(); this.storageRefresh = true; sender.sendMessage(ChatColor.GREEN + "Refresh set to " + args[2] + ", if you have followed the instructions you should now be done!"); if(storageHostname && storagePort && storageDatabase && storageUsername && storagePassword && storageRefresh){ plugin.setupDone = true; plugin.reloadSettings(); if(data.load()){ sender.sendMessage(ChatColor.GREEN + "ReportRTS should be set up now! Restart for the plugin to work correctly."); plugin.getServer().getPluginManager().disablePlugin(plugin); } } return true; } sender.sendMessage(ChatColor.RED + "Wrong argument! Valid arguments: HOSTNAME, PORT, DATABASE, USERNAME, PASSWORD, PREFIX, REFRESH"); break; case "BANLIST": if(!RTSPermissions.canBanUser(sender)) return true; ArrayList<User> users = data.getUsers(true); if(users == null || users.isEmpty()) { sender.sendMessage(Message.error("There are no banned users.")); return true; } sender.sendMessage(ChatColor.YELLOW + "Listing banned users (" + users.size() + " total):"); Iterator it = users.iterator(); int i = 0; while(it.hasNext()) { User user1 = (User) it.next(); i++; sender.sendMessage(ChatColor.GREEN + "" + i + ": " + ChatColor.BOLD + ChatColor.AQUA + user1.getUsername() + ChatColor.GRAY + " - " + user1.getUuid().toString()); } break; default: return false; } return true; } }