Совместимость с 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 без изменений. Чтобы выбрать подходящую версию готового плагина:
- Найдите в истории релизов плагина версию, которая поддерживает Mattermost 9.11. Обычно это указано в заметках к релизу или в
min_server_versionего манифеста. - Не ориентируйтесь только на
min_server_version: Loop сообщает свою версию (10.x), поэтому плагин, требующий Mattermost 10.x, установится, но может не заработать. - Установите плагин на тестовый сервер Loop и проверьте журнал сервера на ошибки
RPC call to ... API failedи консоль браузера на ошибкиis not a function.
Документация Mattermost
Официальная документация developers.mattermost.com полезна как дополнительный источник: там есть примеры, описания компонентов и рекомендации по дизайну. Но она описывает последнюю версию Mattermost. Прежде чем использовать метод или хук оттуда, проверьте, что его нет в списках выше.