API

MuteCloud von außen über HTTP und WebSocket steuern und aus Plugins über die Bridge-API.

MuteCloud spricht HTTP und WebSocket auf derselben Adresse, standardmäßig 127.0.0.1:8770. Beides stellst du in der mutecloud.toml ein:

mutecloud.toml
[api]
bind = "127.0.0.1:8770"
token = "..."

Ist die API ohne Token von außen erreichbar, warnt die Cloud beim Start. Ohne Token sind nur Anfragen vom selben Server erlaubt.

HTTP

A="Authorization: Bearer $TOKEN"
H="http://127.0.0.1:8770"
curl -H "$A" $H/api/services
RouteWas sie machtRecht
GET /api/healthob die Cloud läuft, kein Token nötigkeins
GET /api/openapi.jsonBeschreibung dieser APIkeins
GET /api/statusNode, Version, Zählerjedes gültige Token
GET /api/nodesalle Nodes im Verbundgroups.view
GET /api/groupsalle Gruppengroups.view
GET /api/groups/{name}eine Gruppe mit ihren Serverngroups.view
POST /api/groups/{name}/{action}start, stop, restart, rollout, disable, backupje nach Aktion
GET /api/serviceslaufende Serverservice.view
GET /api/services/{id}ein Serverservice.view
GET /api/services/{id}/logsdie letzten Log-Zeilenservice.view
GET /api/services/{id}/propertiesEigenschaften, die der Server gesetzt hatservice.view
POST /api/services/{id}/{action}stop, drain, restartje nach Aktion
POST /api/services/{id}/execein Befehl an die Konsole dieses Serversservice.console
GET /api/playerswer online istplayers.view
GET /api/players/{name}ein einzelner Spielerplayers.view
GET /api/ranksRängeranks.view
GET /api/ranks/{player}die Rechte eines Spielersranks.view
GET /api/data/{namespace}gemeinsamer Speicherdata.view
GET PUT DELETE /api/data/{namespace}/{key}ein Eintrag, PUT nimmt den Wert als reinen Text im Bodydata.view / data.edit
POST /api/announceNachricht an alle Spielerannounce
POST /api/channels/{channel}Nachricht an Plugins, optional mit targetchannels.publish
POST /api/maintenanceWartungsmodus umschaltenmaintenance
GET /api/layersVorlagen mit ihrer Revisionlayers.read
GET /api/layers/{name}eine Vorlage als tar.gzlayers.read
GET /api/updateVersion und ob eine neuere bereitstehtgroups.view
POST /api/commandjeder Befehl, Antwort als Zeilenje nach Befehl
GET /metricsPrometheus-Text, siehe Metrikengroups.view

Fehlt ein Recht, antwortet die API mit 403 und nennt das fehlende Recht. Nach acht falschen Tokens wird die Adresse für eine Minute gesperrt.

curl -H "$A" -X POST $H/api/groups/Lobby/start
curl -H "$A" -X POST -H 'Content-Type: application/json' \
     -d '{"line":"say Restart in 5 minutes"}' $H/api/services/Lobby-1/exec
curl -H "$A" -X POST -H 'Content-Type: application/json' \
     -d '{"message":"&bBack in a moment","title":true}' $H/api/announce

Die vollständige Beschreibung liegt unter /api/openapi.json. Damit lassen sich Clients erzeugen oder die Routen in Werkzeuge wie Postman oder Insomnia importieren.

Tokens

token create website groups.view players.view
token list
token delete website

Ein Token bekommt nur die Rechte, die es braucht. * gibt vollen Zugriff und gehört nicht in ein Web-Frontend.

WebSocket

ws://127.0.0.1:8770/ws nutzt dasselbe Protokoll wie die Bridges. Nach dem Verbinden sendest du:

{"t":"hello","d":{"version":1,"role":"operator","token":"..."}}

Ab dann kommen Ereignisse an, sobald sie passieren: snapshot, service_update, service_gone, log, network, permissions, node_info. Zum Steuern sendest du command, die Antwort kommt als output mit derselben Anfrage-ID zurück. Kanal-Nachrichten kommen als message an, sobald du dich mit listen angemeldet hast, und mit publish sendest du eigene.

Das ist die passende Schnittstelle für ein Web-Frontend oder einen Bot, der Ereignisse empfangen soll, statt ständig nachzufragen.

Für Plugins

Die Bridge liegt auf jedem Server und bietet eine API, dazu Eigenschaften, Kanäle zwischen Servern und Events für Paper und Velocity. Alles dazu steht unter Plugins.

MuteCloud.best("Lobby");                          // der leerste Server, der Spieler annimmt
MuteCloud.send(player, "Lobby");                  // einen Spieler verschieben
MuteCloud.setState("INGAME");                     // Eigenschaft dieses Servers
MuteCloud.channel("party").publish(invite);       // Nachricht an andere Server
MuteCloud.data("myplugin").set(k, v);             // gemeinsamer Speicher

Dazu kommen Platzhalter wie %mutecloud_service%, %mutecloud_network_players% und %mutecloud_players_lobby%, sobald PlaceholderAPI installiert ist.

Auf dieser Seite