Imbot 26.600.0: частичный успех пересылки в REST v2 и стикеры между порталами
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
Imbot 26.600.0 меняет результат imbot.v2.Chat.Message.send при пересылке сообщений. Успешный REST-вызов теперь может содержать ошибки отдельных пересылок, поэтому одного общего статуса ответа боту мало. Заодно сетевой бот научился передавать стикеры между порталами.
Новое
Пересылка возвращает результат по сообщениям
В ответе imbot.v2.Chat.Message.send теперь есть id, uuidMap и failureMap. Поле legacyFailureMap добавляется, когда оно непустое. Это нужно ботам, которые отправляют текст вместе с пачкой пересылок: успешно отправленный текст больше не превращает весь вызов в ошибку из-за одной неудачной пересылки.
Обработчик успешного ответа должен просмотреть карту неудач. Например, этот собственный фрагмент клиента оставляет диагностику, даже если REST-вызов завершился успешно:
function inspectSendResult(result) {
const failures = result.failureMap ?? {};
if (Object.keys(failures).length > 0) {
console.warn('Часть сообщений не переслана', failures);
}
return result.uuidMap ?? {};
}
Пересылка работает и без отдельного текста. Если после подготовки нет полей нового сообщения, контроллер не вызывает CIMMessenger::Add(), а отправляет только пересланные сообщения. В таком ответе id может быть null: смотрите также результат пересылки.
Стикер проходит через сетевого бота
При обмене сообщениями между порталами сетевой бот добавляет параметр IMOL_STICKER. В нём передаются ID стикера и набора, тип набора, абсолютный адрес изображения, ширина и высота. На принимающей стороне из параметра собирается компонент NetworkStickerMessage. Для сообщения из одного стикера текстом становится placeholder стикера.
У Bitrix\ImBot\Bot\Network появилась константа MESSAGE_PARAM_NETWORK_STICKER и protected static-метод buildNetworkStickerCarrier(array $messageParams): ?array. Если расширяете сетевого бота, это точка сборки параметров стикера.
Действие БП принимает блоки сообщения
У действия «Сообщение от бота» появилось скрытое свойство messageBlocksJson. JSON проходит через Im\V2\Message\BlocksBuilder\BuilderService и попадает в параметры сообщения как блоки. Обычного поля в карте свойств дизайнера нет, но при ручном сохранении дизайнер сохраняет это значение вместе с buttons.
Что сломается
Проверьте все ID до отправки
Контроллер загружает forwardIds в ForwardMessageCollection и сравнивает число найденных сообщений с числом уникальных переданных ID. Если хотя бы одно сообщение не найдено, весь вызов отклоняется с MessageError::NOT_FOUND. Текст из того же запроса тоже не отправляется: ошибка проверяется до его отправки. Раньше такой проверки не было.
Обычный список числовых ID теперь обрабатывается без передачи числового индекса как UUID. UUID назначается пересылке только при строковом ключе forwardIds.
Разберите успех отдельно от полной неудачи
После проверки входных данных контроллер возвращает ошибку, только если не отправил ни текст, ни одну пересылку. Раньше ошибка сервиса пересылки делала ошибочным весь вызов, хотя текст к тому времени уже мог уйти. Старый обработчик, который реагирует только на общую REST-ошибку, теперь пропустит частичную неудачу. Проверяйте failureMap в успешном ответе и не повторяйте всю пачку без разбора результата: в ней уже могут быть отправленные сообщения.
CopilotChatBot заодно перестал отвечать на сообщения с SCHEDULED_TASK_RUN_ID: запланированная задача сама отправляет запрос в сервис, и второй ответ бота больше не дублирует её работу.