Додайте слеш-команди
Дайте своїй спільноті власні /команди. Коли учасник вводить одну з них, mssgs надсилає повідомлення вашому вебсервісу й публікує те, що той відповість: картку, кнопки або відповідь, яку бачить лише цей учасник.
Що можна зробити
- Відповідайте карткоюВідповідайте JSON, і він з’явиться в каналі як картка.
- Знайте, хто запитавВи отримуєте учасника та його ролі, тож можете перевірити, кому що дозволено.
- Відповідайте приватноПоказуйте відповідь лише учаснику, який запитав.
- Не поспішайтеВідповідайте індикатором завантаження за 5 секунд, а потім завершуйте через callback URL.
У застосунку
Введіть /, і з’являться команди спільноти
Ваш сервіс відповідає, mssgs публікує картку
Список команд і картка належать самому застосунку. Нижній рядок каже, хто використав яку команду.
Швидкий старт
Створіть тригер
У настільному застосунку відкрийте у своїй спільноті Manage Server → Triggers (керування сервером, тригери) і додайте тригер: команду, на яку він реагує, наприклад
/weather, і URL вашого вебсервісу.Отримайте повідомлення
Коли учасник надсилає повідомлення, що починається з
/weather, mssgs надсилає його методом POST на ваш 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=..." }Відповідайте JSON
Відповідайте протягом 5 секунд зі статусом 2xx і JSON. Відповідь стане карткою в каналі.
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
Налаштування
Кожен тригер має такі налаштування в Manage Server → Triggers.
| Налаштування | Що робить |
|---|---|
| Trigger Name | Як називається тригер; показується поруч із командою в списку команд. |
| Word to Match | Текст, з якого має починатися повідомлення, наприклад /weather. Скісна риска на початку звична, але не обов’язкова. |
| URL Endpoint | Куди mssgs надсилає повідомлення. |
| Webhook Secret | Необов’язковий. mssgs підписує ним кожен запит, див. нижче. |
| Active | Вимикає тригер, не видаляючи його. |
| Post Matching Message | Чи залишається власне /weather Amsterdam учасника в каналі над вашою відповіддю. |
| Show Loading Reply | Показує картку завантаження, поки ваш сервіс працює. |
| Allowed User Groups | Тригер спрацьовує лише для учасників із цими ролями. Для всіх інших це звичайне повідомлення. |
/deploy і /deploy-prod: яка з них спрацює, не визначено. Повідомлення від ботів і переслані повідомлення ніколи не запускають тригер.Що ви отримуєте
POST-запит із JSON-тілом. Серед заголовків є User-Agent: mssgs-webhook/1.0.
| Поле | Тип | Що це |
|---|---|---|
server_guid | string | Спільнота. |
channel_guid | string | Канал, у якому надіслано повідомлення. |
trigger_match | string | Команда, що збіглася, наприклад /weather. |
message.content | string | Усе повідомлення разом із командою. |
message.member_guid | string | Учасник, який його надіслав, у цій спільноті. |
message.user_guid | string | Обліковий запис тієї самої людини, однаковий у кожній спільноті. |
message.group_guids | array | Ролі учасника. |
message.cms | number | Коли його надіслано, у мілісекундах. |
message.is_action_button | boolean | true, коли тригер запустила кнопка, а не введена команда. |
message.action_payload | object | payload кнопки, для натискань кнопок. |
callback_url | string | Щоб оновити або видалити вашу відповідь згодом, протягом 30 хвилин. |
stream_url | string | Потік наживо з відповідями, реакціями й натисканнями кнопок на вашій відповіді, протягом 10 хвилин. |
X-Mssgs-Signature: sha256=<hex>: HMAC-SHA256 сирого тіла з вашим секретом. Обчисліть його самі й порівняйте, перш ніж довіряти запиту.Перевірка, кому що дозволено
Порівнюйте message.group_guids із ролями, яким довіряєте, наприклад щоб лише модератори могли виконувати /ban. Щоб повністю приховати команду від усіх інших, задайте її ролі в налаштуваннях тригера.
Що ви відповідаєте
Будь-який статус 2xx із JSON-тілом розміром до 4 МБ. Надішліть щонайменше одне з полів: message_container або actions.
| Поле | Тип | Що це |
|---|---|---|
message_container | object | Картка. Тут працює кожне поле карток повідомлень, зокрема плашка статусу, бейдж, статистика diff і згорнуті міркування. |
title, description, color, ... | string | Скорочення: поля картки на верхньому рівні автоматично загортаються в картку. |
actions | array | Кнопки під карткою. Див. кнопки. |
visible_to_member_guids | array | Відповідь бачать лише ці учасники. Див. приватні відповіді. |
content не показується на картці відповіді на команду, тож кладіть усе важливе в саму картку.П’ять секунд
mssgs чекає на вашу відповідь 5 секунд. Якщо вам потрібно більше часу, одразу відповідайте карткою з індикатором завантаження й завершуйте через callback_url, який залишається дійсним 30 хвилин.
// 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 } })
});Приватні відповіді
Вкажіть id учасників у visible_to_member_guids, і вашу відповідь бачитимуть лише вони. Використовуйте member_guid із запиту, щоб відповісти лише тому, хто запитав.
{
"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>"]
}Повний приклад
Команда /weather на Node.js з Express, що відповідає карткою.
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);Ліміти
| Ліміт | Значення |
|---|---|
| Час на відповідь | 5 секунд |
| Розмір відповіді | 4 МБ |
| Команд на учасника | 5 кожні 5 секунд |
| Оновлення відповіді згодом | 30 хвилин, через callback_url |
| Потік наживо для відповіді | 10 хвилин, через stream_url |