From 5e68f7b58cb60025197dcd6eb8df09e78dd329e4 Mon Sep 17 00:00:00 2001 From: Luck Date: Tue, 20 Dec 2016 13:55:42 +0000 Subject: [PATCH] Implement paginated permission listings - closes #80 --- .../generic/permission/PermissionInfo.java | 31 ++++++++++-- .../luckperms/common/commands/utils/Util.java | 50 ++++++++++++++++--- .../luckperms/common/constants/Message.java | 1 + default-lang.yml | 1 + 4 files changed, 73 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java index 7ef925a2a..051491cd9 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/generic/permission/PermissionInfo.java @@ -23,6 +23,7 @@ package me.lucko.luckperms.common.commands.generic.permission; import me.lucko.luckperms.common.LuckPermsPlugin; +import me.lucko.luckperms.common.commands.Arg; import me.lucko.luckperms.common.commands.CommandException; import me.lucko.luckperms.common.commands.CommandResult; import me.lucko.luckperms.common.commands.generic.SharedSubCommand; @@ -34,20 +35,44 @@ import me.lucko.luckperms.common.constants.Permission; import me.lucko.luckperms.common.core.model.PermissionHolder; import me.lucko.luckperms.common.utils.Predicates; +import io.github.mkremins.fanciful.FancyMessage; + import java.util.List; +import java.util.Map; public class PermissionInfo extends SharedSubCommand { public PermissionInfo() { - super("info", "Lists the permission nodes the object has", Permission.USER_PERM_INFO, Permission.GROUP_PERM_INFO, Predicates.alwaysFalse(), null); + super("info", "Lists the permission nodes the object has", Permission.USER_PERM_INFO, + Permission.GROUP_PERM_INFO, Predicates.alwaysFalse(), + Arg.list( + Arg.create("page", false, "the page to view") + ) + ); } @Override public CommandResult execute(LuckPermsPlugin plugin, Sender sender, PermissionHolder holder, List args, String label) throws CommandException { - Message.LISTNODES.send(sender, holder.getFriendlyName()); if (sender.getUuid().equals(Constants.getConsoleUUID())) { + Message.LISTNODES.send(sender, holder.getFriendlyName()); sender.sendMessage(Util.color(Util.permNodesToStringConsole(holder.getPermissions(false)))); } else { - sender.sendMessage(Util.permNodesToMessage(holder.getPermissions(false), holder, label)); + int page = 1; + if (args.size() > 0) { + try { + page = Integer.parseInt(args.get(0)); + } catch (NumberFormatException e) { + // ignored + } + } + + Map.Entry ent = Util.permNodesToMessage(holder.getPermissions(false), holder, label, page); + if (ent.getValue() != null) { + Message.LISTNODES_WITH_PAGE.send(sender, holder.getFriendlyName(), ent.getValue()); + sender.sendMessage(ent.getKey()); + } else { + Message.LISTNODES.send(sender, holder.getFriendlyName()); + sender.sendMessage(ent.getKey()); + } } Message.LISTNODES_TEMP.send(sender, holder.getFriendlyName(), Util.tempNodesToString(holder.getPermissions(false))); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/utils/Util.java b/common/src/main/java/me/lucko/luckperms/common/commands/utils/Util.java index 39a3cc357..07451721e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/utils/Util.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/utils/Util.java @@ -24,6 +24,8 @@ package me.lucko.luckperms.common.commands.utils; import lombok.experimental.UtilityClass; +import com.google.common.collect.Maps; + import me.lucko.luckperms.api.LocalizedNode; import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.Tristate; @@ -40,6 +42,7 @@ import io.github.mkremins.fanciful.FancyMessage; import java.util.ArrayList; import java.util.Comparator; +import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -195,19 +198,52 @@ public class Util { return message; } - public static FancyMessage permNodesToMessage(SortedSet nodes, PermissionHolder holder, String label) { - FancyMessage message = new FancyMessage(""); - - boolean found = false; + public static Map.Entry permNodesToMessage(SortedSet nodes, PermissionHolder holder, String label, int pageNumber) { + List l = new ArrayList<>(); for (Node node : nodes) { - if (node.isTemporary()) continue; - found = true; + if (!node.isTemporary()) { + l.add(node); + } + } + + if (l.isEmpty()) { + return Maps.immutableEntry(new FancyMessage("None").color(ChatColor.getByChar('3')), null); + } + + int index = pageNumber - 1; + List> pages = divideList(l, 20); + + if ((index < 0 || index >= pages.size())) { + pageNumber = 1; + index = 0; + } + + List page = pages.get(index); + + FancyMessage message = new FancyMessage(""); + String title = "&7(showing page &f" + pageNumber + "&7 of &f" + pages.size() + "&7 - &f" + nodes.size() + "&7 entries)"; + + for (Node node : page) { message = makeFancy(holder, label, node, message.then("> ").color(ChatColor.getByChar('3'))); message = makeFancy(holder, label, node, message.then(Util.color(node.getPermission())).color(node.getValue() ? ChatColor.getByChar('a') : ChatColor.getByChar('c'))); message = makeFancy(holder, label, node, appendNodeContextDescription(node, message)); message = message.then("\n"); } - return !found ? new FancyMessage("None").color(ChatColor.getByChar('3')) : message; + + return Maps.immutableEntry(message, title); + } + + private static List> divideList(List source, int size) { + List> lists = new ArrayList<>(); + Iterator it = source.iterator(); + while (it.hasNext()) { + List subList = new ArrayList<>(); + for (int i = 0; it.hasNext() && i < size; i++) { + subList.add(it.next()); + } + lists.add(subList); + } + return lists; } public static String tempNodesToString(SortedSet nodes) { diff --git a/common/src/main/java/me/lucko/luckperms/common/constants/Message.java b/common/src/main/java/me/lucko/luckperms/common/constants/Message.java index 40e94597a..05b7f0739 100644 --- a/common/src/main/java/me/lucko/luckperms/common/constants/Message.java +++ b/common/src/main/java/me/lucko/luckperms/common/constants/Message.java @@ -161,6 +161,7 @@ public enum Message { TRACKS_LIST("&aTracks: {0}", true), LISTNODES("&b{0}'s Nodes:", true), + LISTNODES_WITH_PAGE("&b{0}'s Nodes: {1}", true), LISTNODES_TEMP("&b{0}'s Temporary Nodes:" + "\n" + "{1}", true), LISTPARENTS("&b{0}'s Parent Groups:" + "\n" + "{1}", true), LISTPARENTS_TEMP("&b{0}'s Temporary Parent Groups:" + "\n" + "{1}", true), diff --git a/default-lang.yml b/default-lang.yml index 57b8fbb06..4a169f811 100644 --- a/default-lang.yml +++ b/default-lang.yml @@ -121,6 +121,7 @@ delete-track-error: "There was an error whilst deleting the track." tracks-list: "&aTracks: {0}" listnodes: "&b{0}'s Nodes:" +listnodes-with-page: "&b{0}'s Nodes: {1}" listnodes-temp: "&b{0}'s Temporary Nodes:\n{1}" listparents: "&b{0}'s Parent Groups:\n{1}" listparents-temp: "&b{0}'s Temporary Parent Groups:\n{1}"