Private Messages
Private messages are cross-server: the sender's request is routed through RabbitMQ to the recipient's server, the response comes back the same way. The flow is fronted by PrivateMessageService and the underlying packets are PrivateMessageRequest/PrivateMessageResponse.
Sending
Aliases: /message, /m, /t.
The sender and recipient both see the message rendered with the formats.private-messages template from config.yml. The format receives:
Variable | Value |
|---|---|
| Sender's display name. |
| Recipient's display name. |
| The message body. |
Error responses (in order of priority):
Condition | Message key |
|---|---|
Recipient is the sender |
|
Recipient is unknown (offline anywhere on the network) |
|
Recipient has |
|
Sender is ignored by the recipient |
|
Anything else |
|
Every successful conversation is persisted to the private_messages table.
Replying
Replies to the last person you exchanged a PM with. If no conversation has happened (or the cached target has since gone offline), the player receives no-message-to-reply-to or reply-player-offline.
Toggling private messages
Toggles PlayerChatData.privateMessagesEnabled. The persistent flag is checked at every incoming /msg: when off, the sender gets private-message-recipient-disabled and nothing is delivered.
Confirmation messages: private-message-enabled/private-message-disabled.
Ignoring
/ignorewith no argument opens a menu of currently ignored players./ignore <player>adds the player to the ignore list (database + Redis cache)./unignore <player>removes the entry./ignorerejects self-targeting withignore-self.
Ignore state is preloaded into Redis on every join by IgnoreListener so the PM pipeline can check it synchronously without a DB round-trip.
The unignore-player AstralCore action (see Actions) lets menus remove an entry by UUID without exposing the command.
Social spy
Toggles whether the staff member receives a copy of every private message sent on the network. Permissions are pulled from config.yml — defaults are chat.socialspy (required to toggle and receive) and chat.socialspy.bypass (worn by players who must never be spied on).
Spy output uses the social-spy.format template with:
Variable | Value |
|---|---|
| Sender display name. |
| Recipient display name. |
| The message body. |
Confirmation messages: social-spy-enabled/social-spy-disabled.
Cross-server topology
The response status enum carries SUCCESS, USER_MESSAGING_DISABLED, USER_NOT_FOUND, or IGNORED, which the sender side maps to the appropriate message key.