package com.redstoner.modules.abot; import java.io.File; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Commands; import com.redstoner.annotations.Version; import com.redstoner.misc.CommandHolderType; import com.redstoner.misc.JsonManager; import com.redstoner.misc.Main; import com.redstoner.modules.Module; import net.nemez.chatapi.ChatAPI; import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) @AutoRegisterListener @Version(major = 5, minor = 1, revision = 0, compatible = 4) @SuppressWarnings("unchecked") public class Abot implements Module, Listener { private File answerFile = new File(Main.plugin.getDataFolder(), "abot.json"); JSONArray answers; @Override public boolean onEnable() { return loadAnswers(Bukkit.getConsoleSender()); } @EventHandler public void onPlayerChat(AsyncPlayerChatEvent event) { for (Object rawObject : answers) { JSONObject entry = (JSONObject) rawObject; JSONArray regexes = (JSONArray) entry.get("regex"); for (Object regex : regexes) { if (event.getMessage().toLowerCase().matches((String) regex)) { Object hideperm = entry.get("hide-perm"); if (hideperm == null || !event.getPlayer().hasPermission((String) hideperm)) { event.setCancelled(true); getLogger().message(event.getPlayer(), (String) entry.get("message")); return; } } } } } @Command(hook = "abot_reload") public void loadAnswersCommand(CommandSender sender) { loadAnswers(sender); } @Command(hook = "abot_list") public void listAnswers(CommandSender sender) { listAnswers(sender, false); } @Command(hook = "abot_list_nh") public void listAnswers(CommandSender sender, boolean nohover) { if (answers.isEmpty()) getLogger().message(sender, "There are no Abot answers to list."); if (nohover) { listAnswersNoHover(sender); return; } Message msg = ChatAPI.createMessage(sender).appendText(getLogger().getHeader()); msg.appendText("&6Abot Answers:\n"); for (int i = 0; i < answers.size(); i++) { JSONObject entry = (JSONObject) answers.get(i); JSONArray regexes = (JSONArray) entry.get("regex"); String name = (String) entry.get("name"); String message = (String) entry.get("message"); String permission = (String) entry.get("hide-perm"); String hover = "&6Name: &e" + name + "\n&6Message:&f " + (message.isEmpty()? "&cNone" : message) + "\n&6Permission: &b" + (permission == null || permission.isEmpty()? "&cNone" : permission) + "\n&6Regexes: " + (regexes.isEmpty()? "&cNone" : ""); if (!regexes.isEmpty()) for (Object regex : regexes) hover += "\n&f - &e" + (String) regex; if (i > 0) msg.appendText("&7, "); msg.appendTextHover("&e" + name, hover); } msg.send(); } public void listAnswersNoHover(CommandSender sender) { Message msg = ChatAPI.createMessage(sender).appendText(getLogger().getHeader()); for (int i = 0; i < answers.size(); i++) { JSONObject entry = (JSONObject) answers.get(i); JSONArray regexes = (JSONArray) entry.get("regex"); msg.appendText("\n&6Name: &e" + (String) entry.get("name")); String message = (String) entry.get("message"); String permission = (String) entry.get("hide-perm"); msg.appendText("\n&f - &6Message:&f " + (message.isEmpty()? "&cNone" : message) + "\n&f - &6Permission: &b" + (permission == null || permission.isEmpty()? "&cNone" : permission) + "\n&f - &6Regexes: " + (regexes.isEmpty()? "&cNone" : "\n")); if (!regexes.isEmpty()) for (Object regex : regexes) msg.appendText("&f - &e" + (String) regex); } msg.send(); } @Command(hook = "abot_get") public void getAnswer(CommandSender sender, String name) { JSONObject entry = getAnswer(name); if (entry == null) { getLogger().message(sender, "There are no answer with that name."); return; } Message msg = ChatAPI.createMessage(sender).appendText(getLogger().getHeader()); JSONArray regexes = (JSONArray) entry.get("regex"); msg.appendText("&6Name: &e" + (String) entry.get("name")); String message = (String) entry.get("message"); String permission = (String) entry.get("hide-perm"); msg.appendText("\n&f - &6Message:&f " + (message.isEmpty()? "&cNone" : message) + "\n&f - &6Permission: &b" + (permission == null || permission.isEmpty()? "&cNone" : permission) + "\n&f - &6Regexes: " + (regexes.isEmpty()? "&cNone" : "\n")); if (!regexes.isEmpty()) for (Object regex : regexes) msg.appendText("&f - &e" + (String) regex); msg.send(); } @Command(hook = "abot_add") public void addAnswer(CommandSender sender, String name) { if (exists(name)) { getLogger().message(sender, "That name is already in use."); return; } JSONObject newEntry = new JSONObject(); newEntry.put("name", name); newEntry.put("message", ""); newEntry.put("hide-perm", null); newEntry.put("regex", new JSONArray()); answers.add(newEntry); saveAnswers(); getLogger().message(sender, "&e" + name + "&7 has been created. Use &e/abot edit &a" + name + "&e &7to finish setting it up"); } @Command(hook = "abot_remove") public void removeAnswer(CommandSender sender, String name) { JSONObject entry = getAnswer(name); if (entry == null) { getLogger().message(sender, "There are no answer with the name &e" + name + "&7."); return; } answers.remove(entry); saveAnswers(); getLogger().message(sender, "&e"+name+" &7has been removed."); } @Command(hook = "abot_edit_name") public void editName(CommandSender sender, String name, String newName) { JSONObject entry = getAnswer(name); if (entry == null) { getLogger().message(sender, "There are no answer with the name &e" + newName + "&7."); return; } if (exists(newName)) { getLogger().message(sender, "&e" + newName + " &7is already in use."); return; } String oldName = (String) entry.get("name"); answers.remove(entry); entry.put("name", newName); answers.add(entry); saveAnswers(); getLogger().message(sender, "Name changed from &e" + oldName + "&7 to &e" + newName + "&7."); } @Command(hook = "abot_edit_permission") public void editPermission(CommandSender sender, String name, String permission) { JSONObject entry = getAnswer(name); if (entry == null) { getLogger().message(sender, "There are no answer with the name &e" + name + "&7."); return; } String oldPerm = entry.get("hide-perm") == null? "&cNone" : (String) entry.get("hide-perm"); answers.remove(entry); entry.put("hide-perm", permission.equals("null")? null : permission); answers.add(entry); saveAnswers(); getLogger().message(sender, "Hide Permission changed from &e" + oldPerm + "&7 to &e" + (permission.equals("null")? "&cNone" : permission) + "&7."); } @Command(hook = "abot_edit_message") public void editMessage(CommandSender sender, String name, String message) { JSONObject entry = getAnswer(name); if (entry == null) { getLogger().message(sender, "There are no answer with the name &e" + name + "&7."); return; } String oldMessage = entry.get("message").equals("")? "&cEmpty String" : (String) entry.get("message"); answers.remove(entry); entry.put("message", message); answers.add(entry); saveAnswers(); getLogger().message(sender, "Message changed from " + oldMessage + "&7 to &e" + (message.isEmpty()? "&cEmpty String" : message) + "&7."); } @Command(hook = "abot_edit_regex_add") public void editRegexAdd(CommandSender sender, String name, String regex) { JSONObject entry = getAnswer(name); if (entry == null) { getLogger().message(sender, "There are no answer with the name &e" + name + "&7."); return; } answers.remove(entry); JSONArray regexes = (JSONArray) entry.get("regex"); regexes.add(regex); entry.put("regex", regexes); answers.add(entry); saveAnswers(); getLogger().message(sender, "Added the Regex &e" + regex + "&7."); } @Command(hook = "abot_edit_regex_remove") public void editRegexRemove(CommandSender sender, String name, String regex) { JSONObject entry = getAnswer(name); if (entry == null) { getLogger().message(sender, "There are no answer with the name &e" + name + "&7."); return; } answers.remove(entry); JSONArray regexes = (JSONArray) entry.get(regex); if (!regexes.remove(regex)) getLogger().message(sender, "The regex,&e" + regex + "&7, is not associated with that answer."); else { entry.put("regex", regexes); answers.add(entry); saveAnswers(); getLogger().message(sender, "Removed the Regex &e" + regex + "&7."); } } public JSONObject getAnswer(String name) { for (Object rawEntry : answers) { JSONObject entry = (JSONObject) rawEntry; if (((String)entry.get("name")).equalsIgnoreCase(name)) return entry; } return null; } public boolean exists(String name) { for (Object rawEntry : answers) { JSONObject entry = (JSONObject) rawEntry; Object ename = entry.get("name"); if (ename != null && ((String) ename).equalsIgnoreCase(name)) return true; } return false; } public boolean loadAnswers(CommandSender sender) { try { JSONObject json = JsonManager.getObject(answerFile); if (json == null) { answers = new JSONArray(); getLogger().message(sender, "Couldn't find Abot's Answers File, creating one."); saveAnswers(); } else if (!json.get("version").toString().equals("2")) { getLogger().message(sender, true, "abot.json is not the correct version. Aborting!"); return false; } answers = (JSONArray) json.get("data"); } catch (ClassCastException e) { //catches if abot.json is using the old format. answers = JsonManager.getArray(answerFile); // Names unnamed answers for (Object rawEntry : answers) { JSONObject entry = (JSONObject) rawEntry; if (entry.get("name") == null) { String name = "Unknown"; for (int i = 0; exists(name) ; i++) name = "Unknown" + i; entry.put("name", name); } } getLogger().message(sender, "Converting abot.json from version 1 to 2."); saveAnswers(); } getLogger().message(sender, "Loaded the abot.json file!"); return true; } public void saveAnswers() { JSONObject json = new JSONObject(); json.put("version", 2); json.put("data", answers); JsonManager.save(json, answerFile); } }