Añade comandos de barra
Dale a tu comunidad sus propios /comandos. Cuando un miembro escribe uno, mssgs envía el mensaje a tu servicio web y publica lo que responde: una tarjeta, botones o una respuesta que solo ve esa persona.
Qué puedes hacer
- Responde con una tarjetaResponde con JSON y aparece en el canal como una tarjeta.
- Sabe quién preguntaRecibes el miembro y sus roles, así que puedes comprobar quién puede hacer qué.
- Responde en privadoMuestra la respuesta solo al miembro que preguntó.
- Tómate tu tiempoResponde con un loader en 5 segundos y termina después a través de la callback URL.
En la app
Escribe / y aparecen los comandos de la comunidad
Tu servicio responde, mssgs publica la tarjeta
El selector y la tarjeta son los de la propia app. El pie indica quién ha usado qué comando.
Inicio rápido
Crea el trigger
En la app de escritorio, abre Manage Server → Triggers en tu comunidad y añade uno: el comando al que reacciona, como
/weather, y la URL de tu servicio web.Recibe el mensaje
Cuando un miembro envía un mensaje que empieza por
/weather, mssgs lo envía con POST a tu 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=..." }Responde con JSON
Responde en 5 segundos con un estado 2xx y JSON. Se convierte en una tarjeta en el 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
Ajustes
Cada trigger tiene estos ajustes en Manage Server → Triggers.
| Ajuste | Qué hace |
|---|---|
| Trigger Name | Cómo se llama el trigger; se muestra junto al comando en el selector. |
| Word to Match | El texto con el que tiene que empezar un mensaje, como /weather. La barra es lo habitual, no es obligatoria. |
| URL Endpoint | Adónde envía mssgs el mensaje. |
| Webhook Secret | Opcional. mssgs firma cada petición con él, ver más abajo. |
| Active | Desactiva el trigger sin borrarlo. |
| Post Matching Message | Si el propio /weather Amsterdam del miembro se queda en el canal encima de tu respuesta. |
| Show Loading Reply | Muestra una tarjeta de carga mientras tu servicio trabaja. |
| Allowed User Groups | Solo lo activan los miembros con estos roles. Para cualquier otra persona es un mensaje normal. |
/deploy y /deploy-prod: no está garantizado cuál se activa. Los mensajes de bots y los mensajes reenviados nunca activan un trigger.Qué recibes
Un POST con un cuerpo JSON. Entre las cabeceras va User-Agent: mssgs-webhook/1.0.
| Campo | Tipo | Qué es |
|---|---|---|
server_guid | string | La comunidad. |
channel_guid | string | El canal en el que se envió el mensaje. |
trigger_match | string | El comando que ha coincidido, como /weather. |
message.content | string | El mensaje entero, comando incluido. |
message.member_guid | string | El miembro que lo envió, en esta comunidad. |
message.user_guid | string | La cuenta de esa misma persona, igual en todas las comunidades. |
message.group_guids | array | Los roles que tiene el miembro. |
message.cms | number | Cuándo se envió, en milisegundos. |
message.is_action_button | boolean | true cuando el trigger lo ha activado un botón y no un comando escrito. |
message.action_payload | object | El payload del botón, en las pulsaciones de botón. |
callback_url | string | Actualiza o borra tu respuesta más tarde, durante 30 minutos. |
stream_url | string | Un stream en directo de las respuestas, reacciones y pulsaciones de botón en tu respuesta, durante 10 minutos. |
X-Mssgs-Signature: sha256=<hex>: un HMAC-SHA256 del cuerpo sin procesar con tu secreto. Calcúlalo tú y compáralo antes de fiarte de la petición.Comprobar quién puede hacer qué
Compara message.group_guids con los roles de los que te fías, por ejemplo para que solo los moderadores puedan ejecutar /ban. Para que un comando no funcione en absoluto para nadie más, define sus roles en los ajustes del trigger.
Qué respondes
Cualquier estado 2xx con un cuerpo JSON, de hasta 4 MB. Envía al menos uno de message_container o actions.
| Campo | Tipo | Qué es |
|---|---|---|
message_container | object | La tarjeta. Aquí funcionan todos los campos de las tarjetas de mensaje, incluidos la píldora de estado, el distintivo, las estadísticas de diff y el razonamiento plegado. |
title, description, color, ... | string | Atajo: los campos de tarjeta en el nivel superior se envuelven en una tarjeta por ti. |
actions | array | Botones bajo la tarjeta. Consulta botones. |
visible_to_member_guids | array | Solo estos miembros ven la respuesta. Consulta respuestas privadas. |
content no se muestra en la tarjeta de una respuesta a un comando, así que pon lo importante en la propia tarjeta.Cinco segundos
mssgs espera 5 segundos tu respuesta. Si necesitas más, responde de inmediato con una tarjeta de loader y termina a través de callback_url, que sigue siendo válida durante 30 minutos.
// 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 } })
});Respuestas privadas
Pon ids de miembros en visible_to_member_guids y solo ellos verán tu respuesta. Usa el member_guid de la petición para responder solo a quien preguntó.
{
"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 ejemplo completo
Un comando /weather en Node.js con Express, que responde con una tarjeta.
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);Límites
| Límite | Valor |
|---|---|
| Tiempo para responder | 5 segundos |
| Tamaño de la respuesta | 4 MB |
| Comandos por miembro | 5 cada 5 segundos |
| Actualizar la respuesta después | 30 minutos, mediante callback_url |
| Stream en directo de la respuesta | 10 minutos, mediante stream_url |