Skip to content

Release 0.4.1

Choose a tag to compare

@batarelkin batarelkin released this 13 Sep 18:07
· 4 commits to master since this release

Релиз с исправлениями

Главное — клиент сам дожидается, пока 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 без ошибок; реакция на входящие сообщения вручную не проверялась.