Improve chat API (#2329)

* improve chat api

* fix typoes

* remove click event

* make requested changes
This commit is contained in:
mudkip 2024-08-20 08:45:15 -06:00 committed by Matt Worzala
parent 000483dcde
commit 561470c82a
2 changed files with 38 additions and 60 deletions

View File

@ -1,85 +1,70 @@
package net.minestom.server.event.player; package net.minestom.server.event.player;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.CancellableEvent;
import net.minestom.server.event.trait.PlayerInstanceEvent; import net.minestom.server.event.trait.PlayerInstanceEvent;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.function.Function;
import java.util.function.Supplier;
/** /**
* Called every time a {@link Player} writes and sends something in the chat. * Called every time a {@link Player} writes and sends something in the chat.
* The event can be cancelled to do not send anything, and the format can be changed. * The event can be cancelled to not send anything, and the final message can be changed.
*/ */
public class PlayerChatEvent implements PlayerInstanceEvent, CancellableEvent { public class PlayerChatEvent implements PlayerInstanceEvent, CancellableEvent {
private final Player player; private final Player player;
private final Collection<Player> recipients; private final Collection<Player> recipients;
private String message; private final String rawMessage;
private Function<PlayerChatEvent, Component> chatFormat; private Component formattedMessage;
private boolean cancelled; private boolean cancelled;
public PlayerChatEvent(@NotNull Player player, @NotNull Collection<Player> recipients, public PlayerChatEvent(@NotNull Player player, @NotNull Collection<Player> recipients,
@NotNull Function<PlayerChatEvent, Component> defaultChatFormat, @NotNull String rawMessage) {
@NotNull String message) {
this.player = player; this.player = player;
this.recipients = new ArrayList<>(recipients); this.recipients = new ArrayList<>(recipients);
this.chatFormat = defaultChatFormat; this.rawMessage = rawMessage;
this.message = message; formattedMessage = buildDefaultChatMessage();
} }
/** /**
* Changes the chat format. * Returns the players who will receive the message.
*
* @param chatFormat the custom chat format
*/
public void setChatFormat(@NotNull Function<PlayerChatEvent, Component> chatFormat) {
this.chatFormat = chatFormat;
}
/**
* Those are the players who will receive the message.
* <p> * <p>
* It can be modified to add or remove recipient. * It can be modified to add and remove recipients.
* *
* @return a modifiable list of message targets * @return a modifiable list of the message's targets
*/ */
public @NotNull Collection<Player> getRecipients() { public @NotNull Collection<Player> getRecipients() {
return recipients; return recipients;
} }
/** /**
* Gets the message sent. * Gets the original message content sent by the player.
* *
* @return the sender's message * @return the sender's message
*/ */
public @NotNull String getMessage() { public @NotNull String getRawMessage() {
return message; return rawMessage;
} }
/** /**
* Used to change the message. * Gets the final message component that will be sent.
* *
* @param message the new message * @return the chat message component
*/ */
public void setMessage(@NotNull String message) { public Component getFormattedMessage() {
this.message = message; return formattedMessage;
} }
/** /**
* Used to retrieve the chat format for this message. * Used to change the final message component.
* <p>
* *
* @return the chat format which will be used * @param message the new message component
*/ */
public @NotNull Function<@NotNull PlayerChatEvent, @NotNull Component> getChatFormatFunction() { public void setFormattedMessage(@NotNull Component message) {
return chatFormat; formattedMessage = message;
} }
@Override @Override
@ -96,4 +81,13 @@ public class PlayerChatEvent implements PlayerInstanceEvent, CancellableEvent {
public @NotNull Player getPlayer() { public @NotNull Player getPlayer() {
return player; return player;
} }
private Component buildDefaultChatMessage() {
return Component.translatable("chat.type.text")
.arguments(
Component.text(player.getUsername())
.insertion(player.getUsername())
.hoverEvent(player),
Component.text(rawMessage));
}
} }

View File

@ -1,7 +1,5 @@
package net.minestom.server.listener; package net.minestom.server.listener;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.command.CommandManager; import net.minestom.server.command.CommandManager;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
@ -10,16 +8,12 @@ import net.minestom.server.event.player.PlayerChatEvent;
import net.minestom.server.message.ChatPosition; import net.minestom.server.message.ChatPosition;
import net.minestom.server.message.Messenger; import net.minestom.server.message.Messenger;
import net.minestom.server.network.ConnectionManager; import net.minestom.server.network.ConnectionManager;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.packet.client.play.ClientChatMessagePacket; import net.minestom.server.network.packet.client.play.ClientChatMessagePacket;
import net.minestom.server.network.packet.client.play.ClientCommandChatPacket; import net.minestom.server.network.packet.client.play.ClientCommandChatPacket;
import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
import java.util.function.Function;
public class ChatMessageListener { public class ChatMessageListener {
private static final CommandManager COMMAND_MANAGER = MinecraftServer.getCommandManager(); private static final CommandManager COMMAND_MANAGER = MinecraftServer.getCommandManager();
private static final ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager(); private static final ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager();
@ -40,30 +34,20 @@ public class ChatMessageListener {
} }
final Collection<Player> players = CONNECTION_MANAGER.getOnlinePlayers(); final Collection<Player> players = CONNECTION_MANAGER.getOnlinePlayers();
PlayerChatEvent playerChatEvent = new PlayerChatEvent(player, players, (e) -> buildDefaultChatMessage(e.getPlayer(), e.getMessage()), message); PlayerChatEvent playerChatEvent = new PlayerChatEvent(player, players, message);
// Call the event // Call the event
EventDispatcher.callCancellable(playerChatEvent, () -> { EventDispatcher.callCancellable(playerChatEvent, () -> {
final Function<PlayerChatEvent, Component> formatFunction = playerChatEvent.getChatFormatFunction();
Component textObject = formatFunction.apply(playerChatEvent);
final Collection<Player> recipients = playerChatEvent.getRecipients(); final Collection<Player> recipients = playerChatEvent.getRecipients();
if (!recipients.isEmpty()) { if (!recipients.isEmpty()) {
// delegate to the messenger to avoid sending messages we shouldn't be // delegate to the messenger to avoid sending messages we shouldn't be
Messenger.sendMessage(recipients, textObject, ChatPosition.CHAT, player.getUuid()); Messenger.sendMessage(
recipients,
playerChatEvent.getFormattedMessage(),
ChatPosition.CHAT,
player.getUuid());
} }
}); });
} }
}
private static @NotNull Component buildDefaultChatMessage(@NotNull Player player, @NotNull String message) {
final String username = player.getUsername();
return Component.translatable("chat.type.text")
.args(Component.text(username)
.insertion(username)
.clickEvent(ClickEvent.suggestCommand("/msg " + username + " "))
.hoverEvent(player),
Component.text(message)
);
}
}