feat: Respect non-visible players in tab completion (Closes #3263) (#3264)

* Respect non-visible players in tab completion (Closes #3263)

* Deprecate old Tab-Complete methods instead of hard-replacing them

* wtf git

* Mark for removal, useless new-lines

* Pass ConsolePlayer.getConsole() instead of Nullable param
This commit is contained in:
Pierre Maurice Schwang 2021-10-01 21:52:44 +02:00 committed by NotMyFault
parent 541255fe7e
commit e322ee85fd
No known key found for this signature in database
GPG Key ID: 158F5701A6AAD00C
20 changed files with 97 additions and 33 deletions

View File

@ -166,7 +166,7 @@ public class Add extends Command {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -856,11 +856,11 @@ public class Area extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_AREA) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -916,11 +916,11 @@ public class Cluster extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -157,7 +157,7 @@ public class Deny extends SubCommand {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
private void handleKick(PlotPlayer<?> player, Plot plot) { private void handleKick(PlotPlayer<?> player, Plot plot) {

View File

@ -70,11 +70,11 @@ public class Dislike extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -173,11 +173,11 @@ public class Download extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
private void upload(PlotPlayer<?> player, Plot plot) { private void upload(PlotPlayer<?> player, Plot plot) {

View File

@ -176,11 +176,11 @@ public class Grant extends Command {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -307,11 +307,11 @@ public class Inbox extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.CHAT) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.CHAT) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -161,7 +161,7 @@ public class Info extends SubCommand {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;

View File

@ -220,11 +220,11 @@ public class Like extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -532,7 +532,7 @@ public class ListCmd extends SubCommand {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;

View File

@ -209,7 +209,7 @@ public class Owner extends SetCommand {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -292,11 +292,11 @@ public class Rate extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
private static class MutableInt { private static class MutableInt {

View File

@ -142,7 +142,7 @@ public class Remove extends SubCommand {
if (plot == null) { if (plot == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
return TabCompletions.completeAddedPlayers(plot, String.join(",", args).trim(), return TabCompletions.completeAddedPlayers(player, plot, String.join(",", args).trim(),
Collections.singletonList(player.getName()) Collections.singletonList(player.getName())
); );
} }

View File

@ -317,11 +317,11 @@ public class SchematicCmd extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -288,7 +288,7 @@ public class Set extends SubCommand {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_SET) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_SET) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} else if (args.length > 1) { } else if (args.length > 1) {

View File

@ -305,11 +305,11 @@ public class Template extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_TEMPLATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_TEMPLATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -168,7 +168,7 @@ public class Trust extends Command {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -334,7 +334,7 @@ public class Visit extends Command {
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) { public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
final List<Command> completions = new ArrayList<>(); final List<Command> completions = new ArrayList<>();
switch (args.length - 1) { switch (args.length - 1) {
case 0 -> completions.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); case 0 -> completions.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
case 1 -> { case 1 -> {
completions.addAll( completions.addAll(
TabCompletions.completeAreas(args[1])); TabCompletions.completeAreas(args[1]));

View File

@ -32,11 +32,13 @@ import com.plotsquared.core.command.Command;
import com.plotsquared.core.command.CommandCategory; import com.plotsquared.core.command.CommandCategory;
import com.plotsquared.core.command.RequiredType; import com.plotsquared.core.command.RequiredType;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.uuid.UUIDMapping; import com.plotsquared.core.uuid.UUIDMapping;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -80,12 +82,31 @@ public final class TabCompletions {
* @param input Command input * @param input Command input
* @param existing Players that should not be included in completions * @param existing Players that should not be included in completions
* @return List of completions * @return List of completions
* @deprecated In favor {@link #completePlayers(PlotPlayer, String, List)}
*/ */
@Deprecated(forRemoval = true)
public static @NonNull List<Command> completePlayers( public static @NonNull List<Command> completePlayers(
final @NonNull String input, final @NonNull String input,
final @NonNull List<String> existing final @NonNull List<String> existing
) { ) {
return completePlayers("players", input, existing, uuid -> true); return completePlayers(ConsolePlayer.getConsole(), input, existing);
}
/**
* Get a list of tab completions corresponding to player names. This uses the UUID pipeline
* cache, so it will complete will all names known to PlotSquared
*
* @param input Command input
* @param issuer The player who issued the tab completion
* @param existing Players that should not be included in completions
* @return List of completions
*/
public static @NonNull List<Command> completePlayers(
final @NonNull PlotPlayer<?> issuer,
final @NonNull String input,
final @NonNull List<String> existing
) {
return completePlayers("players", issuer, input, existing, uuid -> true);
} }
/** /**
@ -95,12 +116,32 @@ public final class TabCompletions {
* @param input Command input * @param input Command input
* @param existing Players that should not be included in completions * @param existing Players that should not be included in completions
* @return List of completions * @return List of completions
*
* @deprecated In favor {@link #completeAddedPlayers(PlotPlayer, Plot, String, List)}
*/ */
@Deprecated(forRemoval = true)
public static @NonNull List<Command> completeAddedPlayers( public static @NonNull List<Command> completeAddedPlayers(
final @NonNull Plot plot, final @NonNull Plot plot,
final @NonNull String input, final @NonNull List<String> existing final @NonNull String input, final @NonNull List<String> existing
) { ) {
return completePlayers("added" + plot, input, existing, return completeAddedPlayers(ConsolePlayer.getConsole(), plot, input, existing);
}
/**
* Get a list of tab completions corresponding to player names added to the given plot.
*
* @param issuer The player who issued the tab completion
* @param plot Plot to complete added players for
* @param input Command input
* @param existing Players that should not be included in completions
* @return List of completions
*/
public static @NonNull List<Command> completeAddedPlayers(
final @NonNull PlotPlayer<?> issuer,
final @NonNull Plot plot,
final @NonNull String input, final @NonNull List<String> existing
) {
return completePlayers("added" + plot, issuer, input, existing,
uuid -> plot.getMembers().contains(uuid) uuid -> plot.getMembers().contains(uuid)
|| plot.getTrusted().contains(uuid) || plot.getTrusted().contains(uuid)
|| plot.getDenied().contains(uuid) || plot.getDenied().contains(uuid)
@ -222,9 +263,28 @@ public final class TabCompletions {
* @param existing Players that should not be included in completions * @param existing Players that should not be included in completions
* @param uuidFilter Filter applied before caching values * @param uuidFilter Filter applied before caching values
* @return List of completions * @return List of completions
* @deprecated In favor {@link #completePlayers(String, PlotPlayer, String, List, Predicate)}
*/
@Deprecated(forRemoval = true)
private static List<Command> completePlayers(
final @NonNull String cacheIdentifier,
final @NonNull String input, final @NonNull List<String> existing,
final @NonNull Predicate<UUID> uuidFilter
) {
return completePlayers(cacheIdentifier, ConsolePlayer.getConsole(), input, existing, uuidFilter);
}
/**
* @param cacheIdentifier Cache key
* @param issuer The player who issued the tab completion
* @param input Command input
* @param existing Players that should not be included in completions
* @param uuidFilter Filter applied before caching values
* @return List of completions
*/ */
private static List<Command> completePlayers( private static List<Command> completePlayers(
final @NonNull String cacheIdentifier, final @NonNull String cacheIdentifier,
final @NonNull PlotPlayer<?> issuer,
final @NonNull String input, final @NonNull List<String> existing, final @NonNull String input, final @NonNull List<String> existing,
final @NonNull Predicate<UUID> uuidFilter final @NonNull Predicate<UUID> uuidFilter
) { ) {
@ -246,9 +306,13 @@ public final class TabCompletions {
final Collection<? extends PlotPlayer<?>> onlinePlayers = PlotSquared.platform().playerManager().getPlayers(); final Collection<? extends PlotPlayer<?>> onlinePlayers = PlotSquared.platform().playerManager().getPlayers();
players = new ArrayList<>(onlinePlayers.size()); players = new ArrayList<>(onlinePlayers.size());
for (final PlotPlayer<?> player : onlinePlayers) { for (final PlotPlayer<?> player : onlinePlayers) {
if (uuidFilter.test(player.getUUID())) { if (!uuidFilter.test(player.getUUID())) {
players.add(player.getName()); continue;
} }
if (issuer != null && !issuer.canSee(player)) {
continue;
}
players.add(player.getName());
} }
} }
return filterCached(players, input, existing); return filterCached(players, input, existing);