From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Aikar Date: Thu, 3 Mar 2016 01:17:12 -0600 Subject: [PATCH] Improve Player chat API handling Properly split up the chat and command handling to reflect the server now having separate packets for both, and the client always using the correct packet. Text from a chat packet should never be parsed into a command, even if it starts with the `/` character. Add a missing async catcher and improve Spigot's async catcher error message. == AT == public net.minecraft.server.network.ServerGamePacketListenerImpl isChatMessageIllegal(Ljava/lang/String;)Z Co-authored-by: Jake Potrebic Co-authored-by: SoSeDiK diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java index 70fe4e973f41c2e5b12c0d96be418dd40e69c0f2..adef64b955170dc00c75c06bf0f41a09b2516520 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -1926,7 +1926,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } OutgoingChatMessage outgoing = OutgoingChatMessage.create(original); - if (!async && s.startsWith("/")) { + if (false && !async && s.startsWith("/")) { // Paper - Don't handle commands in chat logic this.handleCommand(s); } else if (this.player.getChatVisibility() == ChatVisiblity.SYSTEM) { // Do nothing, this is coming from a plugin @@ -2010,7 +2010,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } } - private void handleCommand(String s) { + public void handleCommand(String s) { // Paper - private -> public + org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher co.aikar.timings.MinecraftTimings.playerCommandTimer.startTiming(); // Paper if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 6f66f8514170e5686ed9410d1c755eeef5b61f8a..56fb2dfc920bde3554706fa218913af448a99fd9 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -889,7 +889,7 @@ public final class CraftServer implements Server { public boolean dispatchCommand(CommandSender sender, String commandLine) { Preconditions.checkArgument(sender != null, "sender cannot be null"); Preconditions.checkArgument(commandLine != null, "commandLine cannot be null"); - org.spigotmc.AsyncCatcher.catchOp("command dispatch"); // Spigot + org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + commandLine); // Spigot // Paper - Include command in error message if (this.commandMap.dispatch(sender, commandLine)) { return true; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index d0448d310fde607a006acf37e86cd3eede93a2ba..4c4219ffe5c172d263106f522ea3ec7ba0d7dfad 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -494,7 +494,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (this.getHandle().connection == null) return; - this.getHandle().connection.chat(msg, PlayerChatMessage.system(msg), false); + // Paper start - Improve chat handling + if (ServerGamePacketListenerImpl.isChatMessageIllegal(msg)) { + this.getHandle().connection.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters")); + } else { + if (msg.startsWith("/")) { + this.getHandle().connection.handleCommand(msg); + } else { + final PlayerChatMessage playerChatMessage = PlayerChatMessage.system(msg).withResult(new net.minecraft.network.chat.ChatDecorator.ModernResult(Component.literal(msg), true, false)); + // TODO chat decorating + // TODO text filtering + this.getHandle().connection.chat(msg, playerChatMessage, false); + } + } + // Paper end } @Override