diff --git a/api/src/main/java/com/velocitypowered/api/event/permission/PermissionsSetupEvent.java b/api/src/main/java/com/velocitypowered/api/event/permission/PermissionsSetupEvent.java
index 7c2d47bec..29b304529 100644
--- a/api/src/main/java/com/velocitypowered/api/event/permission/PermissionsSetupEvent.java
+++ b/api/src/main/java/com/velocitypowered/api/event/permission/PermissionsSetupEvent.java
@@ -9,9 +9,9 @@ package com.velocitypowered.api.event.permission;
import com.google.common.base.Preconditions;
import com.velocitypowered.api.event.annotation.AwaitingEvent;
-import com.velocitypowered.api.permission.PermissionFunction;
import com.velocitypowered.api.permission.PermissionProvider;
import com.velocitypowered.api.permission.PermissionSubject;
+import net.kyori.adventure.permission.PermissionChecker;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
@@ -44,13 +44,13 @@ public final class PermissionsSetupEvent {
}
/**
- * Uses the provider function to obtain a {@link PermissionFunction} for the subject.
+ * Uses the provider function to obtain a {@link PermissionChecker} for the subject.
*
* @param subject the subject
* @return the obtained permission function
*/
- public PermissionFunction createFunction(PermissionSubject subject) {
- return this.provider.createFunction(subject);
+ public PermissionChecker createChecker(PermissionSubject subject) {
+ return this.provider.createChecker(subject);
}
public PermissionProvider getProvider() {
@@ -58,7 +58,7 @@ public final class PermissionsSetupEvent {
}
/**
- * Sets the {@link PermissionFunction} that should be used for the subject.
+ * Sets the {@link PermissionChecker} that should be used for the subject.
*
*
Specifying null
will reset the provider to the default
* instance given when the event was posted.
diff --git a/api/src/main/java/com/velocitypowered/api/permission/PermissionFunction.java b/api/src/main/java/com/velocitypowered/api/permission/PermissionFunction.java
deleted file mode 100644
index aa4c9b65f..000000000
--- a/api/src/main/java/com/velocitypowered/api/permission/PermissionFunction.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2018-2021 Velocity Contributors
- *
- * The Velocity API is licensed under the terms of the MIT License. For more details,
- * reference the LICENSE file in the api top-level directory.
- */
-
-package com.velocitypowered.api.permission;
-
-/**
- * Function that calculates the permission settings for a given {@link PermissionSubject}.
- */
-@FunctionalInterface
-public interface PermissionFunction {
-
- /**
- * A permission function that always returns {@link Tristate#TRUE}.
- */
- PermissionFunction ALWAYS_TRUE = p -> Tristate.TRUE;
-
- /**
- * A permission function that always returns {@link Tristate#FALSE}.
- */
- PermissionFunction ALWAYS_FALSE = p -> Tristate.FALSE;
-
- /**
- * A permission function that always returns {@link Tristate#UNDEFINED}.
- */
- PermissionFunction ALWAYS_UNDEFINED = p -> Tristate.UNDEFINED;
-
- /**
- * Gets the subjects setting for a particular permission.
- *
- * @param permission the permission
- * @return the value the permission is set to
- */
- Tristate getPermissionValue(String permission);
-}
diff --git a/api/src/main/java/com/velocitypowered/api/permission/PermissionProvider.java b/api/src/main/java/com/velocitypowered/api/permission/PermissionProvider.java
index f7a9251f5..8a1131265 100644
--- a/api/src/main/java/com/velocitypowered/api/permission/PermissionProvider.java
+++ b/api/src/main/java/com/velocitypowered/api/permission/PermissionProvider.java
@@ -7,17 +7,19 @@
package com.velocitypowered.api.permission;
+import net.kyori.adventure.permission.PermissionChecker;
+
/**
- * Provides {@link PermissionFunction}s for {@link PermissionSubject}s.
+ * Provides {@link PermissionChecker}s for {@link PermissionSubject}s.
*/
@FunctionalInterface
public interface PermissionProvider {
/**
- * Creates a {@link PermissionFunction} for the subject.
+ * Creates a {@link PermissionChecker} for the subject.
*
* @param subject the subject
* @return the function
*/
- PermissionFunction createFunction(PermissionSubject subject);
+ PermissionChecker createChecker(PermissionSubject subject);
}
diff --git a/api/src/main/java/com/velocitypowered/api/permission/PermissionSubject.java b/api/src/main/java/com/velocitypowered/api/permission/PermissionSubject.java
index 14d88a980..de3e96b55 100644
--- a/api/src/main/java/com/velocitypowered/api/permission/PermissionSubject.java
+++ b/api/src/main/java/com/velocitypowered/api/permission/PermissionSubject.java
@@ -8,6 +8,7 @@
package com.velocitypowered.api.permission;
import net.kyori.adventure.permission.PermissionChecker;
+import net.kyori.adventure.util.TriState;
/**
* Represents a object that has a set of queryable permissions.
@@ -21,7 +22,7 @@ public interface PermissionSubject {
* @return whether or not the subject has the permission
*/
default boolean hasPermission(String permission) {
- return getPermissionValue(permission).asBoolean();
+ return this.getPermissionChecker().test(permission);
}
/**
@@ -30,14 +31,14 @@ public interface PermissionSubject {
* @param permission the permission
* @return the value the permission is set to
*/
- Tristate getPermissionValue(String permission);
+ default TriState getPermissionValue(String permission) {
+ return this.getPermissionChecker().value(permission);
+ }
/**
* Gets the permission checker for the subject.
*
* @return subject's permission checker
*/
- default PermissionChecker getPermissionChecker() {
- return permission -> getPermissionValue(permission).toAdventureTriState();
- }
+ PermissionChecker getPermissionChecker();
}
diff --git a/api/src/main/java/com/velocitypowered/api/permission/Tristate.java b/api/src/main/java/com/velocitypowered/api/permission/Tristate.java
deleted file mode 100644
index ddbe26a86..000000000
--- a/api/src/main/java/com/velocitypowered/api/permission/Tristate.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2018-2023 Velocity Contributors
- *
- * The Velocity API is licensed under the terms of the MIT License. For more details,
- * reference the LICENSE file in the api top-level directory.
- */
-
-package com.velocitypowered.api.permission;
-
-import java.util.Optional;
-import net.kyori.adventure.util.TriState;
-import org.checkerframework.checker.nullness.qual.Nullable;
-
-/**
- * Represents three different states of a setting.
- *
- * Possible values:
- *
- *
- * - {@link #TRUE} - a positive setting
- * - {@link #FALSE} - a negative (negated) setting
- * - {@link #UNDEFINED} - a non-existent setting
- *
- */
-public enum Tristate {
-
- /**
- * A value indicating a positive setting.
- */
- TRUE(true),
-
- /**
- * A value indicating a negative (negated) setting.
- */
- FALSE(false),
-
- /**
- * A value indicating a non-existent setting.
- */
- UNDEFINED(false);
-
- /**
- * Returns a {@link Tristate} from a boolean.
- *
- * @param val the boolean value
- * @return {@link #TRUE} or {@link #FALSE}, if the value is true
or
- * false
, respectively.
- */
- public static Tristate fromBoolean(boolean val) {
- return val ? TRUE : FALSE;
- }
-
- /**
- * Returns a {@link Tristate} from a nullable boolean.
- *
- * Unlike {@link #fromBoolean(boolean)}, this method returns {@link #UNDEFINED}
- * if the value is null.
- *
- * @param val the boolean value
- * @return {@link #UNDEFINED}, {@link #TRUE} or {@link #FALSE}, if the value is null
,
- * true
or false
, respectively.
- */
- public static Tristate fromNullableBoolean(@Nullable Boolean val) {
- if (val == null) {
- return UNDEFINED;
- }
- return val ? TRUE : FALSE;
- }
-
- /**
- * Returns a {@link Tristate} from an {@link Optional}.
- *
- * Unlike {@link #fromBoolean(boolean)}, this method returns {@link #UNDEFINED}
- * if the value is empty.
- *
- * @param val the optional boolean value
- * @return {@link #UNDEFINED}, {@link #TRUE} or {@link #FALSE}, if the value is empty,
- * true
or false
, respectively.
- */
- public static Tristate fromOptionalBoolean(Optional val) {
- return val.map(Tristate::fromBoolean).orElse(UNDEFINED);
- }
-
-
- private final boolean booleanValue;
-
- Tristate(boolean booleanValue) {
- this.booleanValue = booleanValue;
- }
-
- /**
- * Returns the value of the Tristate as a boolean.
- *
- * A value of {@link #UNDEFINED} converts to false.
- *
- * @return a boolean representation of the Tristate.
- */
- public boolean asBoolean() {
- return this.booleanValue;
- }
-
- /**
- * Returns the equivalent Adventure {@link TriState}.
- *
- * @return equivalent Adventure TriState
- */
- public TriState toAdventureTriState() {
- if (this == Tristate.TRUE) {
- return TriState.TRUE;
- } else if (this == Tristate.UNDEFINED) {
- return TriState.NOT_SET;
- } else if (this == Tristate.FALSE) {
- return TriState.FALSE;
- } else {
- throw new IllegalArgumentException();
- }
- }
-}
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/GlistCommand.java b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/GlistCommand.java
index 5d2f19fea..5ad86511c 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/GlistCommand.java
+++ b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/GlistCommand.java
@@ -28,7 +28,6 @@ import com.mojang.brigadier.tree.ArgumentCommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode;
import com.velocitypowered.api.command.BrigadierCommand;
import com.velocitypowered.api.command.CommandSource;
-import com.velocitypowered.api.permission.Tristate;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.server.RegisteredServer;
@@ -39,6 +38,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TranslatableComponent;
import net.kyori.adventure.text.format.NamedTextColor;
+import net.kyori.adventure.util.TriState;
/**
* Implements the Velocity default {@code /glist} command.
@@ -60,7 +60,7 @@ public class GlistCommand {
LiteralCommandNode totalNode = LiteralArgumentBuilder
.literal("glist")
.requires(source ->
- source.getPermissionValue("velocity.command.glist") == Tristate.TRUE)
+ source.getPermissionValue("velocity.command.glist") == TriState.TRUE)
.executes(this::totalCount)
.build();
ArgumentCommandNode serverNode = RequiredArgumentBuilder
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/ServerCommand.java b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/ServerCommand.java
index 1064f0794..a1bb1e20f 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/ServerCommand.java
+++ b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/ServerCommand.java
@@ -22,7 +22,6 @@ import static net.kyori.adventure.text.event.HoverEvent.showText;
import com.google.common.collect.ImmutableList;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.command.SimpleCommand;
-import com.velocitypowered.api.permission.Tristate;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.ServerConnection;
@@ -37,6 +36,7 @@ import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TranslatableComponent;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.NamedTextColor;
+import net.kyori.adventure.util.TriState;
/**
* Implements Velocity's {@code /server} command.
@@ -161,6 +161,6 @@ public class ServerCommand implements SimpleCommand {
@Override
public boolean hasPermission(final SimpleCommand.Invocation invocation) {
- return invocation.source().getPermissionValue("velocity.command.server") != Tristate.FALSE;
+ return invocation.source().getPermissionValue("velocity.command.server") != TriState.FALSE;
}
}
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java
index 93b27243b..2228f3d7e 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java
+++ b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java
@@ -24,7 +24,6 @@ import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.command.SimpleCommand;
-import com.velocitypowered.api.permission.Tristate;
import com.velocitypowered.api.plugin.PluginContainer;
import com.velocitypowered.api.plugin.PluginDescription;
import com.velocitypowered.api.proxy.ProxyServer;
@@ -59,6 +58,7 @@ import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
+import net.kyori.adventure.util.TriState;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull;
@@ -200,7 +200,7 @@ public class VelocityCommand implements SimpleCommand {
@Override
public boolean hasPermission(final CommandSource source, final String @NonNull [] args) {
- return source.getPermissionValue("velocity.command.reload") == Tristate.TRUE;
+ return source.getPermissionValue("velocity.command.reload") == TriState.TRUE;
}
}
@@ -255,7 +255,7 @@ public class VelocityCommand implements SimpleCommand {
@Override
public boolean hasPermission(final CommandSource source, final String @NonNull [] args) {
- return source.getPermissionValue("velocity.command.info") != Tristate.FALSE;
+ return source.getPermissionValue("velocity.command.info") != TriState.FALSE;
}
}
@@ -336,7 +336,7 @@ public class VelocityCommand implements SimpleCommand {
@Override
public boolean hasPermission(final CommandSource source, final String @NonNull [] args) {
- return source.getPermissionValue("velocity.command.plugins") == Tristate.TRUE;
+ return source.getPermissionValue("velocity.command.plugins") == TriState.TRUE;
}
}
@@ -405,7 +405,7 @@ public class VelocityCommand implements SimpleCommand {
@Override
public boolean hasPermission(final CommandSource source, final String @NonNull [] args) {
- return source.getPermissionValue("velocity.command.plugins") == Tristate.TRUE;
+ return source.getPermissionValue("velocity.command.plugins") == TriState.TRUE;
}
}
@@ -481,7 +481,7 @@ public class VelocityCommand implements SimpleCommand {
@Override
public boolean hasPermission(CommandSource source, String @NonNull [] args) {
- return source.getPermissionValue("velocity.command.heap") == Tristate.TRUE;
+ return source.getPermissionValue("velocity.command.heap") == TriState.TRUE;
}
}
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java
index 603cf686a..15caa5567 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java
+++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java
@@ -27,7 +27,6 @@ import com.velocitypowered.api.event.permission.PermissionsSetupEvent;
import com.velocitypowered.api.event.player.GameProfileRequestEvent;
import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent;
import com.velocitypowered.api.network.ProtocolVersion;
-import com.velocitypowered.api.permission.PermissionFunction;
import com.velocitypowered.api.proxy.crypto.IdentifiedKey;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.util.GameProfile;
@@ -47,6 +46,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
+import net.kyori.adventure.permission.PermissionChecker;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.apache.logging.log4j.LogManager;
@@ -111,14 +111,16 @@ public class AuthSessionHandler implements MinecraftSessionHandler {
.thenAcceptAsync(event -> {
if (!mcConnection.isClosed()) {
// wait for permissions to load, then set the players permission function
- final PermissionFunction function = event.createFunction(player);
- if (function == null) {
- logger.error("A plugin permission provider {} provided an invalid permission "
- + "function for player {}. This is a bug in the plugin, not in "
- + "Velocity. Falling back to the default permission function.",
- event.getProvider().getClass().getName(), player.getUsername());
+ final PermissionChecker checker = event.createChecker(player);
+ if (checker == null) {
+ logger.error(
+ "A plugin permission provider {} provided an invalid permission function"
+ + " for player {}. This is a bug in the plugin, not in Velocity. Falling"
+ + " back to the default permission function.",
+ event.getProvider().getClass().getName(),
+ player.getUsername());
} else {
- player.setPermissionFunction(function);
+ player.setPermissionChecker(checker);
}
startLoginCompletion(player);
}
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java
index 8c3699402..309c9cb2e 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java
+++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java
@@ -35,9 +35,7 @@ import com.velocitypowered.api.event.player.PlayerResourcePackStatusEvent;
import com.velocitypowered.api.event.player.PlayerSettingsChangedEvent;
import com.velocitypowered.api.event.player.ServerPreConnectEvent;
import com.velocitypowered.api.network.ProtocolVersion;
-import com.velocitypowered.api.permission.PermissionFunction;
import com.velocitypowered.api.permission.PermissionProvider;
-import com.velocitypowered.api.permission.Tristate;
import com.velocitypowered.api.proxy.ConnectionRequestBuilder;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ServerConnection;
@@ -79,7 +77,6 @@ import com.velocitypowered.proxy.tablist.VelocityTabList;
import com.velocitypowered.proxy.tablist.VelocityTabListLegacy;
import com.velocitypowered.proxy.util.ClosestLocaleMatcher;
import com.velocitypowered.proxy.util.DurationUtils;
-import com.velocitypowered.proxy.util.TranslatableMapper;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import java.net.InetSocketAddress;
@@ -102,6 +99,9 @@ import net.kyori.adventure.platform.facet.FacetPointers;
import net.kyori.adventure.platform.facet.FacetPointers.Type;
import net.kyori.adventure.pointer.Pointers;
import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.KeybindComponent;
+import net.kyori.adventure.text.TranslatableComponent;
+import net.kyori.adventure.text.flattener.ComponentFlattener;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
@@ -109,6 +109,7 @@ import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import net.kyori.adventure.title.Title.Times;
import net.kyori.adventure.title.TitlePart;
import net.kyori.adventure.translation.GlobalTranslator;
+import net.kyori.adventure.util.TriState;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@@ -122,10 +123,15 @@ import org.jetbrains.annotations.NotNull;
public class ConnectedPlayer implements MinecraftConnectionAssociation, Player, KeyIdentifiable,
VelocityInboundConnection {
- private static final int MAX_PLUGIN_CHANNELS = 1024;
private static final PlainTextComponentSerializer PASS_THRU_TRANSLATE =
- PlainTextComponentSerializer.builder().flattener(TranslatableMapper.FLATTENER).build();
- static final PermissionProvider DEFAULT_PERMISSIONS = s -> PermissionFunction.ALWAYS_UNDEFINED;
+ PlainTextComponentSerializer.builder()
+ .flattener(ComponentFlattener.basic().toBuilder()
+ .mapper(KeybindComponent.class, c -> "")
+ .mapper(TranslatableComponent.class, TranslatableComponent::key)
+ .build())
+ .build();
+ static final PermissionProvider DEFAULT_PERMISSIONS =
+ s -> PermissionChecker.always(TriState.NOT_SET);
private static final Logger logger = LogManager.getLogger(ConnectedPlayer.class);
@@ -136,7 +142,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player,
private final MinecraftConnection connection;
private final @Nullable InetSocketAddress virtualHost;
private GameProfile profile;
- private PermissionFunction permissionFunction;
+ private PermissionChecker permissionChecker;
private int tryIndex = 0;
private long ping = -1;
private final boolean onlineMode;
@@ -155,13 +161,14 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player,
private final Queue outstandingResourcePacks = new ArrayDeque<>();
private @Nullable ResourcePackInfo pendingResourcePack;
private @Nullable ResourcePackInfo appliedResourcePack;
- private final @NotNull Pointers pointers =
- Player.super.pointers().toBuilder().withDynamic(Identity.UUID, this::getUniqueId)
- .withDynamic(Identity.NAME, this::getUsername)
- .withDynamic(Identity.DISPLAY_NAME, () -> Component.text(this.getUsername()))
- .withDynamic(Identity.LOCALE, this::getEffectiveLocale)
- .withStatic(PermissionChecker.POINTER, getPermissionChecker())
- .withStatic(FacetPointers.TYPE, Type.PLAYER).build();
+ private final @NotNull Pointers pointers = Player.super.pointers().toBuilder()
+ .withDynamic(Identity.UUID, this::getUniqueId)
+ .withDynamic(Identity.NAME, this::getUsername)
+ .withDynamic(Identity.DISPLAY_NAME, () -> Component.text(this.getUsername()))
+ .withDynamic(Identity.LOCALE, this::getEffectiveLocale)
+ .withDynamic(PermissionChecker.POINTER, () -> this.permissionChecker)
+ .withStatic(FacetPointers.TYPE, Type.PLAYER)
+ .build();
private @Nullable String clientBrand;
private @Nullable Locale effectiveLocale;
private @Nullable IdentifiedKey playerKey;
@@ -176,7 +183,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player,
this.profile = profile;
this.connection = connection;
this.virtualHost = virtualHost;
- this.permissionFunction = PermissionFunction.ALWAYS_UNDEFINED;
+ this.permissionChecker = PermissionChecker.always(TriState.NOT_SET);
this.connectionPhase = connection.getType().getInitialClientPhase();
this.onlineMode = onlineMode;
@@ -318,8 +325,8 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player,
return Optional.ofNullable(virtualHost);
}
- void setPermissionFunction(PermissionFunction permissionFunction) {
- this.permissionFunction = permissionFunction;
+ void setPermissionChecker(PermissionChecker permissionChecker) {
+ this.permissionChecker = permissionChecker;
}
@Override
@@ -913,8 +920,8 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player,
}
@Override
- public Tristate getPermissionValue(String permission) {
- return permissionFunction.getPermissionValue(permission);
+ public PermissionChecker getPermissionChecker() {
+ return this.permissionChecker;
}
@Override
diff --git a/proxy/src/main/java/com/velocitypowered/proxy/console/VelocityConsole.java b/proxy/src/main/java/com/velocitypowered/proxy/console/VelocityConsole.java
index fe360d4d6..66a518d31 100644
--- a/proxy/src/main/java/com/velocitypowered/proxy/console/VelocityConsole.java
+++ b/proxy/src/main/java/com/velocitypowered/proxy/console/VelocityConsole.java
@@ -17,11 +17,7 @@
package com.velocitypowered.proxy.console;
-import static com.velocitypowered.api.permission.PermissionFunction.ALWAYS_TRUE;
-
import com.velocitypowered.api.event.permission.PermissionsSetupEvent;
-import com.velocitypowered.api.permission.PermissionFunction;
-import com.velocitypowered.api.permission.Tristate;
import com.velocitypowered.api.proxy.ConsoleCommandSource;
import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.util.ClosestLocaleMatcher;
@@ -36,6 +32,7 @@ import net.kyori.adventure.pointer.Pointers;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
+import net.kyori.adventure.util.TriState;
import net.minecrell.terminalconsole.SimpleTerminalConsole;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
@@ -58,7 +55,7 @@ public final class VelocityConsole extends SimpleTerminalConsole implements Cons
.logger(VelocityConsole.class);
private final VelocityServer server;
- private PermissionFunction permissionFunction = ALWAYS_TRUE;
+ private PermissionChecker permissionChecker = PermissionChecker.always(TriState.TRUE);
private final @NotNull Pointers pointers = ConsoleCommandSource.super.pointers().toBuilder()
.withDynamic(PermissionChecker.POINTER, this::getPermissionChecker)
.withDynamic(Identity.LOCALE, () -> ClosestLocaleMatcher.INSTANCE
@@ -77,8 +74,8 @@ public final class VelocityConsole extends SimpleTerminalConsole implements Cons
}
@Override
- public @NonNull Tristate getPermissionValue(@NonNull String permission) {
- return this.permissionFunction.getPermissionValue(permission);
+ public PermissionChecker getPermissionChecker() {
+ return this.permissionChecker;
}
/**
@@ -93,16 +90,17 @@ public final class VelocityConsole extends SimpleTerminalConsole implements Cons
* Sets up permissions for the console.
*/
public void setupPermissions() {
- PermissionsSetupEvent event = new PermissionsSetupEvent(this, s -> ALWAYS_TRUE);
+ PermissionsSetupEvent event = new PermissionsSetupEvent(
+ this, s -> PermissionChecker.always(TriState.TRUE));
// we can safely block here, this is before any listeners fire
- this.permissionFunction = this.server.getEventManager().fire(event).join().createFunction(this);
- if (this.permissionFunction == null) {
+ this.permissionChecker = this.server.getEventManager().fire(event).join().createChecker(this);
+ if (this.permissionChecker == null) {
logger.error(
"A plugin permission provider {} provided an invalid permission function"
+ " for the console. This is a bug in the plugin, not in Velocity. Falling"
+ " back to the default permission function.",
event.getProvider().getClass().getName());
- this.permissionFunction = ALWAYS_TRUE;
+ this.permissionChecker = PermissionChecker.always(TriState.TRUE);
}
}
diff --git a/proxy/src/test/java/com/velocitypowered/proxy/command/CommandTestSuite.java b/proxy/src/test/java/com/velocitypowered/proxy/command/CommandTestSuite.java
index c8e17d0f8..f2d78e509 100644
--- a/proxy/src/test/java/com/velocitypowered/proxy/command/CommandTestSuite.java
+++ b/proxy/src/test/java/com/velocitypowered/proxy/command/CommandTestSuite.java
@@ -25,12 +25,12 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.velocitypowered.api.command.CommandSource;
-import com.velocitypowered.api.permission.Tristate;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.proxy.event.MockEventManager;
import com.velocitypowered.proxy.event.VelocityEventManager;
import java.util.Arrays;
import java.util.Collection;
+import net.kyori.adventure.util.TriState;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
@@ -66,7 +66,7 @@ abstract class CommandTestSuite {
final void assertPlayerSuggestions(final String input, final String... expectedSuggestions) {
final var player = mock(Player.class);
- when(player.getPermissionValue(any())).thenReturn(Tristate.UNDEFINED);
+ when(player.getPermissionValue(any())).thenReturn(TriState.NOT_SET);
final var actual = manager.offerSuggestions(player, input).join();
assertEquals(Arrays.asList(expectedSuggestions), actual);
}
diff --git a/proxy/src/test/java/com/velocitypowered/proxy/command/MockCommandSource.java b/proxy/src/test/java/com/velocitypowered/proxy/command/MockCommandSource.java
index 6fc48ffc0..b1503a5e5 100644
--- a/proxy/src/test/java/com/velocitypowered/proxy/command/MockCommandSource.java
+++ b/proxy/src/test/java/com/velocitypowered/proxy/command/MockCommandSource.java
@@ -18,7 +18,8 @@
package com.velocitypowered.proxy.command;
import com.velocitypowered.api.command.CommandSource;
-import com.velocitypowered.api.permission.Tristate;
+import net.kyori.adventure.permission.PermissionChecker;
+import net.kyori.adventure.util.TriState;
/**
* A fake {@link CommandSource}.
@@ -28,7 +29,7 @@ public class MockCommandSource implements CommandSource {
public static final CommandSource INSTANCE = new MockCommandSource();
@Override
- public Tristate getPermissionValue(final String permission) {
- return Tristate.UNDEFINED;
+ public PermissionChecker getPermissionChecker() {
+ return PermissionChecker.always(TriState.NOT_SET);
}
}