From 64bd8b5eaface432e9030a71cd5adcb751c1837e Mon Sep 17 00:00:00 2001 From: Tadhg Boyle Date: Tue, 30 Nov 2021 11:52:43 -0800 Subject: [PATCH] Add pagination to listgroups command (#3226) --- bukkit/src/main/resources/luckperms.commodore | 4 ++- .../common/command/spec/CommandSpec.java | 5 +-- .../common/commands/group/ListGroups.java | 35 ++++++++++++++----- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/bukkit/src/main/resources/luckperms.commodore b/bukkit/src/main/resources/luckperms.commodore index 1d922effd..5d043c1ca 100644 --- a/bukkit/src/main/resources/luckperms.commodore +++ b/bukkit/src/main/resources/luckperms.commodore @@ -69,7 +69,9 @@ luckperms { flags brigadier:string greedy_phrase; } } - listgroups; + listgroups { + page brigadier:integer; + } createtrack { name brigadier:string single_word; } diff --git a/common/src/main/java/me/lucko/luckperms/common/command/spec/CommandSpec.java b/common/src/main/java/me/lucko/luckperms/common/command/spec/CommandSpec.java index fe5a97409..c162d1b44 100644 --- a/common/src/main/java/me/lucko/luckperms/common/command/spec/CommandSpec.java +++ b/common/src/main/java/me/lucko/luckperms/common/command/spec/CommandSpec.java @@ -99,8 +99,9 @@ public enum CommandSpec { DELETE_GROUP("/%s deletegroup ", arg("name", true) ), - LIST_GROUPS("/%s listgroups"), - + LIST_GROUPS("/%s listgroups", + arg("page", false) + ), CREATE_TRACK("/%s createtrack ", arg("name", true) ), diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/ListGroups.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/ListGroups.java index 6f77368eb..5937eae0d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/ListGroups.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/ListGroups.java @@ -30,17 +30,20 @@ import me.lucko.luckperms.common.command.access.CommandPermission; import me.lucko.luckperms.common.command.spec.CommandSpec; import me.lucko.luckperms.common.command.utils.ArgumentList; import me.lucko.luckperms.common.locale.Message; +import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; +import me.lucko.luckperms.common.util.Iterators; import me.lucko.luckperms.common.util.Predicates; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; public class ListGroups extends SingleCommand { public ListGroups() { - super(CommandSpec.LIST_GROUPS, "ListGroups", CommandPermission.LIST_GROUPS, Predicates.alwaysFalse()); + super(CommandSpec.LIST_GROUPS, "ListGroups", CommandPermission.LIST_GROUPS, Predicates.notInRange(0, 1)); } @Override @@ -53,15 +56,29 @@ public class ListGroups extends SingleCommand { return; } - Message.GROUPS_LIST.send(sender); - plugin.getGroupManager().getAll().values().stream() - .sorted((o1, o2) -> { + int page = args.getIntOrDefault(0, 1); + int pageIndex = page - 1; + + List groups = plugin.getGroupManager().getAll().values().stream().sorted((o1, o2) -> { int i = Integer.compare(o2.getWeight().orElse(0), o1.getWeight().orElse(0)); return i != 0 ? i : o1.getName().compareToIgnoreCase(o2.getName()); - }) - .forEach(group -> { - List tracks = plugin.getTrackManager().getAll().values().stream().filter(t -> t.containsGroup(group)).map(Track::getName).collect(Collectors.toList()); - Message.GROUPS_LIST_ENTRY.send(sender, group, group.getWeight().orElse(0), tracks); - }); + }).collect(Collectors.toList()); + + List> pages = Iterators.divideIterable(groups, 8); + + if (pageIndex < 0 || pageIndex >= pages.size()) { + page = 1; + pageIndex = 0; + } + + Message.SEARCH_SHOWING_GROUPS.send(sender, page, pages.size(), groups.size()); + Message.GROUPS_LIST.send(sender); + + Collection allTracks = plugin.getTrackManager().getAll().values(); + + for (Group group : pages.get(pageIndex)) { + List tracks = allTracks.stream().filter(t -> t.containsGroup(group)).map(Track::getName).collect(Collectors.toList()); + Message.GROUPS_LIST_ENTRY.send(sender, group, group.getWeight().orElse(0), tracks); + } } }