Перейти к основному содержанию
Разработчикам Слэш-команды

Добавьте слэш-команды

Дайте своему сообществу собственные /commands. Когда участник вводит одну из них, mssgs отправляет сообщение вашему веб-сервису и публикует то, что он ответил: карточку, кнопки или ответ, который видит только этот участник.

Что можно сделать

  • Отвечайте карточкойОтветьте JSON, и он появится в канале как карточка.
  • Знайте, кто спросилВы получаете участника и его роли, так что можете проверить, кому что разрешено.
  • Отвечайте приватноПоказывайте ответ только тому участнику, который спросил.
  • Не торопитесьОтветьте индикатором загрузки за 5 секунд, а закончите через callback URL.

В приложении

Введите /, и появятся команды сообщества

Ваш сервис отвечает, mssgs публикует карточку

Список команд и карточку рисует само приложение. В нижней строке указано, кто и какую команду использовал.

Быстрый старт

  1. Создайте триггер

    В настольном приложении откройте в своём сообществе Управление сервером → Триггеры и добавьте триггер: команду, на которую он реагирует, например /weather, и URL вашего веб-сервиса.

  2. Получите сообщение

    Когда участник отправляет сообщение, которое начинается с /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=..."
    }
  3. Ответьте 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
    maya18:45
    /weather Amsterdam
    System
    Сообщение от Weekend Crew

    Amsterdam

    14 °C, небольшой дождь до 16:00
    Wind
    SW 18 km/h
    Humidity
    82%

Настройки

У каждого триггера есть эти настройки в разделе Управление сервером → Триггеры.

НастройкаЧто делает
Название триггераКак называется триггер; показывается рядом с командой в списке команд.
Слово для совпаденияТекст, с которого должно начинаться сообщение, например /weather. Слэш в начале привычен, но не обязателен.
URL-адресКуда mssgs отправляет сообщение.
Секрет вебхукаНеобязательно. mssgs подписывает им каждый запрос, см. ниже.
АктивенПозволяет выключить триггер, не удаляя его.
Публиковать подходящее сообщениеОстаётся ли в канале над вашим ответом собственное сообщение участника /weather Amsterdam.
Показывать ответ с загрузкойПоказывать карточку загрузки, пока ваш сервис работает.
Разрешённые группы пользователейТриггер срабатывает только для участников из этих групп (ролей). Для всех остальных это обычное сообщение.
Совпадение проверяется по началу сообщения. Избегайте команд, одна из которых начинается с другой, например /deploy и /deploy-prod: какая из них сработает, не определено. Сообщения от ботов и пересланные сообщения никогда не запускают триггер.

Что вы получаете

POST-запрос с JSON-телом. Среди заголовков есть User-Agent: mssgs-webhook/1.0.

ПолеТипЧто это
server_guidstringСообщество.
channel_guidstringКанал, в который отправлено сообщение.
trigger_matchstringСовпавшая команда, например /weather.
message.contentstringВсё сообщение целиком, вместе с командой.
message.member_guidstringУчастник, который его отправил, в этом сообществе.
message.user_guidstringАккаунт того же человека, одинаковый во всех сообществах.
message.group_guidsarrayРоли участника.
message.cmsnumberВремя отправки в миллисекундах.
message.is_action_buttonbooleantrue, если триггер запустила кнопка, а не введённая команда.
message.action_payloadobjectpayload кнопки, при нажатиях кнопок.
callback_urlstringПозволяет обновить или удалить ваш ответ позже, в течение 30 минут.
stream_urlstringЖивой поток ответов, реакций и нажатий кнопок на вашем ответе, в течение 10 минут.
Если задан секрет, запрос содержит X-Mssgs-Signature: sha256=<hex>: HMAC-SHA256 необработанного тела с вашим секретом. Вычислите подпись сами и сравните, прежде чем доверять запросу.

Проверка, кому что можно

Сравнивайте message.group_guids с ролями, которым вы доверяете, например чтобы /ban могли запускать только модераторы. Чтобы полностью скрыть команду от всех остальных, укажите разрешённые группы в настройках триггера.

Что вы отвечаете

Любой статус 2xx с JSON-телом размером до 4 МБ. Передайте хотя бы одно из полей: message_container или actions.

ПолеТипЧто это
message_containerobjectКарточка. Здесь работает любое поле карточек сообщений, включая плашку статуса, бейдж, статистику diff и свёрнутые размышления.
title, description, color, ...stringСокращение: поля карточки на верхнем уровне автоматически оборачиваются в карточку.
actionsarrayКнопки под карточкой. См. раздел о кнопках.
visible_to_member_guidsarrayОтвет видят только эти участники. См. приватные ответы.
В шапке карточки указано название вашего сообщества, а в нижней строке написано, кто использовал команду: «maya triggered /weather command». Аватар принадлежит участнику.
Всегда отвечайте карточкой: строка content на карточке ответа на команду не показывается, поэтому всё важное помещайте в саму карточку.

Пять секунд

mssgs ждёт вашего ответа 5 секунд. Если нужно больше времени, сразу ответьте карточкой с индикатором загрузки и закончите через callback_url, который действует 30 минут.

javascript
// 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 из запроса, чтобы ответить только тому, кто спросил.

json
{
  "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, которая отвечает карточкой.

javascript
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

Что дальше