Перейти к основному содержимому

Совместимость с Mattermost

Loop совместим с плагинами Mattermost: плагины для него пишутся так же, как для Mattermost, и многие готовые плагины Mattermost работают в Loop. Но есть важная деталь: возможности плагинов в Loop соответствуют Mattermost 9.11.7. Всё, что появилось в Mattermost позже, в Loop недоступно.

Коротко​

ЧтоВ Loop
API плагинов (p.API) и хуки серверной частиКак в Mattermost 9.11.7
Методы реестра клиентской части (registry)Как в Mattermost 9.11.7
Формат манифеста plugin.jsonКак в Mattermost 9.11.7 (без settings_schema.sections)
Версия, которую сообщает серверСобственная версия Loop, например 10.6.0. Она не означает Mattermost 10.6
Документация MattermostОписывает последнюю версию Mattermost. Сверяйтесь со списками ниже

Как не использовать лишнего​

Серверная часть: зафиксируйте версию пакета​

Серверная часть подключает пакет github.com/mattermost/mattermost/server/public, в котором описаны все методы API и хуки. Версия пакета, которая по API и хукам в точности соответствует Loop, — v0.1.6, и в шаблоне указана именно она. Поэтому компилятор сам не даст вызвать метод, которого в Loop нет.

Не обновляйте этот пакет. Если go get -u или IDE предложат более новую версию, в ней появятся методы, которые скомпилируются, но в Loop не сработают. Вернуть правильную версию:

go get github.com/mattermost/mattermost/server/public@v0.1.6
go mod tidy

Справочник для этой версии: plugin.API, plugin.Hooks, pluginapi.

Рекомендация

Если ваш плагин создан из старой версии шаблона (там был v0.1.16), переведите его на v0.1.6 командами выше. Если после этого код не собирается — значит, он вызывает методы, которых в Loop нет.

Клиентская часть: смотрите в таблицу реестра​

Для клиентской части такой защиты нет: вызов метода реестра, которого нет в Loop, завершится ошибкой registry.registerXxx is not a function в консоли браузера, и плагин не загрузится. Используйте методы из таблицы в разделе «Клиентская часть» — там только то, что есть в Loop.

Если плагин должен работать с разными версиями, проверяйте наличие метода перед вызовом:

if (typeof (registry as any).registerChannelHeaderIcon === 'function') {
// новый метод есть
} else {
// запасной вариант для Loop
}

Чего нет в Loop​

Эти возможности есть в свежих версиях Mattermost, но отсутствуют в Loop.

API серверной части​

ГруппаМетоды
Идентификатор плагинаGetPluginID — вместо него храните ID плагина константой в коде
Журнал аудитаLogAuditRec, LogAuditRecWithLevel
Группы пользователейCreateGroup, UpdateGroup, DeleteGroup, RestoreGroup, GetGroups, GetGroupByRemoteID, UpsertGroupMember, UpsertGroupMembers, DeleteGroupMember, GetGroupSyncable, GetGroupSyncables, UpsertGroupSyncable, UpdateGroupSyncable, DeleteGroupSyncable, CreateDefaultSyncableMemberships, DeleteGroupConstrainedMemberships
Свойства (property fields / values)RegisterPropertyGroup, GetPropertyGroup, CreatePropertyField, GetPropertyField, GetPropertyFieldByName, GetPropertyFields, SearchPropertyFields, CountPropertyFields…, UpdatePropertyField(s), DeletePropertyField, CreatePropertyValue, GetPropertyValue(s), SearchPropertyValues, UpdatePropertyValue(s), UpsertPropertyValue(s)…, DeletePropertyValue…
ПрочееSendToastMessage, RegisterChannelGuard, UnregisterChannelGuard, ReceiveSharedChannel…, UnregisterPluginRemoteForSharedChannels

Всё, чего нет в этом списке и есть в справочнике v0.1.6, в Loop работает. Читать группы в Loop можно: методы GetGroup, GetGroupByName, GetGroupMemberUsers, GetGroupsForUser есть.

Хуки серверной части​

ChannelMemberWillBeAdded, TeamMemberWillBeAdded, ChannelWillBeUpdated, ChannelWillBeArchived, ChannelWillBeRestored, DraftWillBeUpserted, ScheduledPostWillBeCreated, EmailNotificationWillBeSent, FileWillBeDownloaded, MessagesWillBeConsumedWithContext, OnSAMLLogin.

Если плагин содержит такую функцию, ошибки не будет — Loop просто никогда её не вызовет.

Реестр клиентской части​

registerChannelHeaderIcon, registerChannelIntro, registerChannelIconOverride, registerChannelSettingsTab, registerChannelTypeOption, registerChannelComposerBannerComponent, registerComposerPlaceholder, registerPostHeaderComponent, registerSearchComponents, registerSidebarBrowseOrAddChannelMenuAction, registerProductSwitcherMenuItem, registerRHSPluginPopoutListener, registerAIActionMenuItemComponent, registerAdminConsoleCustomSection, registerSystemConsoleGroupTable.

Манифест​

  • settings_schema.sections — разбиение настроек на секции. Используйте плоский список settings_schema.settings.

    Будьте внимательны: в описании манифеста в пакете v0.1.6 поле sections уже есть, поэтому сборка его не запретит. Но сервер Loop секции не читает.

Что будет, если вызвать недоступный метод​

  • Серверная часть. Метод вернёт пустой результат (nil, 0, пустую строку), а в журнале сервера появится запись RPC call to <Метод> API failed: rpc: can't find method .... Если код не проверяет результат, дальше, скорее всего, будет паника из-за обращения к nil, и Loop перезапустит плагин.
  • Клиентская часть. Ошибка is not a function в консоли браузера; если она случилась в initialize, всё, что плагин регистрирует после этого места, не появится.

Готовые плагины Mattermost​

Многие плагины Mattermost работают в Loop без изменений. Чтобы выбрать подходящую версию готового плагина:

  1. Найдите в истории релизов плагина версию, которая поддерживает Mattermost 9.11. Обычно это указано в заметках к релизу или в min_server_version его манифеста.
  2. Не ориентируйтесь только на min_server_version: Loop сообщает свою версию (10.x), поэтому плагин, требующий Mattermost 10.x, установится, но может не заработать.
  3. Установите плагин на тестовый сервер Loop и проверьте журнал сервера на ошибки RPC call to ... API failed и консоль браузера на ошибки is not a function.

Документация Mattermost​

Официальная документация developers.mattermost.com полезна как дополнительный источник: там есть примеры, описания компонентов и рекомендации по дизайну. Но она описывает последнюю версию Mattermost. Прежде чем использовать метод или хук оттуда, проверьте, что его нет в списках выше.