Merge remote-tracking branch 'upstream/dev/3.0.0' into update
# Conflicts: # proxy/src/main/java/com/velocitypowered/proxy/network/TransportType.java
This commit is contained in:
@@ -148,4 +148,59 @@ public interface ProxyConfig {
|
||||
* @return read timeout (in milliseconds)
|
||||
*/
|
||||
int getReadTimeout();
|
||||
|
||||
/**
|
||||
* Get the rate limit for how fast a player can execute commands.
|
||||
*
|
||||
* @return the command rate limit (in milliseconds)
|
||||
*/
|
||||
int getCommandRatelimit();
|
||||
|
||||
/**
|
||||
* Get whether we should forward commands to the backend if the player is rate limited.
|
||||
*
|
||||
* @return whether to forward commands if rate limited
|
||||
*/
|
||||
boolean isForwardCommandsIfRateLimited();
|
||||
|
||||
/**
|
||||
* Get the kick limit for commands that are rate limited.
|
||||
* If this limit is 0 or less, the player will be not be kicked.
|
||||
*
|
||||
* @return the rate limited command rate limit
|
||||
*/
|
||||
int getKickAfterRateLimitedCommands();
|
||||
|
||||
/**
|
||||
* Get whether the proxy should kick players who are command rate limited.
|
||||
*
|
||||
* @return whether to kick players who are rate limited
|
||||
*/
|
||||
default boolean isKickOnCommandRateLimit() {
|
||||
return getKickAfterRateLimitedCommands() > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the rate limit for how fast a player can tab complete.
|
||||
*
|
||||
* @return the tab complete rate limit (in milliseconds)
|
||||
*/
|
||||
int getTabCompleteRatelimit();
|
||||
|
||||
/**
|
||||
* Get the kick limit for tab completes that are rate limited.
|
||||
* If this limit is 0 or less, the player will be not be kicked.
|
||||
*
|
||||
* @return the rate limited command rate limit
|
||||
*/
|
||||
int getKickAfterRateLimitedTabCompletes();
|
||||
|
||||
/**
|
||||
* Get whether the proxy should kick players who are tab complete rate limited.
|
||||
*
|
||||
* @return whether to kick players who are rate limited
|
||||
*/
|
||||
default boolean isKickOnTabCompleteRateLimit() {
|
||||
return getKickAfterRateLimitedTabCompletes() > 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@ import static com.google.common.base.Preconditions.checkArgument;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import java.util.Objects;
|
||||
import java.util.regex.Pattern;
|
||||
import net.kyori.adventure.key.Key;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
@@ -21,8 +20,6 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
*/
|
||||
public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
||||
|
||||
private static final Pattern VALID_IDENTIFIER_REGEX = Pattern.compile("[a-z0-9/\\-_]*");
|
||||
|
||||
private final String namespace;
|
||||
private final String name;
|
||||
|
||||
@@ -39,7 +36,7 @@ public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
||||
* @return a new channel identifier
|
||||
*/
|
||||
public static MinecraftChannelIdentifier forDefaultNamespace(String name) {
|
||||
return new MinecraftChannelIdentifier("minecraft", name);
|
||||
return new MinecraftChannelIdentifier(Key.MINECRAFT_NAMESPACE, name);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -52,14 +49,10 @@ public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
||||
public static MinecraftChannelIdentifier create(String namespace, String name) {
|
||||
checkArgument(!Strings.isNullOrEmpty(namespace), "namespace is null or empty");
|
||||
checkArgument(name != null, "namespace is null or empty");
|
||||
checkArgument(VALID_IDENTIFIER_REGEX.matcher(namespace).matches(),
|
||||
"namespace is not valid, must match: %s got %s",
|
||||
VALID_IDENTIFIER_REGEX.toString(),
|
||||
namespace);
|
||||
checkArgument(VALID_IDENTIFIER_REGEX.matcher(name).matches(),
|
||||
"name is not valid, must match: %s got %s",
|
||||
VALID_IDENTIFIER_REGEX.toString(),
|
||||
name);
|
||||
checkArgument(Key.parseableNamespace(namespace),
|
||||
"namespace is not valid, must match: [a-z0-9_.-] got %s", namespace);
|
||||
checkArgument(Key.parseableValue(name),
|
||||
"name is not valid, must match: [a-z0-9/._-] got %s", name);
|
||||
return new MinecraftChannelIdentifier(namespace, name);
|
||||
}
|
||||
|
||||
@@ -72,10 +65,9 @@ public final class MinecraftChannelIdentifier implements ChannelIdentifier {
|
||||
public static MinecraftChannelIdentifier from(String identifier) {
|
||||
int colonPos = identifier.indexOf(':');
|
||||
if (colonPos == -1) {
|
||||
throw new IllegalArgumentException("Identifier does not contain a colon.");
|
||||
}
|
||||
if (colonPos + 1 == identifier.length()) {
|
||||
throw new IllegalArgumentException("Identifier is empty.");
|
||||
return create(Key.MINECRAFT_NAMESPACE, identifier);
|
||||
} else if (colonPos == 0) {
|
||||
return create(Key.MINECRAFT_NAMESPACE, identifier.substring(1));
|
||||
}
|
||||
String namespace = identifier.substring(0, colonPos);
|
||||
String name = identifier.substring(colonPos + 1);
|
||||
|
||||
@@ -517,6 +517,10 @@ public final class ServerPing {
|
||||
*/
|
||||
public static final class SamplePlayer {
|
||||
|
||||
public static final SamplePlayer ANONYMOUS = new SamplePlayer(
|
||||
"Anonymous Player",
|
||||
new UUID(0L, 0L)
|
||||
);
|
||||
private final String name;
|
||||
private final UUID id;
|
||||
|
||||
|
||||
@@ -47,17 +47,25 @@ class MinecraftChannelIdentifierTest {
|
||||
create("velocity", "test/test2");
|
||||
}
|
||||
|
||||
@Test
|
||||
void fromIdentifierDefaultNamespace() {
|
||||
assertEquals("minecraft", from("test").getNamespace());
|
||||
assertEquals("minecraft", from(":test").getNamespace());
|
||||
}
|
||||
|
||||
@Test
|
||||
void fromIdentifierAllowsEmptyName() {
|
||||
from("minecraft:");
|
||||
from(":");
|
||||
from("");
|
||||
}
|
||||
|
||||
@Test
|
||||
void fromIdentifierThrowsOnBadValues() {
|
||||
assertAll(
|
||||
() -> assertThrows(IllegalArgumentException.class, () -> from("")),
|
||||
() -> assertThrows(IllegalArgumentException.class, () -> from(":")),
|
||||
() -> assertThrows(IllegalArgumentException.class, () -> from(":a")),
|
||||
() -> assertThrows(IllegalArgumentException.class, () -> from("a:")),
|
||||
() -> assertThrows(IllegalArgumentException.class, () -> from("hello:$$$$$$")),
|
||||
() -> assertThrows(IllegalArgumentException.class, () -> from("he/llo:wor/ld")),
|
||||
() -> assertThrows(IllegalArgumentException.class, () -> from("hello::"))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user