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

Интерактивные сообщения

Используйте интерактивные сообщения для упрощения сложных рабочих процессов, позволяя пользователям выполнять быстрые действия непосредственно через сообщение вашей интеграции. Например, они позволяют вашей интеграции:

  • создать напоминание (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"
    }
    }

В большинстве случаев ваша интеграция выполняет одно или оба из этих действий:

  1. Определение того, какое действие было запущено.

    Например, интеграция с GitHub может хранить что-то подобное в контексте:

    {
    "user_id": "rd49ehbqyjytddasoownkuqrxe",
    "post_id": "gqrnh3675jfxzftnjyjfe4udeh",
    "channel_id": "j6j53p28k6urx15fpcgsr20psq",
    "team_id": "5xxzt146eax4tul69409opqjlf",
    "context": {
    "repo": "mattermost/mattermost",
    "pr": 1234,
    "action": "merge"
    }
    }

    В приведенном выше примере, когда выбрана кнопка "Сообщение", ваша интеграция отправляет запрос на указанный URL-адрес с намерением объединить запрос на извлечение, идентифицированный контекстом.

  2. Аутентификация сервера. 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"
    }
    }

    Когда интеграция получает запрос, она может действовать на основе идентификатора действия.