Archived
0

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.
This commit is contained in:
Minenash
2019-02-17 23:34:19 -05:00
parent 0061411a57
commit bb18b838c6
2 changed files with 113 additions and 27 deletions

View File

@@ -41,6 +41,11 @@ command lol {
run matchlol -i regex;
perm utils.lol.match;
}
page [int:num] {
help Shows you page <num>. Used in /lol search, /lol match, and /lol list.;
run page num;
perm utils.lol.page;
}
[empty] {
help Lols.;
run saylol;

View File

@@ -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<CommandSender, List<Integer>> 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<Integer> 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 <number> 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<Integer> 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
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(i), getCallback(i));
m.appendText("\n&7Use /lol page <number> to look at other pages.");
m.send();
return true;
}
@Command(hook = "page")
public boolean page(CommandSender sender, int page) {
List<Integer> 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);