Minestom/src/main/java/net/minestom/server/listener/ChatMessageListener.java

81 lines
3.1 KiB
Java
Raw Normal View History

2020-04-24 03:25:58 +02:00
package net.minestom.server.listener;
2020-04-24 03:25:58 +02:00
import net.minestom.server.MinecraftServer;
import net.minestom.server.chat.*;
2020-04-24 03:25:58 +02:00
import net.minestom.server.command.CommandManager;
import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerChatEvent;
2020-07-21 18:48:15 +02:00
import net.minestom.server.network.ConnectionManager;
2020-04-24 03:25:58 +02:00
import net.minestom.server.network.packet.client.play.ClientChatMessagePacket;
2020-06-30 01:25:23 +02:00
import net.minestom.server.network.packet.server.play.ChatMessagePacket;
import net.minestom.server.utils.PacketUtils;
import org.apache.commons.lang3.StringUtils;
2020-05-28 19:15:55 +02:00
import java.util.Collection;
2020-02-11 16:48:06 +01:00
import java.util.function.Function;
public class ChatMessageListener {
2020-07-21 18:48:15 +02:00
private static final CommandManager COMMAND_MANAGER = MinecraftServer.getCommandManager();
private static final ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager();
public static void listener(ClientChatMessagePacket packet, Player player) {
2020-06-22 23:25:00 +02:00
String message = packet.message;
2020-02-11 16:48:06 +01:00
final String cmdPrefix = CommandManager.COMMAND_PREFIX;
2020-04-05 10:15:21 +02:00
if (message.startsWith(cmdPrefix)) {
// The message is a command
message = message.replaceFirst(cmdPrefix, "");
COMMAND_MANAGER.execute(player, message);
2020-04-05 10:15:21 +02:00
// Do not call chat event
return;
}
2020-07-21 18:48:15 +02:00
final Collection<Player> players = CONNECTION_MANAGER.getOnlinePlayers();
2020-05-28 19:15:55 +02:00
PlayerChatEvent playerChatEvent = new PlayerChatEvent(player, players, message);
2020-02-11 16:48:06 +01:00
// Call the event
player.callCancellableEvent(PlayerChatEvent.class, playerChatEvent, () -> {
final Function<PlayerChatEvent, JsonMessage> formatFunction = playerChatEvent.getChatFormatFunction();
2020-02-11 16:48:06 +01:00
JsonMessage textObject;
2020-05-28 19:15:55 +02:00
if (formatFunction != null) {
// Custom format
textObject = formatFunction.apply(playerChatEvent);
} else {
// Default format
textObject = buildDefaultChatMessage(playerChatEvent);
}
2020-02-11 16:48:06 +01:00
2020-07-21 18:48:15 +02:00
final Collection<Player> recipients = playerChatEvent.getRecipients();
2020-06-30 01:25:23 +02:00
if (!recipients.isEmpty()) {
2020-07-21 18:48:15 +02:00
final String jsonMessage = textObject.toString();
2020-06-30 01:25:23 +02:00
// Send the message with the correct player UUID
ChatMessagePacket chatMessagePacket =
new ChatMessagePacket(jsonMessage, ChatMessagePacket.Position.CHAT, player.getUuid());
PacketUtils.sendGroupedPacket(recipients, chatMessagePacket);
2020-02-11 16:48:06 +01:00
}
});
2019-08-27 05:23:25 +02:00
}
2020-06-22 23:25:00 +02:00
private static RichMessage buildDefaultChatMessage(PlayerChatEvent chatEvent) {
final String username = chatEvent.getPlayer().getUsername();
2020-05-28 19:15:55 +02:00
2020-07-21 18:48:15 +02:00
final ColoredText usernameText = ColoredText.of(String.format("<%s>", username));
2020-05-28 19:15:55 +02:00
2020-10-29 22:52:07 +01:00
return RichMessage.of(usernameText)
.setHoverEvent(ChatHoverEvent.showText("Click to send a message to " + username))
.setClickEvent(ChatClickEvent.suggestCommand("/msg " + username + StringUtils.SPACE))
.append(ColoredText.of(StringUtils.SPACE + chatEvent.getMessage()));
2020-05-28 19:15:55 +02:00
}
}