Разработка плагинов
Плагин — это дополнение, которое устанавливается прямо в Loop и меняет его поведение: добавляет кнопки и панели в интерфейс, собственные slash-команды, ботов, реагирует на сообщения и события. В отличие от вебхуков и REST API, плагину не нужен отдельный сервер: он работает внутри Loop.
Этот раздел рассчитан на тех, кто никогда не писал плагины. Если вы умеете запускать команды в терминале и хоть немного читали код на Go или JavaScript, этого хватит. Все сложные слова объясняются по ходу дела.
Loop совместим с плагинами Mattermost 9.11.7: плагины для Loop пишутся так же, как для Mattermost этой версии, с теми же инструментами. Возможности плагинов, которые появились в Mattermost позже, в Loop недоступны. Подробнее — в разделе Совместимость с Mattermost.
Когда нужен плагин
| Задача | Что выбрать |
|---|---|
| Отправлять уведомления из CI, мониторинга, CRM | Входящий вебхук — плагин не нужен |
Команда /что-то, которая вызывает ваш внешний сервис | Собственная slash-команда — плагин не нужен |
| Бот, который живёт на вашем сервере и работает через API | Бот-аккаунт и REST API |
| Своя кнопка, панель, пункт меню или окно в интерфейсе Loop | Плагин |
| Проверить или изменить сообщение до публикации (например, запретить слово) | Плагин |
| Реагировать на события внутри Loop: вход пользователя, создание канала, реакцию | Плагин |
| Интеграция, которую администратор ставит одним файлом, без отдельного сервера | Плагин |
Проще говоря: если задачу можно решить снаружи, решите её снаружи. Плагин нужен, когда надо встроиться внутрь Loop.
Из чего состоит плагин
Плагин — это один архив .tar.gz. Внутри три части:
my-plugin.tar.gz
├── plugin.json ← манифест: паспорт плагина (название, версия, настройки)
├── server/ ← серверная часть: программа на Go
└── webapp/ ← клиентская часть: код на React/TypeScript
| Часть | Где работает | Что умеет | Обязательна? |
|---|---|---|---|
Манифест plugin.json | — | Сообщает Loop, как называется плагин, какой он версии, какие у него настройки и где лежат остальные части | Да |
| Серверная часть (Go) | На сервере Loop, отдельным процессом | Slash-команды, боты, обработка сообщений и событий, своё HTTP API, хранение данных | Нет |
| Клиентская часть (React) | В браузере и десктоп-приложении пользователя | Кнопки, панели, пункты меню, свои типы сообщений, окна | Нет |
Можно сделать плагин только с серверной частью (например, бот-модератор) или только с клиентской (например, кнопка, которая открывает внешний сайт). Но обычно нужны обе: интерфейс спрашивает данные у сервера плагина.
Клиентская часть работает в веб-версии и десктоп-приложении Loop. Мобильное приложение код плагинов не загружает, но результаты серверной части — сообщения, боты, slash-команды — видны везде.
Как плагин работает внутри Loop
Браузер пользователя Сервер Loop
┌──────────────────────┐ ┌──────────────────────────────────┐
│ Loop │ │ Loop │
│ └ клиентская часть │ ── HTTP ───► │ │ хуки: «новое сообщение», │
│ плагина (React) │ ◄─ события ─ │ │ «вызвали команду» ... │
└──────────────────────┘ │ ▼ ▲ │
│ серверная часть ───┘ │
│ плагина (Go) API: «опубликуй», │
│ «найди канал» ... │
└──────────────────────────────────┘
- Хуки (hooks) — это события, о которых Loop сообщает плагину. Например,
MessageHasBeenPosted— «в канале появилось сообщение». Плагин пишет функцию с таким именем, и Loop вызывает её каждый раз, когда событие происходит. - API плагинов — набор функций, которыми плагин управляет Loop:
CreatePostпубликует сообщение,GetUserнаходит пользователя,KVSetсохраняет данные и т. д. - Реестр (registry) — то же для клиентской части: через него плагин говорит «добавь мою кнопку в шапку канала» или «покажи мою панель справа».
Серверная часть — отдельная программа. Loop запускает её сам при включении плагина и перезапускает, если она упала. Благодаря этому ошибка в плагине не роняет весь Loop.
Словарик
| Слово | Что значит |
|---|---|
| Манифест | Файл plugin.json с описанием плагина |
| ID плагина | Уникальное имя плагина, например ru.loop.plugin.hello. Никогда не меняйте его после выпуска: для Loop это будет другой плагин |
| Хук | Функция плагина, которую вызывает Loop при событии |
| Бандл | Собранный архив плагина .tar.gz, который загружается в Loop |
| Webapp | Клиентская часть: то, что выполняется в браузере |
| RHS (Right Hand Sidebar) | Правая боковая панель Loop, где открываются треды, поиск и панели плагинов |
| KV-хранилище | Простая база «ключ → значение», которую Loop даёт каждому плагину |
| Системная консоль | Раздел настроек для системного администратора Loop |
С чего начать
- Быстрый старт — соберите шаблон и установите свой первый плагин.
- Пошаговый пример — сделайте плагин с ботом, slash-командой, настройками и панелью в интерфейсе.
- Дальше используйте разделы про серверную и клиентскую части как справочник.
Разделы
Быстрый старт
За 15–20 минут вы соберёте плагин из готового шаблона и установите его в Loop. Код писать не придётся — цель в том, чтобы убедиться, что всё настроено, и понять цикл «изменил → собрал → установил».
Пошаговый пример
Сделаем из шаблона настоящий плагин. Он будет уметь:
Устройство проекта
Разберём, что лежит в стартовом шаблоне, какие файлы вы будете менять, а какие лучше не трогать.
Манифест plugin.json
Манифест — это «паспорт» плагина. По нему Loop узнаёт, как плагин называется, какой он версии, где лежат его серверная и клиентская части и какие настройки показать администратору. Файл лежит в корне проекта и попадает в архив плагина.
Серверная часть
Серверная часть плагина — программа на Go, которую Loop запускает рядом с собой. Она получает от Loop события (хуки) и управляет Loop через API плагинов. Здесь собраны все основные приёмы; каждый пример можно скопировать в проект из шаблона.
Клиентская часть
Клиентская часть плагина — код на React и TypeScript, который выполняется в браузере и в десктоп-приложении Loop. С её помощью плагин добавляет в интерфейс кнопки, панели, пункты меню, страницы и свой вид сообщений.
Отладка и частые ошибки
Что делать, когда плагин не собирается, не устанавливается, не запускается или делает не то.
Совместимость с Mattermost
Loop совместим с плагинами Mattermost возможности плагинов в Loop соответствуют Mattermost 9.11.7. Всё, что появилось в Mattermost позже, в Loop недоступно.