Command pagination

This commit is contained in:
cyberpwn 2021-08-28 22:34:05 -04:00
parent dd0b4f27d4
commit ae763ae25d
2 changed files with 151 additions and 87 deletions

View File

@ -359,6 +359,18 @@ public class VirtualDecreeCommand {
return true;
}
else if(args.size() == 1)
{
for(String i : args)
{
if(i.startsWith("help="))
{
sender.sendDecreeHelp(this, Integer.parseInt(i.split("\\Q=\\E")[1])-1);
return true;
}
}
}
String head = args.get(0);
VirtualDecreeCommand match = matchNode(head, skip);

View File

@ -21,6 +21,7 @@ package com.volmit.iris.util.plugin;
import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.decree.DecreeParameter;
import com.volmit.iris.util.decree.virtual.VirtualDecreeCommand;
import com.volmit.iris.util.format.C;
@ -41,12 +42,14 @@ import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin;
import org.bukkit.util.ChatPaginator;
import java.time.Duration;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@ -408,25 +411,73 @@ public class VolmitSender implements CommandSender {
sendHeader(name, 46);
}
public void sendDecreeHelp(VirtualDecreeCommand v) {
sendDecreeHelp(v, 0);
}
public static <T> KList<T> paginate(KList<T> all, int linesPerPage, int page, AtomicBoolean hasNext)
{
int totalPages = (int) Math.ceil((double)all.size() / linesPerPage);
page = page < 0 ? 0 : page >= totalPages ? totalPages - 1 : page;
hasNext.set(page < totalPages-1);
KList<T> d = new KList<>();
for(int i = linesPerPage * page; i < Math.min(all.size(), linesPerPage * (page + 1)); i++)
{
d.add(all.get(i));
}
return d;
}
public void sendDecreeHelp(VirtualDecreeCommand v, int page) {
int m = v.getNodes().size();
sendMessageRaw("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
if (v.getNodes().isNotEmpty()) {
sendHeader(Form.capitalize(v.getName()) + " Help");
sendHeader(v.getPath() + (page > 0 ? (" {" + (page+1) + "}") : ""));
if (isPlayer() && v.getParent() != null) {
sendMessageRaw("<hover:show_text:'" + "<#b54b38>Click to go back to <#3299bf>" + Form.capitalize(v.getParent().getName()) + " Help" + "'><click:run_command:" + v.getParent().getPath() + "><font:minecraft:uniform><#f58571>〈 Back</click></hover>");
}
for (VirtualDecreeCommand i : v.getNodes()) {
AtomicBoolean next = new AtomicBoolean(false);
for (VirtualDecreeCommand i : paginate(v.getNodes(), 17, page, next)) {
sendDecreeHelpNode(i);
}
String s = "";
int l = 75 - (page > 0 ? 10 : 0) - (next.get() ? 10 : 0);
if(page > 0)
{
s += "<hover:show_text:'<green>Click to go back to page " + page + "'><click:run_command:" + v.getPath() + " help=" + page + "><gradient:#27b84d:#2770b8>〈 Page " + page + "</click></hover><reset> ";
}
s += "<reset><font:minecraft:uniform><strikethrough><gradient:#32bfad:#34eb6b>" + Form.repeat(" ", l) + "<reset>";
if(next.get())
{
s += " <hover:show_text:'<green>Click to go to back to page " + (page+2) + "'><click:run_command:" + v.getPath() + " help=" + (page+2) + "><gradient:#2770b8:#27b84d>Page " + (page+2) + " ❭</click></hover>";
}
sendMessageRaw(s);
} else {
sendMessage(C.RED + "There are no subcommands in this group! Contact support, this is a command design issue!");
}
}
private static final KMap<String, String> helpCache = new KMap<>();
public void sendDecreeHelpNode(VirtualDecreeCommand i) {
if (isPlayer()) {
sendMessageRaw(helpCache.compute(i.getPath(), (k, v) -> {
if(v != null)
{
return v;
}
String newline = "<reset>\n";
@ -519,7 +570,8 @@ public class VolmitSender implements CommandSender {
" " +
nodes;
sendMessageRaw(wrapper);
return wrapper;
}));
} else {
sendMessage(i.getPath());
}