Интерактивный Telegram-бот, написанный на Java 21 с использованием фреймворка Nyagram и Spring Boot. Бот позволяет пользователям выбрать свой часовой пояс и генерирует красивую картинку аналоговых часов с актуальным временем «на лету».
- Динамическая генерация изображений: Отрисовка циферблата, стрелок и текста происходит прямо в оперативной памяти (Java 2D API).
- Интерактивный интерфейс: Удобная пагинация (Paginator) для выбора часового пояса прямо в чате.
- Редактирование медиа: При нажатии кнопки «Обновить» бот не присылает новое сообщение, а элегантно заменяет саму картинку в уже отправленном сообщении.
- База данных: Выбранный пользователем часовой пояс сохраняется в In-Memory БД (H2) с помощью Spring Data JPA.
- Java 21
- Spring Boot 3.2.x (Data JPA)
- H2 Database (встроенная БД)
- Nyagram 1.1.5 (современный реактивный фреймворк для Telegram Bot API)
- Установленная Java 21 (JDK)
- Для Linux-серверов без графической оболочки необходимо наличие шрифтов (например,
sudo apt-get install fontconfig fonts-dejavu), иначе генерация изображений выдастjava.awt.HeadlessException.
Склонируйте репозиторий и откройте файл src/main/resources/application.yml.
Вставьте ваш токен бота и юзернейм, полученные у @BotFather:
nyagram:
bot-token: "ВАШ_ТОКЕН_ЗДЕСЬ"
bot-username: "ВашБот"
mode: POLLINGПроект использует Gradle Wrapper, поэтому вам не нужно устанавливать Gradle глобально. Откройте терминал в корне проекта и выполните:
Linux / macOS:
./gradlew clean bootRunWindows:
gradlew.bat clean bootRunЧтобы собрать готовый к деплою архив:
./gradlew clean build
java -jar build/libs/clock-1.0.0.jar/start— Приветственное сообщение и краткая справка./time— Показывает текущее время (если пояс установлен, генерирует картинку, иначе открывает меню выбора)./time set— Принудительно открывает меню выбора часового пояса с пагинацией.
src/main/java/pro/kaleert/challenge/clockbot/
├── ClockBotApplication.java # Главный класс приложения
├── controller/
│ ├── ClockController.java # Обработка /time, генерации и инлайн-кнопок
│ └── GeneralController.java # Обработка /start
├── domain/
│ └── UserTimezone.java # JPA Сущность для БД
├── repository/
│ └── UserTimezoneRepository.java # Spring Data репозиторий
└── service/
└── ClockImageGenerator.java # Логика рисования часов (Java 2D)
В ClockController реализован кастомный обходной путь для метода editMessageMedia через прямой HTTP-запрос (RestTemplate), чтобы обойти особенность работы с Multipart-файлами в текущей версии фреймворка Nyagram.
Сделано в рамках челенджа по фреймворку Nyagram.