From ab137092ca21ddf9ef1f5ee07237b3bccefdd374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Pani=C4=87?= Date: Wed, 17 Apr 2019 23:39:05 +0200 Subject: Fixed saylol bugs + cleaned up code & messages --- .../java/com/redstoner/modules/saylol/Saylol.java | 489 ++++++++++----------- 1 file changed, 240 insertions(+), 249 deletions(-) diff --git a/src/main/java/com/redstoner/modules/saylol/Saylol.java b/src/main/java/com/redstoner/modules/saylol/Saylol.java index 4f30342..2a863ed 100644 --- a/src/main/java/com/redstoner/modules/saylol/Saylol.java +++ b/src/main/java/com/redstoner/modules/saylol/Saylol.java @@ -1,381 +1,372 @@ package com.redstoner.modules.saylol; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerQuitEvent; -import org.json.simple.JSONArray; - import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Commands; import com.redstoner.annotations.Version; import com.redstoner.coremods.moduleLoader.ModuleLoader; -import com.redstoner.misc.BroadcastFilter; import com.redstoner.misc.CommandHolderType; import com.redstoner.misc.JsonManager; import com.redstoner.misc.Main; import com.redstoner.misc.Utils; import com.redstoner.modules.Module; import com.redstoner.modules.ignore.Ignore; - import net.nemez.chatapi.ChatAPI; import net.nemez.chatapi.click.ClickCallback; import net.nemez.chatapi.click.Message; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerQuitEvent; +import org.json.simple.JSONArray; + +import java.io.File; +import java.util.*; @AutoRegisterListener -@Commands(CommandHolderType.File) -@Version(major = 5, minor = 1, revision = 0, compatible = 4) -public class Saylol implements Module -{ - private long lastLol = 0; +@Commands (CommandHolderType.File) +@Version (major = 5, minor = 2, revision = 0, compatible = 4) +public class Saylol implements Module { private File lolLocation = new File(Main.plugin.getDataFolder(), "lol.json"); + private JSONArray lols, handlers; - private final String LOL_PREFIX = "§8[§blol§8] "; + private Map> searchCache = new HashMap<>(); - private final int PAGE_SIZE = 10; - - @SuppressWarnings("unchecked") + + private final String LOL_PREFIX = "§8[§blol§8] "; + private final int PAGE_SIZE = 10; + + private long lastLol = 0; + + @SuppressWarnings ("unchecked") @Override - public boolean onEnable() - { + public boolean onEnable() { lols = JsonManager.getArray(lolLocation); - if (lols == null) - lols = new JSONArray(); + if (lols == null) lols = new JSONArray(); + handlers = new JSONArray(); - for (int i = 0; i < lols.size(); i++) - handlers.add(new ClickCallback(true, true, "") - { + for (int i = 0; i < lols.size(); i++) { + handlers.add(new ClickCallback(true, true, "") { @Override - public void run(CommandSender sender) - { + public void run(CommandSender sender) { if (handlers.contains(this)) clickAction((Player) sender, handlers.indexOf(this)); else getLogger().message(sender, true, "That lol no longer exists!"); } }); + } + return true; } - + @Override - public void onDisable() - { + public void onDisable() { saveLolsSync(); } - - @SuppressWarnings("unchecked") - @Command(hook = "addlol") - public boolean addLol(CommandSender sender, String text) - { - if (lols.contains(text)) + + @SuppressWarnings ("unchecked") + @Command (hook = "addlol") + public boolean addLol(CommandSender sender, String text) { + if (lols.contains(text)) { getLogger().message(sender, true, "This lol already exists!"); - else - { - getLogger().message(sender, "Successfully added a new lol!"); + } else { lols.add("&e" + text); - handlers.add(new ClickCallback(true, true, "") - { + + handlers.add(new ClickCallback(true, true, "") { @Override - public void run(CommandSender sender) - { + public void run(CommandSender sender) { if (handlers.contains(this)) clickAction((Player) sender, handlers.indexOf(this)); else getLogger().message(sender, true, "That lol no longer exists!"); } }); + saveLols(); searchCache.clear(); + + getLogger().message(sender, "Successfully added a new lol!"); } + return true; } - - @Command(hook = "dellol") - public boolean delLol(CommandSender sender, int id) - { - if (lols.size() == 0) - { - getLogger().message(sender, true, "There are no lols yet!"); - return true; - } - if (id < 0 || id >= lols.size()) - { - getLogger().message(sender, true, "The ID must be at least 0 and at most " + (lols.size() - 1)); - return true; - } - getLogger().message(sender, "Successfully deleted the lol: " + lols.remove(id)); + + @Command (hook = "dellol") + public boolean delLol(CommandSender sender, int id) { + if (warnNoLols(sender)) return true; + if (warnLolOutOfBounds(sender, id)) return true; + handlers.remove(id); saveLols(); searchCache.clear(); + + getLogger().message(sender, "Successfully deleted the lol: " + lols.remove(id)); return true; } - - @SuppressWarnings("unchecked") - @Command(hook = "setlol") - public boolean setLol(CommandSender sender, int id, String text) - { - if (lols.size() == 0) - { - getLogger().message(sender, true, "There are no lols yet!"); - return true; - } - if (id < 0 || id >= lols.size()) - { - getLogger().message(sender, true, "The ID must be at least 0 and at most " + (lols.size() - 1)); - return true; - } - getLogger().message(sender, "Successfully changed the lol: &e" + lols.get(id) + " &7to: &e" + text); + + @SuppressWarnings ("unchecked") + @Command (hook = "setlol") + public boolean setLol(CommandSender sender, int id, String text) { + if (warnNoLols(sender)) return true; + if (warnLolOutOfBounds(sender, id)) return true; + lols.set(id, text); saveLols(); searchCache.clear(); + + getLogger().message(sender, "Successfully changed the lol: &e" + lols.get(id) + " &7to: &e" + text); return true; } - - @Command(hook = "lolid") - public boolean lolId(CommandSender sender, int id) - { - if (lols.size() == 0) - { - getLogger().message(sender, true, "There are no lols yet!"); - return true; - } + + @Command (hook = "lolid") + public boolean lolId(CommandSender sender, int id) { + if (warnNoLols(sender)) return true; + if (warnLolOutOfBounds(sender, id)) return true; + long time = System.currentTimeMillis(); - if (time - lastLol < 15000) - { - getLogger().message(sender, true, - "You can't use saylol for another " + (14 - (int) Math.ceil((time - lastLol) / 1000)) + "s."); - return true; - } - if (id < 0 || id >= lols.size()) - { - getLogger().message(sender, true, "The ID must be at least 0 and at most " + (lols.size() - 1)); - return true; - } - String name; - if (sender instanceof Player) - name = ((Player) sender).getDisplayName(); - else - name = "&9" + sender.getName(); - Utils.broadcast(LOL_PREFIX, ChatAPI.colorify(null, name + "&8: &e" + lols.get(id)), new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return recipient.hasPermission("utils.lol.see"); - } - }); + if (warnTime(sender, time)) return true; + + String name = getSenderName(sender); + + Utils.broadcast( + LOL_PREFIX, + ChatAPI.colorify( + null, + name + "&8: &e" + lols.get(id) + ), + recipient -> recipient.hasPermission("utils.lol.see") + ); + lastLol = time; return true; } - - @Command(hook = "saylol") - public boolean saylol(CommandSender sender) - { - if (lols.size() == 0) - { - getLogger().message(sender, true, "There are no lols yet!"); - return true; - } + + @Command (hook = "saylol") + public boolean saylol(CommandSender sender) { + if (warnNoLols(sender)) return true; + long time = System.currentTimeMillis(); - if (time - lastLol < 15000) - { - getLogger().message(sender, true, - "You can't use saylol for another " + (14 - (int) Math.ceil((time - lastLol) / 1000)) + "s."); - return true; - } - String name; - if (sender instanceof Player) - name = ((Player) sender).getDisplayName(); - else - name = "&9" + sender.getName(); + if (warnTime(sender, time)) return true; + + String name = getSenderName(sender); Random random = new Random(); + int id = random.nextInt(lols.size()); - Utils.broadcast(LOL_PREFIX, ChatAPI.colorify(null, name + "&8: &e" + lols.get(id)), - ModuleLoader.exists("Ignore")? Ignore.getIgnoredBy(sender) : null); + + Utils.broadcast( + LOL_PREFIX, + ChatAPI.colorify( + null, + name + "&8: &e" + lols.get(id) + ), + ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null + ); + lastLol = time; return true; } - - @Command(hook = "listlols") - public boolean listLols(CommandSender sender, int page) - { + + @Command (hook = "listlols") + public boolean listLols(CommandSender sender, int page) { searchCache.put(sender, Arrays.asList(-1)); - - if (lols.size() == 0) - { - getLogger().message(sender, true, "There are no lols yet!"); - return true; - } - page = page - 1; - int start = page * PAGE_SIZE; - int end = start + PAGE_SIZE; - int pages = getMaxPage(lols.size()); - if (start < 0) - { - getLogger().message(sender, true, "Page number too small, must be at least 1!"); - return true; - } - if (start > lols.size()) - { - getLogger().message(sender, true, "Page number too big, must be at most " + pages + "!"); - return true; + + if (warnNoLols(sender)) return true; + + List ids = new ArrayList<>(); + + for (int i = 0; i < lols.size(); i++) { + ids.add(i); } - Message m = new Message(sender, null); - m.appendText(getLogger().getHeader().replace("\n", "")); - m.appendText(" &ePage " + (page + 1) + "/" + pages + ":"); - for (int i = start; i < end && i < lols.size(); i++) - m.appendCallback("\n&a" + i + "&8: &e" + lols.get(i), getCallback(i)); - m.send(); + + printPaged(sender, ids, page); return true; } - - @Command(hook = "listlolsdef") - public boolean listLolsDefault(CommandSender sender) - { + + @Command (hook = "listlolsdef") + public boolean listLolsDefault(CommandSender sender) { return listLols(sender, 1); } - - @Command(hook = "searchlol") - public boolean search(CommandSender sender, boolean sensitive, String text) - { + + @Command (hook = "searchlol") + public boolean search(CommandSender sender, boolean sensitive, String text) { searchCache.remove(sender); - + List results = new ArrayList<>(); - + if (!sensitive) text = text.toLowerCase(); - for (int i = 0; i < lols.size(); i++) - { + for (int i = 0; i < lols.size(); i++) { String lol = (String) lols.get(i); - if ((sensitive ? lol : lol.toLowerCase()).contains(text)) - results.add(i); + + if ((sensitive ? lol : lol.toLowerCase()).contains(text)) results.add(i); } + if (results.isEmpty()) { getLogger().message(sender, "&cCouldn't find any matching lols."); return true; } - + searchCache.put(sender, results); - + Message m = new Message(sender, null); m.appendText(getLogger().getHeader().replace("\n", "")); - - int size = results.size(); - if (size > PAGE_SIZE) - m.appendText(" &ePage 1/" + getMaxPage(size) + ":"); - - for (int i = 0; i < size && i < PAGE_SIZE; i++) - m.appendCallback("\n&a" + i + "&8: &e" + lols.get(results.get(i)), getCallback(i)); - - m.appendText("\n&7Use /lol page to look at other pages."); + + appendResults(m, results); m.send(); return true; } - - @Command(hook = "matchlol") - public boolean match(CommandSender sender, boolean sensitive, String regex) - { - + + @Command (hook = "matchlol") + public boolean match(CommandSender sender, boolean sensitive, String regex) { searchCache.remove(sender); - + List results = new ArrayList<>(); - - if (!sensitive) - regex = regex.toLowerCase(); - for (int i = 0; i < lols.size(); i++) - { + + if (!sensitive) regex = regex.toLowerCase(); + + for (int i = 0; i < lols.size(); i++) { String lol = (String) lols.get(i); - if ((sensitive ? lol : lol.toLowerCase()).matches(regex)) - results.add(i); + if ((sensitive ? lol : lol.toLowerCase()).matches(regex)) results.add(i); } + if (results.isEmpty()) { getLogger().message(sender, "&cCouldn't find any matching lols."); return true; } - + searchCache.put(sender, results); - + Message m = new Message(sender, null); m.appendText(getLogger().getHeader().replace("\n", "")); - - int size = results.size(); - if (size > PAGE_SIZE) - m.appendText(" &ePage 1/" + getMaxPage(size) + ":"); - - for (int i = 0; i < size && i < PAGE_SIZE; i++) - m.appendCallback("\n&a" + i + "&8: &e" + lols.get(i), getCallback(i)); - - m.appendText("\n&7Use /lol page to look at other pages."); + + appendResults(m, results); m.send(); - return true; } - - @Command(hook = "page") + + @Command (hook = "page") public boolean page(CommandSender sender, int page) { List results = searchCache.get(sender); - + if (results == null || results.size() == 0) { - getLogger().message(sender, true, "There's nothing to page through. Either you haven't" - + " done a relivent command, or the lols have changed since you have."); + getLogger().message(sender, true, "There's nothing to page through. This command pages through the last lol command's output."); return true; } - + int pages = getMaxPage(results.size()); - - if (results.get(0) == -1) + + if (results.get(0) == -1) { listLols(sender, page); - else if (page < 1 || page > pages) - getLogger().message(sender, true, "Page number not on range. Must be between &e1&7 and &e" + pages + "&7."); - else { - Message m = new Message(sender, null); - m.appendText(getLogger().getHeader().replace("\n", " &ePage " + page + "/" + pages + ":")); - - for (int i = page*PAGE_SIZE-PAGE_SIZE; i < page*PAGE_SIZE; i++) - m.appendCallback("\n&a" + i + "&8: &e" + lols.get(i), getCallback(i)); - - m.send(); + } else { + printPaged(sender, results, page); } + return true; } - + @EventHandler public void onLeave(PlayerQuitEvent e) { searchCache.remove(e.getPlayer()); } - - public int getMaxPage(int size) { + + private int getMaxPage(int size) { return (int) Math.ceil(size / (double) PAGE_SIZE); } - - public void saveLols() - { + + private void saveLols() { JsonManager.save(lols, lolLocation); } - - public void saveLolsSync() - { + + private void saveLolsSync() { JsonManager.saveSync(lols, lolLocation); } - - public ClickCallback getCallback(int index) - { + + private ClickCallback getCallback(int index) { return (ClickCallback) handlers.get(index); } - - public void clickAction(Player player, int index) - { + + private void clickAction(Player player, int index) { if (player.hasPermission("utils.lol.id")) Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(player, "lol id " + index)); } + + private String getSenderName(CommandSender sender) { + return sender instanceof Player ? ((Player) sender).getDisplayName() : "&9" + sender.getName(); + } + + private boolean warnNoLols(CommandSender sender) { + if (lols.size() == 0) { + getLogger().message(sender, true, "There are no lols yet!"); + return true; + } + + return false; + } + + private boolean warnTime(CommandSender sender, long time) { + if (time - lastLol < 15000) { + int secs = (14 - (int) Math.ceil((time - lastLol) / 1000)); + getLogger().message(sender, true, "You can't use saylol for another " + secs + "s."); + return true; + } + + return false; + } + + private boolean warnLolOutOfBounds(CommandSender sender, int id) { + if (id < 0 || id >= lols.size()) { + getLogger().message(sender, true, "The ID must be at least 0 and at most " + (lols.size() - 1)); + return true; + } + + return false; + } + + private boolean warnPageOutOfBounds(CommandSender sender, int start, int pages) { + if (start < 0) { + getLogger().message(sender, true, "Page number too small, must be at least 1!"); + return true; + } + + if (start > lols.size()) { + getLogger().message(sender, true, "Page number too big, must be at most " + pages + "!"); + return true; + } + + return false; + } + + private void appendResults(Message m, List results) { + int size = results.size(); + if (size > PAGE_SIZE) m.appendText(" &ePage 1/" + getMaxPage(size) + ":"); + + for (int i = 0; i < size && i < PAGE_SIZE; i++) { + int id = results.get(i); + m.appendCallback("\n&a" + id + "&8: &e" + lols.get(id), getCallback(id)); + } + + m.appendText("\n&7Use /lol page to look at other pages."); + } + + private void printPaged(CommandSender sender, List results, int page) { + page = page - 1; + int start = page * PAGE_SIZE; + int end = start + PAGE_SIZE; + int pages = getMaxPage(results.size()); + + if (warnPageOutOfBounds(sender, start, pages)) return; + + Message m = new Message(sender, null); + m.appendText(getLogger().getHeader().replace("\n", "")); + m.appendText(" &ePage " + (page + 1) + "/" + pages + ":"); + + for (int i = start; i < end && i < results.size(); i++) { + int id = results.get(i); + m.appendCallback("\n&a" + id + "&8: &e" + lols.get(id), getCallback(id)); + } + + m.send(); + } } -- cgit v1.2.3