Боты с Mattermost

Скрипты для Mattermost строятся на трёх механизмах: входящих вебхуках, слеш-командах и исходящих вебхуках. Все три работают в Kontext без правок скрипта — меняется только адрес в настройке. Одна оговорка: входящий вебхук пишет только в свой канал, поле channel из тела запроса не действует. Скрипту, который шлёт в разные каналы, нужен отдельный вебхук на каждый канал.

Что работает

В MattermostВ KontextЧто поменять
Входящий вебхук ({"text": "…"}, вложения, payload=)«Интеграции → Вебхуки → Slack-совместимый»Адрес вебхука в скрипте
Слеш-команда (token, ответ {"response_type", "text"})Команда бота: карточка бота → «Команды»Адрес скрипта — в настройке команды в Kontext
Исходящий вебхук по словам-триггерам (ответ {"text", "response_type": "comment"})Подписка бота в формате «Mattermost»: карточка бота → «События»Адрес скрипта и слова — в настройке подписки
Бот-аккаунт и его токенБот пространства и токен ktx_b_…Вызовы API v4 переписать на API v1

Бот

Заведите бота: «Пространство → Интеграции → Боты → Новый бот». От имени бота приходят ответы его команд и подписок, а по желанию — и сообщения входящих вебхуков («Писать от имени: бота» в настройке вебхука). Бот не занимает оплачиваемого места в подписке и не зависит от того, в каких каналах сейчас человек, который завёл интеграцию.

Бот видит и получает сообщения только из каналов, куда его добавили (карточка бота → «Каналы»).

Слеш-команда

  1. Карточка бота → «Команды»: задайте /имя, адрес скрипта, метод (POST или GET), описание и подсказку.
  2. Kontext покажет проверочный токен — впишите его в скрипт вместо токена Mattermost.

Запрос содержит поля Mattermost (token, team_id, channel_id, channel_name, user_id, user_name, command, text, response_url, user_mentions, channel_mentions…) и заголовок Authorization: Token <токен>. Ответ — как в Mattermost: с ephemeral его видит только тот, кто вызвал команду, а с in_channel бот пишет его в канал (над ответом указано, кто вызвал). extra_responses, channel_id и response_url работают. Ответа скрипта Kontext ждёт до 30 секунд (через 3 секунды вызвавший видит «ждём ответ…») и запрос не повторяет — как и Mattermost.

Отличия: идентификаторы в полях выглядят как C<число>, U<число>, T<число>, а не 26-значные строки. Поля username, icon_url, goto_location и props в ответе не действуют — ответ всегда приходит от имени бота.

Исходящий вебхук

  1. Карточка бота → «События» → новая подписка, формат «Mattermost».
  2. Задайте слова-триггеры и условие («первое слово» или «начинается с»), каналы и тип тела запроса (JSON или форма) — как в Mattermost. Обязательно хотя бы одно: слова или каналы.

В теле запроса — поля Mattermost (token, team_id, team_domain, channel_id, channel_name, timestamp, user_id, user_name, post_id, text, trigger_word, file_ids). Ответ {"text": "…", "response_type": "comment"} попадает в тред сообщения, которое вызвало вебхук, а без response_type — в канал. Ответ пишет бот, username и icon_url не действуют. Сообщения входящих вебхуков, ответы скриптов и ответы команд исходящий вебхук не запускают — как и в Mattermost. Поэтому два скрипта не зациклятся, отвечая друг другу.

Отличия: кнопка «Проверить» в Kontext не отправляет запрос скрипту, а только проверяет адрес — скрипт Mattermost принял бы проверку за сообщение в канале. Если доставка не прошла за 5 секунд, Kontext повторяет её через 1 минуту, 5 минут, 30 минут, 2 часа и 6 часов. Журнал доставок — в карточке подписки.

Чего нет

  • API Mattermost v4. Скрипты, которые обращаются к /api/v4/…, придётся переписать на API v1: он небольшой и описан полностью.
  • Выбор канала из тела входящего вебхука. Поле channel не действует: вебхук пишет в свой канал. Скрипту, который одним вебхуком раскладывал сообщения по разным каналам, понадобится отдельный вебхук на каждый канал. @channel и @here из тела запроса присылают уведомления, только если у вебхука отмечено «Будить канал».
  • Серверные плагины. Сторонние программы подключаются только по HTTP: на одном сервере работают многие компании.
  • Интерактивные кнопки и диалоги в формате Mattermost (integration в attachments.actions, dialog.open) пока не поддерживаются. Кнопки и модальные окна работают в формате Slack — см. «Кнопки и окна».

Полное описание API — Документация → API.