Ajouter des commandes slash
Donne à ta communauté ses propres /commandes. Quand un membre en tape une, mssgs envoie le message à ton service web et publie ce qu’il répond : une carte, des boutons, une réponse que seul ce membre voit.
Ce que vous pouvez faire
- Répondre avec une carteRéponds en JSON et ta réponse apparaît dans le salon sous forme de carte.
- Savoir qui a demandéTu reçois le membre et ses rôles, pour vérifier qui a le droit de faire quoi.
- Répondre en privéMontre la réponse uniquement au membre qui a demandé.
- Prendre ton tempsRéponds avec un chargement en 5 secondes, puis termine via l’URL de callback.
Dans l'app
Tape / et les commandes de la communauté apparaissent
Ton service répond, mssgs publie la carte
Le sélecteur et la carte sont ceux de l’application. Le pied de carte indique qui a utilisé quelle commande.
Démarrage rapide
Crée le déclencheur
Dans l’application de bureau, ouvre Gérer le serveur → Déclencheurs dans ta communauté et ajoutes-en un : la commande à laquelle il réagit, comme
/weather, et l’URL de ton service web.Reçois le message
Quand un membre envoie un message qui commence par
/weather, mssgs l’envoie en POST à ton 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=..." }Réponds en JSON
Réponds en moins de 5 secondes avec un statut 2xx et du JSON. Ta réponse devient une carte dans le salon.
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
Réglages
Chaque déclencheur a ces réglages dans Gérer le serveur → Déclencheurs.
| Réglage | Ce qu’il fait |
|---|---|
| Nom du déclencheur | Le nom du déclencheur, affiché à côté de la commande dans le sélecteur. |
| Mot à reconnaître | Le texte par lequel un message doit commencer, comme /weather. La barre oblique est l’usage, pas une obligation. |
| Point d’accès URL | L’adresse où mssgs envoie le message. |
| Secret du webhook | Facultatif. mssgs signe chaque requête avec, voir plus bas. |
| Actif | Désactive le déclencheur sans le supprimer. |
| Publier le message reconnu | Indique si le /weather Amsterdam du membre reste dans le salon au-dessus de ta réponse. |
| Afficher une réponse de chargement | Affiche une carte de chargement pendant que ton service travaille. |
| Groupes d’utilisateurs autorisés | Seuls les membres qui ont ces rôles le déclenchent. Pour tous les autres, c’est un message ordinaire. |
/deploy et /deploy-prod : on ne sait pas d’avance laquelle se déclenche. Les messages de bots et les messages transférés ne lancent jamais de déclencheur.Ce que tu reçois
Un POST avec un corps JSON. Les en-têtes contiennent User-Agent: mssgs-webhook/1.0.
| Champ | Type | Ce que c’est |
|---|---|---|
server_guid | string | La communauté. |
channel_guid | string | Le salon où le message a été envoyé. |
trigger_match | string | La commande qui a correspondu, comme /weather. |
message.content | string | Le message entier, commande comprise. |
message.member_guid | string | Le membre qui l’a envoyé, dans cette communauté. |
message.user_guid | string | Le compte de cette même personne, identique dans chaque communauté. |
message.group_guids | array | Les rôles du membre. |
message.cms | number | Le moment de l’envoi, en millisecondes. |
message.is_action_button | boolean | true quand c’est un bouton qui a lancé le déclencheur, pas une commande tapée. |
message.action_payload | object | Le payload du bouton, pour les appuis sur un bouton. |
callback_url | string | Pour mettre à jour ou supprimer ta réponse plus tard, pendant 30 minutes. |
stream_url | string | Un flux en direct des réponses, réactions et appuis sur les boutons de ta réponse, pendant 10 minutes. |
X-Mssgs-Signature: sha256=<hex> : un HMAC-SHA256 du corps brut avec ton secret. Calcule-le toi-même et compare avant de faire confiance à la requête.Vérifier qui a le droit de faire quoi
Compare message.group_guids aux rôles en qui tu as confiance, par exemple pour que seuls les modérateurs puissent lancer /ban. Pour tenir une commande complètement à l’écart de tous les autres, définis ses rôles dans les réglages du déclencheur.
Ce que tu réponds
N’importe quel statut 2xx avec un corps JSON, jusqu’à 4 Mo. Envoie au moins l’un des deux, message_container ou actions.
| Champ | Type | Ce que c’est |
|---|---|---|
message_container | object | La carte. Chaque champ des cartes de message fonctionne ici, y compris la pastille de statut, le badge, les stats de diff et le raisonnement replié. |
title, description, color, ... | string | Raccourci : les champs de carte placés au premier niveau sont regroupés dans une carte pour toi. |
actions | array | Des boutons sous la carte. Voir boutons. |
visible_to_member_guids | array | Seuls ces membres voient la réponse. Voir réponses privées. |
content n’apparaît pas sur la carte d’une réponse de commande, alors mets l’essentiel dans la carte elle-même.Cinq secondes
mssgs attend ta réponse 5 secondes. S’il te faut plus longtemps, réponds tout de suite avec une carte de chargement et termine via callback_url, qui reste valable 30 minutes.
// 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 } })
});Réponses privées
Mets des ids de membres dans visible_to_member_guids et eux seuls voient ta réponse. Utilise le member_guid de la requête pour ne répondre qu’à la personne qui a demandé.
{
"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>"]
}Un exemple complet
Une commande /weather en Node.js avec Express, qui répond avec une carte.
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);Limites
| Limite | Valeur |
|---|---|
| Délai de réponse | 5 secondes |
| Taille de la réponse | 4 Mo |
| Commandes par membre | 5 toutes les 5 secondes |
| Modifier la réponse ensuite | 30 minutes, via callback_url |
| Flux en direct de la réponse | 10 minutes, via stream_url |