diff --git a/common/src/main/java/com/viaversion/viaversion/commands/ViaCommandHandler.java b/common/src/main/java/com/viaversion/viaversion/commands/ViaCommandHandler.java
index 38e4d79e7..bc7bd4ff8 100644
--- a/common/src/main/java/com/viaversion/viaversion/commands/ViaCommandHandler.java
+++ b/common/src/main/java/com/viaversion/viaversion/commands/ViaCommandHandler.java
@@ -30,6 +30,7 @@ import com.viaversion.viaversion.commands.defaultsubs.DumpSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.ListSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.PPSSubCmd;
import com.viaversion.viaversion.commands.defaultsubs.ReloadSubCmd;
+import com.viaversion.viaversion.commands.defaultsubs.PlayerSubCmd;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -194,5 +195,6 @@ public abstract class ViaCommandHandler implements ViaVersionCommand {
registerSubCommand(new DontBugMeSubCmd());
registerSubCommand(new AutoTeamSubCmd());
registerSubCommand(new ReloadSubCmd());
+ registerSubCommand(new PlayerSubCmd());
}
}
diff --git a/common/src/main/java/com/viaversion/viaversion/commands/defaultsubs/PlayerSubCmd.java b/common/src/main/java/com/viaversion/viaversion/commands/defaultsubs/PlayerSubCmd.java
new file mode 100644
index 000000000..8f309d024
--- /dev/null
+++ b/common/src/main/java/com/viaversion/viaversion/commands/defaultsubs/PlayerSubCmd.java
@@ -0,0 +1,75 @@
+/*
+ * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
+ * Copyright (C) 2016-2024 ViaVersion and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.viaversion.viaversion.commands.defaultsubs;
+
+import com.viaversion.viaversion.api.Via;
+import com.viaversion.viaversion.api.command.ViaCommandSender;
+import com.viaversion.viaversion.api.command.ViaSubCommand;
+import com.viaversion.viaversion.api.connection.ProtocolInfo;
+import com.viaversion.viaversion.api.connection.UserConnection;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlayerSubCmd implements ViaSubCommand {
+ @Override
+ public String name() {
+ return "player";
+ }
+
+ @Override
+ public String description() {
+ return "Shows connection information about one or all players.";
+ }
+
+ @Override
+ public String usage() {
+ return "player ";
+ }
+
+ @Override
+ public boolean execute(final ViaCommandSender sender, final String[] args) {
+ if (args.length == 0) {
+ return false;
+ }
+ for (final UserConnection connection : Via.getManager().getConnectionManager().getConnections()) {
+ final ProtocolInfo info = connection.getProtocolInfo();
+ if (args[0].equalsIgnoreCase(info.getUsername()) || args[0].equals("*")) {
+ sendMessage(sender, "&7[&6" + info.getUsername() + "&7] UUID: &2" + info.getUuid() + " &7Client-Protocol: &2" + info.protocolVersion().getName() + " &7Server-Protocol: &2" + info.serverProtocolVersion().getName());
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public List onTabComplete(final ViaCommandSender sender, final String[] args) {
+ if (args.length == 1) {
+ final String input = args[0].toLowerCase();
+
+ final List matches = new ArrayList<>();
+ for (final UserConnection connection : Via.getManager().getConnectionManager().getConnections()) {
+ final String name = connection.getProtocolInfo().getUsername();
+ if (input.isEmpty() || name.toLowerCase().startsWith(input)) {
+ matches.add(name);
+ }
+ }
+ matches.add("*");
+ return matches;
+ }
+ return ViaSubCommand.super.onTabComplete(sender, args);
+ }
+}