Adaugă comenzi slash
Dă-i comunității tale propriile /comenzi. Când un membru tastează una, mssgs trimite mesajul la serviciul tău web și postează ce răspunde acesta: un card, butoane sau un răspuns pe care doar membrul respectiv îl vede.
Ce poți face
- Răspunde cu un cardRăspunde cu JSON, iar acesta apare în canal ca un card.
- Află cine a întrebatPrimești membrul și rolurile lui, așa că poți verifica cine ce are voie să facă.
- Răspunde în privatArată răspunsul doar membrului care a întrebat.
- Fără grabăRăspunde cu un loader în 5 secunde, apoi termină prin URL-ul de callback.
În aplicație
Tastează / și apar comenzile comunității
Serviciul tău răspunde, mssgs postează cardul
Lista de comenzi și cardul sunt chiar cele din aplicație. Subsolul arată cine a folosit ce comandă.
Start rapid
Creează triggerul
În aplicația desktop, deschide în comunitatea ta Manage Server → Triggers și adaugă unul: comanda la care reacționează, de exemplu
/weather, și URL-ul serviciului tău web.Primește mesajul
Când un membru trimite un mesaj care începe cu
/weather, mssgs îl trimite cu POST la URL-ul tău: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ăspunde cu JSON
Răspunde în 5 secunde cu un status 2xx și JSON. Acesta devine un card în canal.
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
Setări
Fiecare trigger are aceste setări în Manage Server → Triggers.
| Setare | Ce face |
|---|---|
| Trigger Name | Numele triggerului, afișat lângă comandă în lista de comenzi. |
| Word to Match | Textul cu care trebuie să înceapă un mesaj, de exemplu /weather. Slash-ul este obișnuit, nu obligatoriu. |
| URL Endpoint | Unde trimite mssgs mesajul. |
| Webhook Secret | Opțional. mssgs semnează cu el fiecare cerere, vezi mai jos. |
| Active | Dezactivează triggerul fără să-l ștergi. |
| Post Matching Message | Dacă mesajul membrului, de exemplu /weather Amsterdam, rămâne în canal deasupra răspunsului tău. |
| Show Loading Reply | Afișează un card de încărcare cât timp lucrează serviciul tău. |
| Allowed User Groups | Doar membrii cu aceste roluri îl declanșează. Pentru oricine altcineva este un mesaj obișnuit. |
/deploy și /deploy-prod: nu este stabilit care dintre ele se declanșează. Mesajele de la boți și mesajele redirecționate nu declanșează niciodată un trigger.Ce primești
Un POST cu un corp JSON. Printre antete se află User-Agent: mssgs-webhook/1.0.
| Câmp | Tip | Ce este |
|---|---|---|
server_guid | string | Comunitatea. |
channel_guid | string | Canalul în care a fost trimis mesajul. |
trigger_match | string | Comanda care s-a potrivit, de exemplu /weather. |
message.content | string | Întregul mesaj, inclusiv comanda. |
message.member_guid | string | Membrul care l-a trimis, în această comunitate. |
message.user_guid | string | Contul aceleiași persoane, același în fiecare comunitate. |
message.group_guids | array | Rolurile pe care le are membrul. |
message.cms | number | Când a fost trimis, în milisecunde. |
message.is_action_button | boolean | true când triggerul a fost declanșat de un buton, nu de o comandă tastată. |
message.action_payload | object | payload-ul butonului, la apăsările de butoane. |
callback_url | string | Actualizează sau șterge răspunsul tău mai târziu, timp de 30 de minute. |
stream_url | string | Un flux live cu răspunsurile, reacțiile și apăsările de butoane de pe răspunsul tău, timp de 10 minute. |
X-Mssgs-Signature: sha256=<hex>: un HMAC-SHA256 al corpului brut cu secretul tău. Calculează-l tu și compară-l înainte să ai încredere în cerere.Verificarea a cine ce are voie
Compară message.group_guids cu rolurile în care ai încredere, de exemplu ca doar moderatorii să poată rula /ban. Ca o comandă să nu fie deloc la îndemâna altora, setează-i rolurile în setările triggerului.
Ce răspunzi
Orice status 2xx cu un corp JSON, de până la 4 MB. Trimite cel puțin unul dintre message_container și actions.
| Câmp | Tip | Ce este |
|---|---|---|
message_container | object | Cardul. Aici funcționează toate câmpurile cardurilor de mesaj, inclusiv eticheta de status, badge-ul, statisticile de diff și raționamentul pliat. |
title, description, color, ... | string | Scurtătură: câmpurile de card puse la nivelul de sus sunt împachetate automat într-un card. |
actions | array | Butoane sub card. Vezi butoane. |
visible_to_member_guids | array | Doar acești membri văd răspunsul. Vezi răspunsuri private. |
content nu apare pe cardul unui răspuns la o comandă, așa că pune ce contează în cardul propriu-zis.Cinci secunde
mssgs așteaptă răspunsul tău 5 secunde. Dacă ai nevoie de mai mult, răspunde imediat cu un card de tip loader și termină prin callback_url, care rămâne valabil 30 de minute.
// 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ăspunsuri private
Pune id-uri de membri în visible_to_member_guids și doar ei îți vor vedea răspunsul. Folosește member_guid din cerere ca să-i răspunzi doar persoanei care a întrebat.
{
"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 exemplu complet
O comandă /weather în Node.js cu Express, care răspunde cu un card.
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);Limite
| Limită | Valoare |
|---|---|
| Timp de răspuns | 5 secunde |
| Dimensiunea răspunsului | 4 MB |
| Comenzi per membru | 5 la fiecare 5 secunde |
| Actualizarea răspunsului ulterior | 30 de minute, prin callback_url |
| Fluxul live al răspunsului | 10 minute, prin stream_url |