mirror of
https://github.com/Minestom/Minestom.git
synced 2025-04-16 00:55:46 +02:00
Improve chat API (#2329)
* improve chat api * fix typoes * remove click event * make requested changes
This commit is contained in:
parent
000483dcde
commit
561470c82a
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user