Интерактивные сообщения
Используйте интерактивные сообщения для упрощения сложных рабочих процессов, позволяя пользователям выполнять быстрые действия непосредственно через сообщение вашей интеграции. Например, они позволяют вашей интеграции:
- создать напоминание (reminder)
- посмотреть список отложенных сообщений
- удалить ненужные напоминания
Для того чтобы попробовать это, вы можете использовать плагин Reminder с помощью slash-команды /remind list
.
Кнопки для сообщений
Добавьте кнопки в сообщение с помощью поля actions
для создания интерактивных сообщений для вашей интеграции.
Пример сообщения с кнопками
{
"attachments": [
{
"pretext": "This is the attachment pretext.",
"text": "This is the attachment text.",
"actions": [
{
"id": "message",
"name": "Ephemeral Message",
"integration": {
"url": "http://127.0.0.1:7357",
"context": {
"action": "do_something_ephemeral"
}
}
}, {
"id": "update",
"name": "Update",
"integration": {
"url": "http://127.0.0.1:7357",
"context": {
"action": "do_something_update"
}
}
}
]
}
]
}
В HTTP-ответе на этот запрос интеграция может выбрать обновление исходного сообщения и / или ответить эфемерным (ephemeral) сообщением:
{
"update": {
"message": "Updated!",
"props": {}
},
"ephemeral_text": "You updated the post!"
}
Действия с кнопками поддерживают параметр стиля для изменения цвета кнопки. Возможными значениями для стиля являются:
good
warning
danger
default
primary
success
Также возможно передать переменную темы или шестнадцатеричный код цвета (hex color), но мы не рекомендуем этот подход, поскольку он не будет устойчив в случае изменения темы.
Пример использования различных цветов
[
{
"id": "vote0",
"type": "button",
"name": "Yes",
"style": "default"
},
{
"id": "vote1",
"type": "button",
"name": "No",
"style": "primary"
},
{
"id": "addOption",
"type": "button",
"name": "Add Option",
"style": "warning"
},
{
"id": "deletePoll",
"type": "button",
"name": "Delete Poll",
"style": "success"
},
{
"id": "endPoll",
"type": "button",
"name": "End Poll",
"style": "danger"
}
]
Меню сообщений
Аналогично кнопкам, вы можете добавить в сообщения выпадающий список с помощью поля actions
в интерактивных сообщениях для вашей интеграции.
Пример сообщения с выпадающим списком
Идентификатор в массиве действий может состоять только из букв и цифр, никакие другие символы не допускаются.
{
"attachments": [
{
"pretext": "This is the attachment pretext.",
"text": "This is the attachment text.",
"actions": [
{
"id": "actionoptions",
"name": "Select an option...",
"integration": {
"url": "http://127.0.0.1:7357/actionoptions",
"context": {
"action": "do_something"
}
},
"type": "select",
"options": [
{
"text": "Option1",
"value": "opt1"
},
{
"text": "Option2",
"value": "opt2"
},
{
"text": "Option3",
"value": "opt3"
}
]
}
]
}
]
}
Меню сообщений для каналов
Можно предложить пользователю выбрать канал. Для поиска будут доступны только публичные каналы и команд, в которых состоит пользователь.
Пример сообщения с выбором каналов
Укажите в поле data_source
значение channels
в качетве необходимого действия как в примере ниже:
{
"attachments": [
{
"pretext": "This is the attachment pretext.",
"text": "This is the attachment text.",
"actions": [
{
"id": "actionoptions",
"name": "Select an option...",
"integration": {
"url": "http://127.0.0.1:7357/actionoptions",
"context": {
"action": "do_something"
}
},
"type": "select",
"data_source": "channels"
}
]
}
]
}
Меню сообщений для пользователей
Аналогично каналам, можно предложить пользователю выбрать другого пользователя. Пользователь может выбрать пользователя, который присутствует на данном инсталляции Time и состоит с текущим хотя бы в одной общей команде.
Пример сообщения с выбором пользователей
Укажите в поле data_source
значение users
в качестве своего действия кау в примере ниже:
{
"attachments": [
{
"pretext": "This is the attachment pretext.",
"text": "This is the attachment text.",
"actions": [
{
"id": "actionoptions",
"name": "Select an option...",
"integration": {
"url": "http://127.0.0.1:7357/actionoptions",
"context": {
"action": "do_something"
}
},
"type": "select",
"data_source": "users"
}
]
}
]
}
Параметры
Описание параметров действия для интерактивных сообщений в Time.
-
ID: Уникальный идентификатор для каждой записи. Может состоять только из символов латинского алфавита и цифр.
-
Name: Дайте своему действию описательное название.
-
URL: Time отправит
POST
запрос на указанный адрес, если пользователь нажмет на кнопку в сообщении (или выберет из выпадающего списка). В теле запроса содержится JSON.Принимаются относительные URL-адреса, что упрощает взаимодействие, когда кнопку отправляет плагин.
-
Context: Запросы, отправляемые на указанный URL, содержат идентификатор пользователя, идентификатор сообщения, идентификатор канала, идентификатор команды и любой контекст, который был указан в определении действия.
Если сообщение было с типом
select
, то контекст также содержит полеselected_option
со значением параметра, выбранного пользователем. Идентификатор сообщения можно использоваться, например, для удаления или редактирования оригинального сообщения после нажатия кнопки.Пример запроса с контекстом
Простой пример запроса приведен ниже:
{
"user_id": "rd49ehbqyjytddasoownkuqrxe",
"post_id": "gqrnh3675jfxzftnjyjfe4udeh",
"channel_id": "j6j53p28k6urx15fpcgsr20psq",
"team_id": "5xxzt146eax4tul69409opqjlf",
"context": {
"action": "do_something"
}
}
В большинстве случаев ваша интеграция выполняет одно или оба из этих действий:
-
Определение того, какое действие было запущено.
Например, интеграция с GitHub может хранить что-то подобное в контексте:
{
"user_id": "rd49ehbqyjytddasoownkuqrxe",
"post_id": "gqrnh3675jfxzftnjyjfe4udeh",
"channel_id": "j6j53p28k6urx15fpcgsr20psq",
"team_id": "5xxzt146eax4tul69409opqjlf",
"context": {
"repo": "mattermost/mattermost",
"pr": 1234,
"action": "merge"
}
}В приведенном выше примере, когда выбрана кнопка "Сообщение", ваша интеграция отправляет запрос на указанный URL-адрес с намерением объединить запрос на извлечение, идентифицированный контекстом.
-
Аутентификация сервера.
context
всегда остается конфиденциальным.Если ваша интеграция публичная, вы можете добавить токен в свой контекст. Пользователи не увидят значение этого поля:
{
"user_id": "rd49ehbqyjytddasoownkuqrxe",
"post_id": "gqrnh3675jfxzftnjyjfe4udeh",
"channel_id": "j6j53p28k6urx15fpcgsr20psq",
"team_id": "5xxzt146eax4tul69409opqjlf",
"context": {
"repo": "time/time-server",
"pr": 1234,
"action": "merge",
"token": "somerandomlygeneratedsecret"
}
}После этого, когда интеграция получает запрос, она может проверить, соответствует ли токен тому, который вы ранее сгенерировали. Этого достаточно, чтобы считать запрос легитимным.
Можно также проверять запрос передавая криптографическую подпись:
{
"user_id": "rd49ehbqyjytddasoownkuqrxe",
"post_id": "gqrnh3675jfxzftnjyjfe4udeh",
"channel_id": "j6j53p28k6urx15fpcgsr20psq",
"team_id": "5xxzt146eax4tul69409opqjlf",
"context": {
"repo": "time/time-server",
"pr": 1234,
"action": "merge",
"signature": "mycryptographicsignature"
}
}А можно подписывать и хранить контекст внутри своего приложения по ключу, который интеграция передает в контексте:
{
"user_id": "rd49ehbqyjytddasoownkuqrxe",
"post_id": "gqrnh3675jfxzftnjyjfe4udeh",
"channel_id": "j6j53p28k6urx15fpcgsr20psq",
"team_id": "5xxzt146eax4tul69409opqjlf",
"context": {
"action_id": "someunguessableactionid"
}
}Когда интеграция получает запрос, она может действовать на основе идентификатора действия.