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
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.Die Nachricht empfangen
Sendet ein Mitglied eine Nachricht, die mit
/weatherbeginnt, 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=..." }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
Einstellungen
Jeder Trigger hat diese Einstellungen unter Server verwalten → Trigger.
| Einstellung | Was sie tut |
|---|---|
| Name des Triggers | Wie der Trigger heißt, angezeigt neben dem Befehl in der Auswahlliste. |
| Wort, das passen soll | Der Text, mit dem eine Nachricht beginnen muss, etwa /weather. Ein Schrägstrich ist üblich, aber keine Pflicht. |
| URL-Endpunkt | Wohin mssgs die Nachricht schickt. |
| Webhook-Secret | Optional. mssgs signiert damit jeden Request, siehe unten. |
| Aktiv | Schalte den Trigger ab, ohne ihn zu löschen. |
| Passende Nachricht posten | Ob das /weather Amsterdam des Mitglieds über deiner Antwort im Kanal stehen bleibt. |
| Ladeantwort zeigen | Zeig eine Ladekarte, während dein Dienst arbeitet. |
| Erlaubte Benutzergruppen | Nur Mitglieder mit diesen Rollen lösen ihn aus. Für alle anderen ist es eine gewöhnliche Nachricht. |
/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.
| Feld | Typ | Was es ist |
|---|---|---|
server_guid | string | Die Community. |
channel_guid | string | Der Kanal, in den die Nachricht gesendet wurde. |
trigger_match | string | Der Befehl, der gepasst hat, etwa /weather. |
message.content | string | Die ganze Nachricht, samt Befehl. |
message.member_guid | string | Das Mitglied, das sie gesendet hat, in dieser Community. |
message.user_guid | string | Das Konto derselben Person, in jeder Community gleich. |
message.group_guids | array | Die Rollen des Mitglieds. |
message.cms | number | Wann sie gesendet wurde, in Millisekunden. |
message.is_action_button | boolean | true, wenn ein Button den Trigger ausgelöst hat und kein getippter Befehl. |
message.action_payload | object | Die payload des Buttons, bei Button-Drücken. |
callback_url | string | Aktualisiere oder lösche deine Antwort später, 30 Minuten lang. |
stream_url | string | Ein Live-Stream der Antworten, Reaktionen und Button-Drücke auf deine Antwort, 10 Minuten lang. |
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.
| Feld | Typ | Was es ist |
|---|---|---|
message_container | object | Die Karte. Jedes Feld aus den Nachrichtenkarten funktioniert hier, auch Status-Pille, Badge, Diff-Statistik und eingeklappter Denkprozess. |
title, description, color, ... | string | Kurzform: Kartenfelder auf oberster Ebene werden für dich in eine Karte verpackt. |
actions | array | Buttons unter der Karte. Siehe Buttons. |
visible_to_member_guids | array | Nur diese Mitglieder sehen die Antwort. Siehe private Antworten. |
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.
// 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 } })
});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.
{
"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.
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
| Limit | Wert |
|---|---|
| Zeit für die Antwort | 5 Sekunden |
| Größe der Antwort | 4 MB |
| Befehle pro Mitglied | 5 alle 5 Sekunden |
| Die Antwort nachträglich aktualisieren | 30 Minuten, über callback_url |
| Live-Stream der Antwort | 10 Minuten, über stream_url |