Cross-server chat
Voxen talks to its other instances directly through a message broker. There is nothing to install on the proxy, and BungeeCord or Velocity are not required at all: two standalone servers pointed at the same Redis work just as well.
Setting it up
Section titled “Setting it up”-
Pick a transport in
integrations.ymland fill in its connection details:plugins/Voxen/integrations.yml network:transport: redisserver-id: lobbyredis:host: 10.0.0.5port: 6379username: ""password: "secret"ssl: falsechannel: "voxen:chat"plugins/Voxen/integrations.yml network:transport: natsserver-id: lobbynats:url: "nats://10.0.0.5:4222"username: ""password: ""subject: "voxen.chat"plugins/Voxen/integrations.yml network:transport: rabbitmqserver-id: lobbyrabbitmq:host: 10.0.0.5port: 5672username: guestpassword: guestvirtual-host: "/"exchange: "voxen.chat" -
Give every server a unique
server-id. It is how servers tell each other apart and what gets written into the chat log. -
Mark the channels that should be shared:
plugins/Voxen/channels/global.yml cross-server: trueThe bundled
serverchannel already has it, so you have a local-only channel from the start. -
Restart every server. Repeat the same
integrations.ymleverywhere exceptserver-id.
transport: none is the default and keeps Voxen in single-server mode.
reconnect-seconds and timeout-millis control connection recovery and how long a lookup
of a player on another server may take.
What crosses the network
Section titled “What crosses the network”| Feature | Behavior |
|---|---|
| Channel messages | delivered to every server, rendered with external-format when set |
| Mentions | @name finds the player wherever they are and respects their toggle |
| Private messages | /msg and /r reach any server |
| Social spy | every PM is broadcast so each server can show its own spies |
| Mutes | applied everywhere the moment they are set |
Where things are decided
Section titled “Where things are decided”Formatting permissions are applied on the sending server. The message is rendered there and travels as finished MiniMessage text, so what a player may write depends on their permissions where they typed it. Servers can run different Paper builds.
The receiving side decides what belongs to it: the mention toggle, the PM toggle and the ignore list are checked on the recipient’s server.
Private messages
Section titled “Private messages”Tab completion only suggests local players, but any name can be typed. If nobody on the
network has that player, the sender gets the not-found message after timeout-millis.
The /r target lives in player data. With a shared MySQL database it follows players
between servers and survives relogs; with per-server SQLite each server keeps its own.
network.sync-mutes is on by default and broadcasts every /voxen mute and unmute
immediately. With shared MySQL mutes also survive restarts on every server. With
per-server SQLite each server only knows about mutes it was online to receive.