Zum Hauptinhalt springen
Entwickler Slash-Befehle

Slash-Befehle hinzufügen

Gib deiner Community ihre eigenen /Befehle. Tippt ein Mitglied einen davon, schickt mssgs die Nachricht an deinen Webdienst und postet, was er antwortet: eine Karte, Buttons, eine Antwort, die nur dieses Mitglied sieht.

Was du damit machen kannst

  • Mit einer Karte antwortenAntworte mit JSON, und es erscheint als Karte im Kanal.
  • Wissen, wer fragtDu bekommst das Mitglied und seine Rollen und kannst so prüfen, wer was darf.
  • Privat antwortenZeig die Antwort nur dem Mitglied, das gefragt hat.
  • Lass dir ZeitAntworte innerhalb von 5 Sekunden mit einem Loader und mach dann über die Callback-URL fertig.

In der App

Tipp / und die Befehle der Community erscheinen

Dein Dienst antwortet, mssgs postet die Karte

Die Auswahlliste und die Karte stammen aus der App selbst. Die Fußzeile zeigt, wer welchen Befehl benutzt hat.

Schnellstart

  1. Trigger anlegen

    Öffne in der Desktop-App bei deiner Community Server verwalten → Trigger und füg einen hinzu: den Befehl, auf den er reagiert, etwa /weather, und die URL deines Webdiensts.

  2. Die Nachricht empfangen

    Sendet ein Mitglied eine Nachricht, die mit /weather beginnt, schickt mssgs sie per POST an deine URL:

    json
    {
      "server_guid": "abc12345-...",
      "channel_guid": "def67890-...",
      "trigger_match": "/weather",
      "message": {
        "id": "d01ZZdef6-...",
        "content": "/weather Amsterdam",
        "member_guid": "member-guid",
        "user_guid": "user-guid",
        "group_guids": ["group-guid-1", "group-guid-2"],
        "cms": 1790000000000
      },
      "callback_url": "https://mss.gs/api/v1/trigger-callback/...",
      "stream_url": "https://mss.gs/api/v1/instant/...?token=..."
    }
  3. Mit JSON antworten

    Antworte innerhalb von 5 Sekunden mit einem 2xx-Status und JSON. Daraus wird eine Karte im Kanal.

    json
    {
      "message_container": {
        "color": "blue",
        "title": "Amsterdam",
        "description": "14 °C, light rain until 16:00",
        "fields": [
          { "field": "Wind", "value": "SW 18 km/h" },
          { "field": "Humidity", "value": "82%" }
        ]
      }
    }
    general
    maya18:45
    /weather Amsterdam
    System
    Nachricht von Weekend Crew

    Amsterdam

    14 °C, leichter Regen bis 16:00
    Wind
    SW 18 km/h
    Humidity
    82%

Einstellungen

Jeder Trigger hat diese Einstellungen unter Server verwalten → Trigger.

EinstellungWas sie tut
Name des TriggersWie der Trigger heißt, angezeigt neben dem Befehl in der Auswahlliste.
Wort, das passen sollDer Text, mit dem eine Nachricht beginnen muss, etwa /weather. Ein Schrägstrich ist üblich, aber keine Pflicht.
URL-EndpunktWohin mssgs die Nachricht schickt.
Webhook-SecretOptional. mssgs signiert damit jeden Request, siehe unten.
AktivSchalte den Trigger ab, ohne ihn zu löschen.
Passende Nachricht postenOb das /weather Amsterdam des Mitglieds über deiner Antwort im Kanal stehen bleibt.
Ladeantwort zeigenZeig eine Ladekarte, während dein Dienst arbeitet.
Erlaubte BenutzergruppenNur Mitglieder mit diesen Rollen lösen ihn aus. Für alle anderen ist es eine gewöhnliche Nachricht.
Verglichen wird der Anfang der Nachricht. Vermeide Befehle, bei denen einer der Anfang eines anderen ist, wie /deploy und /deploy-prod: Welcher dann auslöst, ist nicht festgelegt. Nachrichten von Bots und weitergeleitete Nachrichten lösen nie einen Trigger aus.

Was du bekommst

Einen POST mit JSON-Body. Unter den Headern ist User-Agent: mssgs-webhook/1.0.

FeldTypWas es ist
server_guidstringDie Community.
channel_guidstringDer Kanal, in den die Nachricht gesendet wurde.
trigger_matchstringDer Befehl, der gepasst hat, etwa /weather.
message.contentstringDie ganze Nachricht, samt Befehl.
message.member_guidstringDas Mitglied, das sie gesendet hat, in dieser Community.
message.user_guidstringDas Konto derselben Person, in jeder Community gleich.
message.group_guidsarrayDie Rollen des Mitglieds.
message.cmsnumberWann sie gesendet wurde, in Millisekunden.
message.is_action_buttonbooleantrue, wenn ein Button den Trigger ausgelöst hat und kein getippter Befehl.
message.action_payloadobjectDie payload des Buttons, bei Button-Drücken.
callback_urlstringAktualisiere oder lösche deine Antwort später, 30 Minuten lang.
stream_urlstringEin Live-Stream der Antworten, Reaktionen und Button-Drücke auf deine Antwort, 10 Minuten lang.
Ist ein Secret gesetzt, trägt der Request X-Mssgs-Signature: sha256=<hex>: ein HMAC-SHA256 des unveränderten Bodys mit deinem Secret. Berechne ihn selbst und vergleiche, bevor du dem Request vertraust.

Prüfen, wer was darf

Vergleiche message.group_guids mit den Rollen, denen du vertraust, etwa damit nur Moderatoren /ban ausführen können. Soll ein Befehl für alle anderen gar nicht erst funktionieren, stell seine Rollen in den Einstellungen des Triggers ein.

Was du antwortest

Einen beliebigen 2xx-Status mit JSON-Body, bis zu 4 MB. Sende mindestens eines von message_container oder actions.

FeldTypWas es ist
message_containerobjectDie Karte. Jedes Feld aus den Nachrichtenkarten funktioniert hier, auch Status-Pille, Badge, Diff-Statistik und eingeklappter Denkprozess.
title, description, color, ...stringKurzform: Kartenfelder auf oberster Ebene werden für dich in eine Karte verpackt.
actionsarrayButtons unter der Karte. Siehe Buttons.
visible_to_member_guidsarrayNur diese Mitglieder sehen die Antwort. Siehe private Antworten.
Die Kopfzeile der Karte zeigt den Namen deiner Community, und die Fußzeile sagt, wer den Befehl benutzt hat: „maya triggered /weather command“. Der Avatar ist der des Mitglieds.
Antworte immer mit einer Karte: Die content-Zeile wird auf der Karte einer Befehlsantwort nicht angezeigt, also gehört das Wichtige in die Karte selbst.

Fünf Sekunden

mssgs wartet 5 Sekunden auf deine Antwort. Brauchst du länger, antworte sofort mit einer Loader-Karte und mach über callback_url fertig, die 30 Minuten gültig bleibt.

javascript
// Answer within 5 seconds with a loader...
res.json({ message_container: { loader: true, loader_text: 'Looking it up…' } });

// ...then finish in your own time with the callback URL.
await fetch(req.body.callback_url, {
  method: 'PUT',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ message_container: { color: 'blue', title: 'Done', description: result } })
});
Antwortet dein Dienst nicht rechtzeitig oder mit einem Fehler, sieht das Mitglied, das den Befehl benutzt hat, eine rote Karte „Failed“. Sonst niemand.

Private Antworten

Trag Mitglieds-IDs in visible_to_member_guids ein, und nur diese Mitglieder sehen deine Antwort. Nimm die member_guid aus dem Request, um nur der Person zu antworten, die gefragt hat.

json
{
  "message_container": {
    "color": "green",
    "title": "You're on the list",
    "description": "Only you can see this reply."
  },
  "visible_to_member_guids": ["<message.member_guid from the request>"]
}

Ein vollständiges Beispiel

Ein /weather-Befehl in Node.js mit Express, der mit einer Karte antwortet.

javascript
import express from 'express';

const app = express();
app.use(express.json());

app.post('/mssgs/weather', async (req, res) => {
  const city = req.body.message.content.replace('/weather', '').trim() || 'Amsterdam';
  const w = await getWeather(city); // your own lookup

  res.json({
    message_container: {
      color: 'blue',
      title: city,
      description: `${w.temp} °C, ${w.summary}`,
      fields: [
        { field: 'Wind', value: w.wind },
        { field: 'Humidity', value: `${w.humidity}%` }
      ]
    }
  });
});

app.listen(3000);

Limits

LimitWert
Zeit für die Antwort5 Sekunden
Größe der Antwort4 MB
Befehle pro Mitglied5 alle 5 Sekunden
Die Antwort nachträglich aktualisieren30 Minuten, über callback_url
Live-Stream der Antwort10 Minuten, über stream_url

Weiterbauen