Repository navigation
Release 0.4.0
Релиз приводит библиотеку в соответствие с MAX Bot API: с OpenAPI-схемой
0.0.33, по которой построен сайт документации, и с тем, как на деле
отвечает боевой сервер. Добавлены комментарии к постам в каналах, новые
типы событий и живой интеграционный набор тестов.
В релизе есть изменения, ломающие совместимость как по исходному коду,
так и бинарно. Таблица замен — в разделе «Migrating to 0.4.0» README
(«Переход на 0.4.0» в README_RU).
Координаты артефактов: ru.etsft.max:max-bot-api-*:0.4.0.
ЛОМАЮЩИЕ ИЗМЕНЕНИЯ
- Удалён
GET /chats:MaxBotAPI.getChats(),GetChatsQueryи модель
ChatList. MAX больше не поддерживает этот метод. CommentRemovedUpdate: вместо объектаmessageсобытие содержит
идентификаторы удалённого комментария:messageId,chatId,userId,
postId. Раньше все четыре терялись.OpenAppButton(text, webApp, contactId, payload): полеurlудалено,
webAppобязателен,contactIdпередаётся только вместе с ним. Добавлена
фабрикаofWebApp(text, webApp). Схема допускает кнопку только с
contact_id, но сервер её отклоняет («Field 'webApp' cannot be null»).MessageButton(text): полеmessageудалено. Кнопка отправляет в чат
собственный текст.Message.body()может бытьnull: так приходит сообщение, которое только
пересылает другое. Раньше такое сообщение не читалось, а внутри
message_createdпревращало событие вUnknownUpdate.ChatPatch.icon—PhotoAttachmentRequestPayloadвместоImage: иконку чата
можно задать внешним URL, токеном или загруженнымиphotos.lastActivityTime()вUser,UserWithPhoto,BotInfoиChatMember—
Longвместоlong:null, если время скрыто настройками приватности
(раньше читался как0).VideoAttachmentDetails: полеurlудалено, ссылки на варианты видео —
вurls(новая модельVideoUrls:mp4_1080…mp4_144,hls). Все поля,
кромеtoken, nullable: пока видео обрабатывается, их может не быть.ChatAdminsListсодержит списокChatAdmin(userId,permissions,alias)
вместоuserIds— в формате, который принимаетPOST /chats/{id}/members/admins.ContactAttachment.ContactPayload:tam_infoзаменён наmaxInfo(max_info),
добавленhashдля проверкиHMAC-SHA256(access_token, vcf_info).- Новые компоненты
record, меняющие их конструкторы:
MarkupElement—url,userLink,userId(ссылки и упоминания);
DialogClearedUpdate,DialogUnmutedUpdate,DialogRemovedUpdate,
BotStoppedUpdate—userLocale;DialogMutedUpdate—mutedUntilи
userLocale;MessageRemovedUpdate—postId;Subscription—time;
AudioAttachment—transcription;ChatPatch—description;
AddMembersResult—message;ChatMember—alias;MessageRecipient—
postIdиuserId;UserWithPhoto—firstNameиlastName. nameиfirstNameу пользователей теперь nullable: документация называет
nameустаревшим, но её собственный примерGET /meвозвращаетnameбез
first_name.MaxWebhookServer.register()иunregister()выбрасывают
IllegalStateException, если MAX отвечает HTTP 200 сsuccess=false.
Раньше отказ игнорировался и в лог писалась успешная регистрация.
НОВОЕ
- Комментарии к постам в каналах:
getComments,getCommentById,
sendComment,editComment,deleteCommentи моделиCommentMessage,
CommentMessageBody,CommentLinkedMessage,NewCommentBody,CommentList,
SendCommentResult. - Типы событий
dialog_cleared,dialog_muted,dialog_unmuted,
dialog_removed,comment_created,comment_edited,comment_removed—
классы событий и значенияUpdateType. Раньше на них нельзя было
подписаться, а пришедшие события становилисьUnknownUpdate. PATCH /me/commands— управление командами бота.- Кнопка
clipboard(ClipboardButton). - Параметр
disable_link_previewвPOST /answers. - Webhook: асинхронная обработка по флагу —
MaxWebhookServer.Builder.dispatchExecutor(...)и в Spring Boot
max.bot.webhook.async-dispatch=true. Ответ 200 уходит сразу, обработчик
выполняется после, поэтому долгая обработка не превышает 30 секунд,
отведённых MAX на ответ. По умолчанию поведение прежнее. ChatPermissionснова распознаёт старые названия прав (edit_message,
delete_message,post_edit_delete_message), которыми MAX всё ещё
отвечает;canonical()сводит старое название к новому.- Живой интеграционный набор
max-bot-api-integration-tests: вызывает
методыMaxBotAPIс настоящим токеном и падает, если ответ не удаётся
представить моделями. Запускается только вручную:
./gradlew :max-bot-api-integration-tests:liveTest.
ИСПРАВЛЕНИЯ
- Одно некорректное событие больше не срывает разбор всего
UpdateList.
Раньше маркер long polling не продвигался, сервер повторял ту же
пачку, и бот переставал получать события. Теперь неразборчивые
события, вложения и кнопки превращаются вUnknownUpdate,
UnknownAttachmentиUnknownButtonс исходным JSON, а
MaxLongPollingConsumerпредупреждает после трёх ошибок подряд. - Ошибка
attachment.not.readyраспознаётся: сервер отвечает HTTP 400 с
кодом через точки, а не 409. Код ошибки теперь виден в сообщении
MaxApiException. getVideoAttachmentDetailsбольше не падает на реальных ответах сервера.postAdminsотправляет тело, которое принимает API; раньше запрос всегда
отклонялся.getChatByLinkпринимает@name,name,max.ru/nameи
https://max.ru/name.
Ссылку-приглашение отклоняет сразу, без запроса.GET /subscriptionsне падает сNullPointerException, если подписка
содержит неизвестный библиотеке тип события.- Spring-регистратор webhook при
success=falseпишет в лог ошибку, а не
сообщение об успешной регистрации. - Примеры не падают на постах канала без
senderи на сообщениях безbody.
УСТАРЕВШЕЕ (@deprecated, будет удалено)
POST /chats/{chatId}/members(AddMembersQuery): MAX ограничил метод с
9 сентября 2026 года и удаляет его 30 сентября 2026 года.- Наследие TamTam, которого нет в документации MAX:
PATCH /me
(EditMyInfoQuery, замена —PATCH /me/commands),DELETE /chats/{chatId}
(боту отказано: нужно владение чатом),GET /chats/{chatLink}, параметр
user_idвGET /messages, кнопкаchat,SenderAction.MARK_SEEN,
ChatStatus.SUSPENDED, событияmessage_construction_request,
message_constructedиmessage_chat_createdвместе с ихUpdateType,
Message.constructor.
ДОКУМЕНТАЦИЯ
READMEиREADME_RU: работа с комментариями и командами бота, таблица
всех типов событий, срок ответа webhook (30 секунд), политика повторов
иasync-dispatch, лимит MAX в 2 операции в секунду на один чат, раздел
о переходе на 0.4.0. Исправлен примерMaxWebhookServer, который
вызывал несуществующий методapi(...).
ПРОВЕРКА
./gradlew build: модульные тесты, Checkstyle, SpotBugs — без ошибок.liveTestпротив боевого MAX API: 52 теста, 0 падений. Пропуски
вызваны окружением:webhookRoundTrip— не заданMAX_IT_WEBHOOK_URL
(в предыдущем прогоне этого дня проходил),deleteChat— MAX отказывает
боту,getChatByLink— в конфигурации ссылка-приглашение.