Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🌤 WeatherBot (Nyagram Example)

Java 21 Spring Boot Nyagram

Пример полнофункционального Telegram-бота, написанного на Java 21 с использованием фреймворка Nyagram.

Этот проект демонстрирует, как создавать сложных ботов без "лапши" из кода, используя декларативный подход, встроенную машину состояний (FSM) и валидацию данных.

✨ Возможности

  • ☁️ Текущая погода: Получение данных через OpenWeatherMap API.
  • 🔄 Интерактивность: Inline-кнопки для обновления прогноза без отправки новых сообщений.
  • 🗣 FSM (Диалоги): Пошаговый сценарий подписки на рассылку (/subscribe -> Город -> Время).
  • 🛡 Валидация: Автоматическая проверка формата времени через аннотацию @Validation.
  • 🧠 Обработка ошибок: Глобальный перехват исключений через @BotControllerAdvice.
  • ⏰ Планировщик: Рассылка прогнозов по расписанию (Spring Scheduler).
  • 💾 База данных: Использование Spring Data JPA и H2 (In-Memory) для хранения подписок.

🛠 Технологии

  • Java 21
  • Spring Boot 3.2
  • Nyagram 1.1.1 (Telegram Bot Framework)
  • H2 Database (для простоты запуска, данные хранятся в памяти)
  • Lombok

🚀 Запуск проекта

1. Предварительные требования

  1. Установленный JDK 21.
  2. Токен Telegram-бота (получить у @BotFather).
  3. API ключ OpenWeatherMap (бесплатно на openweathermap.org).

2. Настройка

Откройте файл src/main/resources/application.yml и вставьте свои ключи:

nyagram:
  bot-token: "ВАШ_ТЕЛЕГРАМ_ТОКЕН"
  bot-username: "ИМЯ_ВАШЕГО_БОТА"

weather:
  api-key: "ВАШ_OPENWEATHER_API_KEY"

3. Сборка и запуск

Linux / macOS:

./gradlew bootRun

Windows:

gradlew.bat bootRun

🎮 Как использовать

После запуска бота отправьте команду /start.

Доступные команды:

Команда Описание
/start Приветствие и клавиатура меню
/weather <город> Узнать погоду (например, /weather Москва)
/subscribe Начать диалог подписки на рассылку
/help Справка по командам

Алиасы: Вы также можете писать "погода Лондон" или "подписаться" (или использовать кнопки меню).

📂 Структура проекта

  • command/ — Обработчики команд (/start, /weather).
  • flow/ — Сценарии FSM (диалог подписки).
  • handler/ — Обработчики Callback-запросов (нажатия кнопок).
  • config/ — Конфигурация, включая глобальный обработчик ошибок (GlobalErrorHandler).
  • service/ — Бизнес-логика (запросы к API погоды).
  • scheduler/ — Периодические задачи (рассылка).
  • entity/ & repository/ — Работа с базой данных.

📝 Пример кода (FSM с Валидацией)

Вот как просто реализуется шаг диалога с проверкой формата времени:

@StateAction(value = "WAIT_TIME", clearAfter = true) 
public void onTimeInput(
        CommandContext ctx, 
        @SessionData("city") String city, // Данные из прошлого шага
        @Validation(pattern = "^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$") String time // Валидация
) {
    // Этот метод выполнится ТОЛЬКО если время введено верно
    repository.save(new Subscription(ctx.getChatId(), city, time));
    ctx.reply("✅ Подписка оформлена!");
}

Made with ❤️ using Nyagram
Документация фреймворка

About

Simple WeatherBot

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages