From bb18b838c6093a1c93c21b7c86ff2d894464c662 Mon Sep 17 00:00:00 2001 From: Minenash Date: Sun, 17 Feb 2019 23:34:19 -0500 Subject: Added paging to /lol search and /lol match. This also fixed a bug where if there was too many results, then the server would refuse to send the message. --- .../java/com/redstoner/modules/saylol/Saylol.cmd | 5 + .../java/com/redstoner/modules/saylol/Saylol.java | 133 +++++++++++++++++---- 2 files changed, 112 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/redstoner/modules/saylol/Saylol.cmd b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd index b81605a..f8512c1 100644 --- a/src/main/java/com/redstoner/modules/saylol/Saylol.cmd +++ b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd @@ -41,6 +41,11 @@ command lol { run matchlol -i regex; perm utils.lol.match; } + page [int:num] { + help Shows you page . Used in /lol search, /lol match, and /lol list.; + run page num; + perm utils.lol.page; + } [empty] { help Lols.; run saylol; diff --git a/src/main/java/com/redstoner/modules/saylol/Saylol.java b/src/main/java/com/redstoner/modules/saylol/Saylol.java index cd33f97..4f30342 100644 --- a/src/main/java/com/redstoner/modules/saylol/Saylol.java +++ b/src/main/java/com/redstoner/modules/saylol/Saylol.java @@ -1,14 +1,22 @@ 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; @@ -24,14 +32,17 @@ import net.nemez.chatapi.ChatAPI; import net.nemez.chatapi.click.ClickCallback; import net.nemez.chatapi.click.Message; +@AutoRegisterListener @Commands(CommandHolderType.File) -@Version(major = 5, minor = 0, revision = 1, compatible = 4) +@Version(major = 5, minor = 1, revision = 0, compatible = 4) public class Saylol implements Module { private long lastLol = 0; 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") @Override @@ -84,6 +95,7 @@ public class Saylol implements Module } }); saveLols(); + searchCache.clear(); } return true; } @@ -104,6 +116,7 @@ public class Saylol implements Module getLogger().message(sender, "Successfully deleted the lol: " + lols.remove(id)); handlers.remove(id); saveLols(); + searchCache.clear(); return true; } @@ -124,6 +137,7 @@ public class Saylol implements Module getLogger().message(sender, "Successfully changed the lol: &e" + lols.get(id) + " &7to: &e" + text); lols.set(id, text); saveLols(); + searchCache.clear(); return true; } @@ -195,18 +209,20 @@ public class Saylol implements Module @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 * 10; - int end = start + 10; - int pages = (int) Math.ceil(lols.size() / 10d); + 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 0!"); + getLogger().message(sender, true, "Page number too small, must be at least 1!"); return true; } if (start > lols.size()) @@ -216,7 +232,7 @@ public class Saylol implements Module } Message m = new Message(sender, null); m.appendText(getLogger().getHeader().replace("\n", "")); - m.appendText("&ePage " + (page + 1) + "/" + pages + ":"); + 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(); @@ -231,52 +247,117 @@ public class Saylol implements Module @Command(hook = "searchlol") public boolean search(CommandSender sender, boolean sensitive, String text) - { - Message m = new Message(sender, null); - m.appendText(getLogger().getHeader().replace("\n", "")); - boolean found = false; + { + searchCache.remove(sender); + + List results = new ArrayList<>(); + if (!sensitive) text = text.toLowerCase(); for (int i = 0; i < lols.size(); i++) { String lol = (String) lols.get(i); if ((sensitive ? lol : lol.toLowerCase()).contains(text)) - { - m.appendCallback("\n&a" + i + "&8: &e" + lol, getCallback(i)); - found = true; - } + results.add(i); } - if (!found) + if (results.isEmpty()) { getLogger().message(sender, "&cCouldn't find any matching lols."); - else - m.send(); + 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."); + m.send(); return true; } @Command(hook = "matchlol") public boolean match(CommandSender sender, boolean sensitive, String regex) { - Message m = new Message(sender, null); - m.appendText(getLogger().getHeader().replace("\n", "")); - boolean found = false; + + searchCache.remove(sender); + + List results = new ArrayList<>(); + 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)) - { - m.appendCallback("\n&a" + i + "&8: &e" + lol, getCallback(i)); - found = true; - } + results.add(i); } - if (!found) + if (results.isEmpty()) { getLogger().message(sender, "&cCouldn't find any matching lols."); - else + 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."); + m.send(); + + return true; + } + + @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."); + return true; + } + + int pages = getMaxPage(results.size()); + + 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(); + } return true; } + @EventHandler + public void onLeave(PlayerQuitEvent e) { + searchCache.remove(e.getPlayer()); + } + + public int getMaxPage(int size) { + return (int) Math.ceil(size / (double) PAGE_SIZE); + } + public void saveLols() { JsonManager.save(lols, lolLocation); -- cgit v1.2.3