mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-26 07:06:44 +01:00
Add tab completion for /plot <deny|kick|remove>
This commit is contained in:
parent
3e2e61d2be
commit
6259287dff
@ -33,9 +33,12 @@ import com.plotsquared.core.player.PlotPlayer;
|
|||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.util.MainUtil;
|
import com.plotsquared.core.util.MainUtil;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
|
import com.plotsquared.core.util.TabCompletions;
|
||||||
import com.plotsquared.core.util.WorldUtil;
|
import com.plotsquared.core.util.WorldUtil;
|
||||||
import com.sk89q.worldedit.world.gamemode.GameModes;
|
import com.sk89q.worldedit.world.gamemode.GameModes;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
@ -112,6 +115,10 @@ public class Deny extends SubCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public Collection<Command> tab(final PlotPlayer player, final String[] args, final boolean space) {
|
||||||
|
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList());
|
||||||
|
}
|
||||||
|
|
||||||
private void handleKick(PlotPlayer player, Plot plot) {
|
private void handleKick(PlotPlayer player, Plot plot) {
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -33,8 +33,11 @@ import com.plotsquared.core.player.PlotPlayer;
|
|||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.util.MainUtil;
|
import com.plotsquared.core.util.MainUtil;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
|
import com.plotsquared.core.util.TabCompletions;
|
||||||
import com.plotsquared.core.util.WorldUtil;
|
import com.plotsquared.core.util.WorldUtil;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -122,4 +125,14 @@ public class Kick extends SubCommand {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public Collection<Command> tab(final PlotPlayer player, final String[] args, final boolean space) {
|
||||||
|
Location location = player.getLocation();
|
||||||
|
Plot plot = location.getPlotAbs();
|
||||||
|
if (plot == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
return TabCompletions.completePlayersInPlot(plot, String.join(",", args).trim(),
|
||||||
|
Collections.singletonList(player.getName()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,10 @@ import com.plotsquared.core.player.PlotPlayer;
|
|||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.util.MainUtil;
|
import com.plotsquared.core.util.MainUtil;
|
||||||
import com.plotsquared.core.util.Permissions;
|
import com.plotsquared.core.util.Permissions;
|
||||||
|
import com.plotsquared.core.util.TabCompletions;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
@ -120,4 +123,14 @@ public class Remove extends SubCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public Collection<Command> tab(final PlotPlayer player, final String[] args, final boolean space) {
|
||||||
|
Location location = player.getLocation();
|
||||||
|
Plot plot = location.getPlotAbs();
|
||||||
|
if (plot == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
return TabCompletions.completeAddedPlayers(plot, String.join(",", args).trim(),
|
||||||
|
Collections.singletonList(player.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ 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.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.uuid.UUIDMapping;
|
import com.plotsquared.core.uuid.UUIDMapping;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@ -43,7 +44,9 @@ import java.util.Collection;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -70,35 +73,37 @@ public class TabCompletions {
|
|||||||
*/
|
*/
|
||||||
@NotNull public List<Command> completePlayers(@NotNull final String input,
|
@NotNull public List<Command> completePlayers(@NotNull final String input,
|
||||||
@NotNull final List<String> existing) {
|
@NotNull final List<String> existing) {
|
||||||
List<String> players;
|
return completePlayers("players", input, existing, uuid -> true);
|
||||||
if (Settings.Enabled_Components.EXTENDED_USERNAME_COMPLETION) {
|
}
|
||||||
players = cachedCompletionValues.getIfPresent("players");
|
|
||||||
|
/**
|
||||||
|
* Get a list of tab completions corresponding to player names added to the given plot.
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
@NotNull public List<Command> completeAddedPlayers(@NotNull final Plot plot, @NotNull final String input,
|
||||||
|
@NotNull final List<String> existing) {
|
||||||
|
return completePlayers("added" + plot, input, existing,
|
||||||
|
uuid -> plot.getMembers().contains(uuid)
|
||||||
|
|| plot.getTrusted().contains(uuid)
|
||||||
|
|| plot.getDenied().contains(uuid));
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull public List<Command> completePlayersInPlot(@NotNull final Plot plot, @NotNull final String input,
|
||||||
|
@NotNull final List<String> existing) {
|
||||||
|
List<String> players = cachedCompletionValues.getIfPresent("inPlot" + plot);
|
||||||
if (players == null) {
|
if (players == null) {
|
||||||
final Collection<UUIDMapping> mappings =
|
final List<PlotPlayer<?>> inPlot = plot.getPlayersInPlot();
|
||||||
PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
|
players = new ArrayList<>(inPlot.size());
|
||||||
players = new ArrayList<>(mappings.size());
|
for (PlotPlayer<?> player : inPlot) {
|
||||||
for (final UUIDMapping mapping : mappings) {
|
|
||||||
players.add(mapping.getUsername());
|
|
||||||
}
|
|
||||||
cachedCompletionValues.put("players", players);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
final Collection<? extends PlotPlayer> onlinePlayers = PlotSquared.imp().getPlayerManager().getPlayers();
|
|
||||||
players = new ArrayList<>(onlinePlayers.size());
|
|
||||||
for (final PlotPlayer player : onlinePlayers) {
|
|
||||||
players.add(player.getName());
|
players.add(player.getName());
|
||||||
}
|
}
|
||||||
|
cachedCompletionValues.put("inPlot" + plot, players);
|
||||||
}
|
}
|
||||||
final String processedInput = input.toLowerCase(Locale.ENGLISH);
|
return filterCached(players, input, existing);
|
||||||
return players.stream()
|
|
||||||
.filter(player -> player.toLowerCase(Locale.ENGLISH).startsWith(processedInput))
|
|
||||||
.filter(player -> !existing.contains(player)).map(
|
|
||||||
player -> new Command(null, false, player, "", RequiredType.NONE,
|
|
||||||
CommandCategory.INFO) {
|
|
||||||
})
|
|
||||||
/* If there are more than 200 suggestions, just send the first 200 */
|
|
||||||
.limit(200)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -129,4 +134,52 @@ public class TabCompletions {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param cacheIdentifier Cache key
|
||||||
|
* @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 List<Command> completePlayers(@NotNull final String cacheIdentifier, @NotNull final String input,
|
||||||
|
@NotNull final List<String> existing,
|
||||||
|
@NotNull final Predicate<UUID> uuidFilter) {
|
||||||
|
List<String> players;
|
||||||
|
if (Settings.Enabled_Components.EXTENDED_USERNAME_COMPLETION) {
|
||||||
|
players = cachedCompletionValues.getIfPresent(cacheIdentifier);
|
||||||
|
if (players == null) {
|
||||||
|
final Collection<UUIDMapping> mappings =
|
||||||
|
PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
|
||||||
|
players = new ArrayList<>(mappings.size());
|
||||||
|
for (final UUIDMapping mapping : mappings) {
|
||||||
|
if (uuidFilter.test(mapping.getUuid())) {
|
||||||
|
players.add(mapping.getUsername());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cachedCompletionValues.put(cacheIdentifier, players);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
final Collection<? extends PlotPlayer<?>> onlinePlayers = PlotSquared.imp().getPlayerManager().getPlayers();
|
||||||
|
players = new ArrayList<>(onlinePlayers.size());
|
||||||
|
for (final PlotPlayer<?> player : onlinePlayers) {
|
||||||
|
if (uuidFilter.test(player.getUUID())) {
|
||||||
|
players.add(player.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filterCached(players, input, existing);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Command> filterCached(Collection<String> playerNames, String input, List<String> existing) {
|
||||||
|
final String processedInput = input.toLowerCase(Locale.ENGLISH);
|
||||||
|
return playerNames.stream().filter(player -> player.toLowerCase(Locale.ENGLISH).startsWith(processedInput))
|
||||||
|
.filter(player -> !existing.contains(player)).map(
|
||||||
|
player -> new Command(null, false, player, "", RequiredType.NONE,
|
||||||
|
CommandCategory.INFO) {
|
||||||
|
})
|
||||||
|
/* If there are more than 200 suggestions, just send the first 200 */
|
||||||
|
.limit(200)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user