diff --git a/api/src/main/java/com/velocitypowered/api/proxy/ProxyServer.java b/api/src/main/java/com/velocitypowered/api/proxy/ProxyServer.java index 7cde5a176..64584c0d9 100644 --- a/api/src/main/java/com/velocitypowered/api/proxy/ProxyServer.java +++ b/api/src/main/java/com/velocitypowered/api/proxy/ProxyServer.java @@ -76,6 +76,22 @@ public interface ProxyServer { */ Collection getAllServers(); + /** + * Matches all {@link Player}s whose names start with the provided partial name. + * + * @param partialName the partial name to check for + * @return a collection of mathed {@link Player}s + */ + Collection matchPlayer(String partialName); + + /** + * Matches all {@link RegisteredServer}s whose names start with the provided partial name. + * + * @param partialName the partial name to check for + * @return a collection of mathed {@link RegisteredServer}s + */ + Collection matchServer(String partialName); + /** * Registers a server with this proxy. A server with this name should not already exist. * diff --git a/proxy/src/main/java/com/velocitypowered/proxy/VelocityServer.java b/proxy/src/main/java/com/velocitypowered/proxy/VelocityServer.java index b087a71da..eb3ce47b4 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/VelocityServer.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/VelocityServer.java @@ -50,13 +50,16 @@ import java.nio.file.Paths; import java.security.KeyPair; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; import net.kyori.text.Component; import net.kyori.text.TextComponent; import net.kyori.text.serializer.GsonComponentSerializer; @@ -443,6 +446,34 @@ public class VelocityServer implements ProxyServer { } } + @Override + public Collection matchPlayer(String partialName) { + Objects.requireNonNull(partialName); + + Optional exactMatch = getPlayer(partialName); + if (exactMatch.isPresent()) { + return Collections.singleton(exactMatch.get()); + } + + return getAllPlayers().stream().filter(p -> p.getUsername() + .regionMatches(true, 0, partialName, 0, partialName.length())) + .collect(Collectors.toList()); + } + + @Override + public Collection matchServer(String partialName) { + Objects.requireNonNull(partialName); + + Optional exactMatch = getServer(partialName); + if (exactMatch.isPresent()) { + return Collections.singleton(exactMatch.get()); + } + + return getAllServers().stream().filter(s -> s.getServerInfo().getName() + .regionMatches(true, 0, partialName, 0, partialName.length())) + .collect(Collectors.toList()); + } + @Override public Collection getAllPlayers() { return ImmutableList.copyOf(connectionsByUuid.values());