Content generated with AI — it may contain mistakes.

Features

Modules

The eight things a backend can ask the proxy, what each payload means, and every answer it can give.

Every request a backend sends names a module, and the module decides what the payload means. The proxy answers every request, including one for a module that does not exist and one whose module threw: a request dropped in silence would be a five-second wait on the backend and no idea why.

Each answer carries a status:

StatusMeaning
OKThe module did what was asked. The detail may carry a result.
REJECTEDThe module understood and refused, with a reason.
FAILEDThe module threw; the detail is the error message.
UNKNOWN_MODULENo module by that name on this proxy: no module "<name>" on this proxy.

ExyliaLib adds a fifth on its own side, TIMEOUT, when nothing answers within five seconds. Module names are case-insensitive.

ping

PayloadIgnored.
AnswerOK with ExyliaProxyUtils <version> on <Velocity or BungeeCord>.
Used byExyliaLib, a second after start and every ten seconds until it answers, and /exylialib status.

commands

Runs a command on the proxy. The payload is <actor>:<command>:

ActorRuns as
player-proxyThe player the request is about, with their permissions on the proxy. Refused with a player-proxy command needs a player to run as when the request is about nobody.
console-proxyThe proxy console. Always logged as [<server-id>] console: /<command>, plus (for <player>) when the request is about somebody.

A leading / on the command is dropped. Answers:

  • OK once the proxy found and ran the command.
  • REJECTED the proxy did not run "/<label>" when the proxy has no such command, or the player has left.
  • REJECTED with expected <actor>:<command>, empty command or unknown actor "<actor>" for a malformed line.

These are the player-proxy: and console-proxy: prefixes of Commands.

connect

Moves a player to a server. The payload is <server>|<uuid>|<memo>; the last two are optional.

PartEmpty means
serverThe server that asked.
uuidThe player the request is about. Neither: REJECTED nobody to move: no uuid given.
memoNo note for the destination.

Answers OK once connected, OK already there when they were. Refusals:

ReasonWhen
no server "<name>"The proxy has no server by that name.
player is not connectedThe player has left the proxy.
not a player id: <text>The uuid part is not a uuid.
already connecting somewhereVelocity: another connection is in progress.
a proxy plugin cancelled the connectionVelocity: a plugin on the proxy cancelled it.
server "<name>" refused the connectionThe destination refused or failed. On BungeeCord with the error message appended.
the proxy did not connect themBungeeCord: the connection ended without success or error.

When the move succeeds and a memo was given, the proxy sends the destination server an arrive push with the player and the memo. This is how ExyliaLib's cross-server teleports land next to somebody: the server that asked writes where, the proxy carries it, the destination reads it and holds it until the player has actually joined, since the push can arrive first.

player

PayloadA name or a uuid.
AnswerOK uuid|name|server for a connected player; the server part is empty while they are between servers. REJECTED "<who>" is not on the network otherwise, REJECTED expected a name or a uuid for an empty payload.
Used byEvery lookup of a player who is not on the asking server, such as /tp <name>.

Names are matched the way the proxy matches them.

players

PayloadIgnored.
AnswerOK with every connected name, comma-separated, in no order.
Used byExyliaLib, every ten seconds, kept in memory for tab completion and Proxy.players().

kick

Disconnects a player from the whole network. The payload is <uuid>|<mini>|<legacy>, split on the first two pipes only, so the legacy screen may contain more.

ProxyScreen shown
VelocityThe MiniMessage screen; the legacy one if mini is blank; You are banned from this network. if both are.
BungeeCordThe §-coded legacy screen; if it is blank, the mini text as it is, tags and all.

Answers OK once disconnected, REJECTED not connected for a player the proxy does not have, REJECTED not a player id: <text> for a bad uuid. ExyliaStaff kicks and bans players on other servers this way.

punish-sources

PayloadIgnored.
AnswerOK with the ban plugins hooked on this proxy as comma-separated origins (LIBERTYBANS,LITEBANS), sorted; empty for none.

punish-import

PayloadAn origin: LITEBANS, LIBERTYBANS, ADVANCEDBAN or BANMANAGER, in any case.
AnswerOK started <ORIGIN> at once; the import runs on its own thread. REJECTED <ORIGIN> not installed or REJECTED <ORIGIN> import already running otherwise.
Used byExyliaStaff's /staffadmin import <plugin>, when the plugin is not installed on that backend.

See Punishments.

Threading

Modules run on the plugin's Redis subscriber thread. Lookups answer at once; a connect and a Velocity command return their answer when the proxy finishes, without holding that thread.

Something missing on this page? Tell us on Discord