Repository navigation
Release 0.4.1
Релиз с исправлениями
Главное — клиент сам дожидается, пока MAX обработает загруженное вложение, поэтому отправка сообщения сразу после загрузки больше не падает с attachment.not.ready. Кроме того, исправлены откат long polling и примеры, README приведён в соответствие с кодом.
Изменений, ломающих совместимость по исходному коду или бинарно, нет.
Координаты артефактов: ru.etsft.max:max-bot-api-*:0.4.1.
ИЗМЕНЕНИЕ ПОВЕДЕНИЯ
sendMessage(и любой запрос, получившийattachment.not.ready) больше не выбрасываетAttachmentNotReadyExceptionсразу: клиент повторяет тот же запрос до 30 секунд и блокирует вызывающий поток на это время. Прежнее поведение —MaxClientConfig.builder().attachmentReadyTimeout(Duration.ZERO).
НОВОЕ
MaxClientConfig.attachmentReadyTimeout(по умолчанию 30 секунд,DEFAULT_ATTACHMENT_READY_TIMEOUT) и одноимённый метод builder-а. Пока MAX отвечаетattachment.not.ready, клиент повторяет неизменённый запрос с паузами 0,5 с, 1 с, 2 с, далее каждые 3 с; исключение выбрасывается только после таймаута. Повтор безопасен: отклонённое сообщение не создаётся, токен загрузки остаётся действительным. Работает и дляenqueue(). Прежний 8-аргументный конструкторMaxClientConfigсохранён.RetryPolicy.attachmentRetryDelay(int)— расписание этих пауз.- Примеры
WebhookBot(MaxWebhookServerс секретом, dispatch executor, подписка при старте и отписка при остановке) иCommentsBot(отвечает на комментарии к постам, пропуская собственные).
ИСПРАВЛЕНИЯ
MaxLongPollingConsumer: откат после ошибок опроса останавливался на 16 секундах, хотя javadoc и README обещают1 → 2 → 4 → 8 → 16 → 30с. Теперь доходит до 30 секунд.- Примеры:
- команда
./gradlew :max-bot-api-examples:run -PmainClass=...из их описаний не работала — в модуль добавлен плагинapplication(без-PmainClassзапускаетсяEchoBot); KeyboardBotпадал на callback безpayloadи не отвечал на него;ImageUploadBotпередавал токен endpoint-а вместе сphotos,VideoUploadBotиAudioUploadBotбрали токен не из результата загрузки; все три при запуске называли себяFileUploadBot;FileUploadBotоставлял временный файл при ошибке загрузки;MaxBotAPIтеперь закрывается во всех примерах.
- команда
- Плавающий тест
MaxLongPollingConsumerTest.malformedUpdateInBatchStillAdvancesMarker: требовал третий опрос, который на загруженном CI не всегда успевал дойти до сервера до проверки.
ДОКУМЕНТАЦИЯ
READMEиREADME_RU:- ожидание
attachment.not.readyи настройкаattachmentReadyTimeout; - Webhooks: пример
register()шёл до создания сервера;start()— это HTTP, для HTTPS —start(SSLContext); значения по умолчанию порта и пути; секрет передаётся в MAX приregister(); - Spring Boot: нужны
max-bot-api-jacksonи, для webhook,spring-boot-starter-web; собственный бинMaxBotAPIдля настроек клиента; - Long polling: реальное расписание отката, ошибки обработчика отката не вызывают;
pollTimeout; - в иерархию исключений добавлены
MaxMethodNotAllowedExceptionиAttachmentNotReadyException; закрытиеMaxBotAPIиMaxUploadAPI; запуск и полный список примеров; ответ на комментарий; - ссылки, бейджи и правила участия ведут на GitHub, ветка
master.
- ожидание
- POM: SCM connection указывает на GitHub, а не на закрытый GitLab.
СБОРКА
- Версии зависимостей и плагинов вынесены в Gradle Version Catalog (
gradle/libs.versions.toml); разрешаемые версии не изменились.
ПРОВЕРКА
./gradlew build: модульные тесты, Checkstyle, SpotBugs, пороги покрытия — без ошибок.liveTestпротив боевого MAX API: 52 теста, 42 успешно, 0 падений. В логе видно, как MAX дважды ответилattachment.not.ready, а клиент повторил отправку через 500 мс и она прошла. 10 тестов пропущены окружением: разрушительные и интерактивные шаги отключены на время прогона, не заданMAX_IT_WEBHOOK_URL, вMAX_IT_CHAT_LINKссылка-приглашение.- Все примеры с настоящим токеном запускаются и опрашивают API без ошибок; реакция на входящие сообщения вручную не проверялась.