Для разработчиков

Треды

Тред в Пачке — это отдельная ветка обсуждения, привязанная к конкретному сообщению. С его помощью можно вынести детали из общего чата и собрать в одном месте именно тех, кому важен этот контекст. По умолчанию участники чата сами решают, в каких тредах участвовать.

Сквозные треды

Главная особенность Пачки — сквозные треды. В отличие от классических тредов в других мессенджерах, где участником треда может стать только участник родительского чата, в Пачке тред — это самостоятельная единица доступа: можно подключить к нему любого сотрудника, не открывая ему сам чат. Участник сквозного треда видит сам тред и родительское сообщение — и больше ничего из чата.

Это снимает необходимость в дополнительных приватных чатах для разовых обсуждений и позволяет:

  • Подключать к обсуждению людей из других команд по контексту, не раскрывая историю канала
  • Подключать бота к конкретному треду, не добавляя его в родительский чат — точечная автоматизация без расширения прав
  • Точно делегировать вопрос конкретному человеку, не пересылая сообщение

Подробнее о пользовательской истории сквозных тредов — в статье в блоге Пачки.

Работа с тредом

Тред создаётся и наполняется двумя последовательными вызовами: сначала сам тред у сообщения, затем сообщения-комментарии в его чат.

Создайте тред у сообщения

Тред создаётся не в чате, а у конкретного сообщения — по его идентификатору. Метод идемпотентен: если у сообщения уже есть тред, в ответе вернётся существующий. Ответ содержит полную модель Thread.

Создание треда
pachca threads add 154332686 \  --json \  --token YOUR_ACCESS_TOKEN

Тред нельзя создать у удалённого сообщения — метод вернёт 404 Not Found. У сообщения, которое само находится в треде, тред тоже создать нельзя — будет 400 Bad Request.

Напишите комментарий в тред

Комментарий в тред — это обычное сообщение через POSTНовое сообщение. Есть два равнозначных способа адресации.

Способ 1: через идентификатор тредаentity_type: "thread" и entity_id равным thread.id.

pachca messages create \  --entity-type=thread \  --entity-id=265142 \  --content="Это первый комментарий в треде" \  --token YOUR_ACCESS_TOKEN

Способ 2: через идентификатор чата тредаentity_id равным thread.chat_id, без entity_type. Чат треда — самостоятельный чат, и сообщение, отправленное в него, окажется в треде. Этот способ удобен, если в вашем коде уже есть общая логика отправки сообщений по chat_id.

pachca messages create \  --entity-id=2637266155 \  --content="Это первый комментарий в треде" \  --token YOUR_ACCESS_TOKEN

Чтобы получить все комментарии треда — вызовите GETСписок сообщений чата с chat_id равным thread.chat_id.

Структура треда

Тред — это одновременно объект и отдельный чат. С ним связаны несколько идентификаторов, и в работе важно их не путать:

ПолеЧто обозначаетКогда нужно
idИдентификатор треда как сущностиВ методе GETИнформация о треде
chat_idИдентификатор чата треда — отдельного чата, в котором хранятся комментарии тредаДля отправки комментария POSTНовое сообщение и для чтения GETСписок сообщений чата
message_idИдентификатор родительского сообщения, к которому привязан тредПри создании треда — в методе POSTСоздание треда
message_chat_idИдентификатор чата, в котором находится родительское сообщениеДля проверки контекста

Когда вы получаете обычное сообщение через API, в поле thread будет короткий объект { id, chat_id }, если у этого сообщения есть тред (то есть сообщение — родительское для треда). Если сообщение само живёт внутри треда (это комментарий), у него будет:

  • chat_id — равно thread.chat_id (чат треда)
  • root_chat_id — идентификатор родительского чата, в котором был создан тред
  • entity_type"thread"

Список доступных тредов

Метод GETСписок тредов возвращает все доступные вам треды:

  • Треды, в которых вы состоите напрямую — вас явно добавили в сам тред (в том числе через сквозной тред, без участия в родительском чате).
  • Все треды чатов, в которых вы состоите — даже если в самом треде вы не участвуете. Например, если вы участник канала «Маркетинг», в выдачу попадут все треды этого канала, в том числе те, в которые вы лично не писали.

Публичные дискуссии, в которых вы не состоите, не попадают в выдачу — даже если в них есть открытые треды. Чтобы бот получал такие треды через этот метод, его нужно явно добавить либо в сам тред, либо в родительский чат.

Параметры last_message_at_after и last_message_at_before фильтруют по времени последнего сообщения в треде — это удобно для дайджестов «что обсудили за день» и «что нового с моего последнего захода». Поле updated_at треда автоматически обновляется при каждом новом сообщении в нём.

Участники треда

У треда, как у самостоятельного чата, есть свой список участников, отдельный от родительского чата. Получить его можно методом GETСписок участников чата с chat_id треда.

Добавить участника в тред можно двумя способами:

  • Через API — метод POSTДобавление участников, передав chat_id треда (не родительского чата). Если добавляемый сотрудник не состоит в родительском чате, он станет участником сквозного треда: будет видеть тред и родительское сообщение, но не остальную историю.
  • Через упоминание @nickname в комментарии треда — добавляется автоматически. Для ботов работает только если бот настроен как публичный (см. Доступы бота).

Если нужно упомянуть участника в треде, но не добавлять его автоматически — передайте skip_invite_mentions: true в теле метода POSTНовое сообщение. Упоминание останется в тексте, но в участники треда человек не попадёт. Полезно, когда бот ссылается на сотрудника для контекста, не втягивая его в обсуждение.

Удаление участника и выход из треда работают так же, как для обычных чатов: методы DELETEУдаление участника из чата и DELETEВыход из чата с chat_id треда.

Бот в треде

Бот может состоять в треде без участия в родительском чате — это и есть кейс сквозного треда для бота. После добавления:

  • Бот получает исходящие вебхуки о событиях треда: новые комментарии, реакции, изменения состава
  • В payload вебхука chat_id указывает на чат треда, а root_chat_id (в полях сообщения) — на родительский чат
  • Бот может писать в тред, ставить реакции, открывать формы — всё через тот же chat_id треда

Если бот публичный, его можно подключить к треду упоминанием. Если приватный — нужно добавить через API или интерфейс.