Implement paginated permission listings - closes #80
This commit is contained in:
parent
8a692200d5
commit
5e68f7b58c
@ -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<String> 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<FancyMessage, String> 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)));
|
||||
|
@ -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<LocalizedNode> nodes, PermissionHolder holder, String label) {
|
||||
FancyMessage message = new FancyMessage("");
|
||||
|
||||
boolean found = false;
|
||||
public static Map.Entry<FancyMessage, String> permNodesToMessage(SortedSet<LocalizedNode> nodes, PermissionHolder holder, String label, int pageNumber) {
|
||||
List<Node> 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<List<Node>> pages = divideList(l, 20);
|
||||
|
||||
if ((index < 0 || index >= pages.size())) {
|
||||
pageNumber = 1;
|
||||
index = 0;
|
||||
}
|
||||
|
||||
List<Node> 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 <T> List<List<T>> divideList(List<T> source, int size) {
|
||||
List<List<T>> lists = new ArrayList<>();
|
||||
Iterator<T> it = source.iterator();
|
||||
while (it.hasNext()) {
|
||||
List<T> 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<LocalizedNode> nodes) {
|
||||
|
@ -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),
|
||||
|
@ -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}"
|
||||
|
Loading…
Reference in New Issue
Block a user