Skip to content

Latest commit

 

History

History
232 lines (191 loc) · 14.4 KB

File metadata and controls

232 lines (191 loc) · 14.4 KB

Анализ проекта IgorBot

Общее описание

IgorBot - это Telegram-бот на Java (Spring Boot), предоставляющий множество функций для взаимодействия в чатах: планировщик задач, подписки, статистика, развлечения и др.

Технологический стек

  • Framework: Spring Boot 3.2.0 ✅ (мигрировано с 2.2.6)
  • Java: 21 ✅ (мигрировано с 14)
  • База данных: PostgreSQL (production), H2 (dev)
  • ORM: JPA/Hibernate (Jakarta Persistence API)
  • Миграции: Flyway
  • Telegram API: telegrambots 6.1.0
  • Web: Spring MVC + Thymeleaf
  • Security: Spring Security 6 с токен-аутентификацией (мигрировано с Spring Security 5)
  • Дополнительно: AWS Polly (TTS), JAVE (аудио конвертация), Lombok

Архитектура

Основные компоненты

1. CompositeBot (CompositeBot.java)

  • Главный класс бота, наследуется от TelegramLongPollingBot
  • Обрабатывает все входящие обновления через цепочку обработчиков (UpdateHandler)
  • Логирует использование бота и ошибки
  • Автоматически покидает чаты при отсутствии прав

2. Система обработчиков (Handlers)

Архитектура на основе паттерна Chain of Responsibility:

  • Базовые интерфейсы: UpdateHandler, MessageHandler, TextMessageHandler, CallbackQueryHandler
  • Обработчики регистрируются в botConfig.xml и выполняются последовательно
  • Первый обработчик, который вернет true, обрабатывает обновление

Основные обработчики (36 штук):

  • Планировщик: SchedulerNotifyHandler, SchedulerExtendNotifyHandler, UnschedulerNotifyHandler
  • Подписки: CreateSubscriptionHandler, GetSubscriptionsByKeyHandler, ListenSubscriptionKeysHandler, CancelSubscriptionHandler
  • Статистика: LinkToAdminPageHandler, LinkToChatPageHandler
  • Развлечения: ChoiceMaker, ChoiceMakerWithContext, RandomAnswer, SongSinger, Repeater, Counter
  • Утилиты: ReplyLayoutSwitcher, SayTextHandler, PinnedForwarder, ChatBridge
  • Помощь: HelpMainPostCommandHandler, HelpInlineListHandler, HelpInlineFeatureHandler

3. Система фильтров (Filters)

Фильтры определяют, должен ли обработчик реагировать на сообщение:

  • CommandFilter - команды
  • RegexpFilter - регулярные выражения
  • AllowedChatFilter / DeniedChatFilter - белые/черные списки чатов
  • ChatConfigFilter - настройки чата
  • RandomFilter - случайная вероятность
  • MessageFilter - общий фильтр сообщений

4. Модели данных (JPA Entities)

  • MessageEntity - сообщения (PK: chatId + messageId)
  • UserEntity - пользователи
  • ChatEntity - чаты
  • ChatConfig - настройки чата (key-value)
  • MessageTask - задачи планировщика
  • Subscription - подписки на триггеры
  • BotUsageLog - логи использования бота

5. Сервисы

  • MessageCollectorService - сбор и сохранение сообщений
  • MessageSchedulerService - планирование задач
  • SubscriptionService - управление подписками
  • ChatConfigService - настройки чатов
  • VoiceService - работа с голосовыми сообщениями (AWS Polly)
  • AudioConverterService - конвертация аудио (JAVE)
  • SongRepository - репозиторий песен

6. Веб-интерфейс

Spring MVC контроллеры с Thymeleaf:

  • AdminController (/admin) - административная панель со статистикой
  • ChatController (/chat/{chatId}) - статистика по чату
  • TokenController - генерация токенов доступа
  • FileController - работа с файлами
  • Безопасность: токен-аутентификация через URL (/stats/{token})

7. Планировщик задач (Scheduler)

Сложная система парсинга и выполнения задач:

  • Парсеры: ScheduledMessageParser, SpecificTimeParser, ShiftTimeParser, ScheduledWithRepetitionParser
  • Поддержка периодических задач с интервалами
  • Поддержка таймзон пользователей
  • Возможность отложить/отменить задачу

8. Статистика (Datasource)

Система сбора и отображения статистики:

  • StatisticDataSource - базовый интерфейс
  • ChatStatisticDataSource, UserStatisticDataSource
  • Множество query-классов для различных метрик
  • Визуализация через Morris.js и Bootstrap

Ключевые функции бота

  1. Планировщик задач - напоминания с поддержкой периодичности
  2. Подписки - автоматические ответы на триггеры
  3. Выбор решений - помощь в принятии решений
  4. Статистика чата - детальная аналитика по сообщениям
  5. Певец песен - интерактивное пение
  6. Переключение раскладки - конвертация RU/EN
  7. Развлечения - шутки, повторы, счетчики
  8. Мосты между чатами - пересылка сообщений

Выполненные миграции (2024)

✅ Миграция на Spring Boot 3.2.0 и Java 21

  • Обновлен Spring Boot с 2.2.6 до 3.2.0
  • Обновлена Java с 14 до 21
  • Все javax.* заменены на jakarta.*:
    • javax.persistence.*jakarta.persistence.*
    • javax.servlet.*jakarta.servlet.*
    • javax.annotation.*jakarta.annotation.*
  • Обновлен Spring Security:
    • WebSecurityConfigurerAdapterSecurityFilterChain bean
    • @EnableGlobalMethodSecurity@EnableMethodSecurity
    • thymeleaf-extras-springsecurity5thymeleaf-extras-springsecurity6
  • Исправлены проблемы с Date/LocalDateTime:
    • Репозитории возвращают Date (UTC из БД)
    • Конвертация в timezone пользователя происходит в контроллерах
  • Заменены устаревшие аннотации:
    • @Required@Autowired(required = true)
  • Обновлены устаревшие методы:
    • TaskScheduler.schedule(Runnable, Date)schedule(Runnable, Instant)
    • StringUtils.isEmpty()StringUtils.hasText()
    • ConcurrentTaskScheduler()ConcurrentTaskScheduler(Executor)
  • Обновлен Dockerfile на Java 21 (eclipse-temurin)

Проблемы и технический долг

⚠️ Оставшиеся предупреждения (не критично)

  1. Deprecated методы (требуют обновления):

    • TaskScheduler.schedule(Runnable, Date) в Counter.java и MessageSchedulerServiceImpl.java - нужно заменить на schedule(Runnable, Instant)
    • StringUtils.isEmpty() в ScheduledWithRepetitionParser.java и ShiftTimeParser.java - нужно заменить на hasText()
  2. Raw types (непараметризованные generic-типы):

    • ScheduledFuture без параметров в MessageSchedulerServiceImpl.java (5 мест)
    • BotApiMethod без параметров в тестах
  3. Проблемы с тестами:

    • UpdateInfoProviderTest.java - не может найти AbsSenderStub
    • Некоторые тесты используют raw types
  4. Сгенерированные метамодели Hibernate:

    • Ошибки в target/generated-sources/annotations/ - это нормально, файлы генерируются при компиляции
    • После первой успешной компиляции ошибки исчезнут

Потенциальные проблемы

  1. Безопасность:

    • Токены хранятся в памяти (ConcurrentHashMap) - теряются при перезапуске
    • Нет защиты от brute-force на токены
    • Короткие токены (8 символов) могут быть уязвимы
  2. Производительность:

    • Все обработчики вызываются последовательно для каждого обновления
    • Нет кэширования для часто используемых данных
    • TODO в VoiceServiceImpl: "TODO caching"
  3. Конфигурация:

    • Смешанный подход: XML-конфигурация (botConfig.xml) + Java-аннотации
    • Рекомендуется мигрировать на Java-конфигурацию для лучшей поддержки
  4. Тестирование:

    • Мало тестов (16 файлов в test)
    • ChoiceMakerTest.java содержит только TODO комментарий
    • Некоторые тесты требуют обновления после миграции
  5. Документация:

    • Минимальная документация в коде
    • TODO комментарии указывают на незавершенную работу:
      • Прокси-аутентификация (407 ошибка) в AppConfig.java
      • Обработка удаленных сообщений в планировщике (MessageSchedulerServiceImpl.java)
      • Кэширование голосовых сообщений (VoiceServiceImpl.java)
  6. Миграции БД:

    • Множество миграций (18 файлов) - возможны проблемы с производительностью
    • Некоторые миграции содержат обратную совместимость (V4.1)

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

src/main/java/ru/javazen/telegram/bot/
├── handler/          # Обработчики обновлений (36 файлов)
├── filter/           # Фильтры для обработчиков
├── model/            # JPA сущности (Jakarta Persistence)
├── repository/       # JPA репозитории
├── service/          # Бизнес-логика
├── scheduler/         # Планировщик задач
├── datasource/       # Источники данных для статистики
├── web/              # Веб-контроллеры
├── security/         # Безопасность и аутентификация (Spring Security 6)
├── help/             # Система помощи
├── util/             # Утилиты (22 файла)
├── logging/          # Логирование в Telegram
└── config/           # Конфигурация

Рекомендации по улучшению

Высокий приоритет

  1. Выполнено: Миграция на Spring Boot 3.x и Java 21
  2. Выполнено: Исправление ошибок компиляции с Date/LocalDateTime
  3. Важно: Заменить оставшиеся deprecated методы (TaskScheduler.schedule, StringUtils.isEmpty)
  4. Важно: Исправить raw types в MessageSchedulerServiceImpl
  5. Важно: Обновить тесты после миграции

Средний приоритет

  1. Желательно: Заменить XML-конфигурацию на Java-конфигурацию
  2. Желательно: Добавить персистентное хранилище для токенов
  3. Желательно: Добавить кэширование для часто используемых данных
  4. Желательно: Улучшить покрытие тестами

Низкий приоритет

  1. Опционально: Обновить зависимости до актуальных версий (AWS SDK, JAVE и др.)
  2. Опционально: Улучшить документацию в коде

Особенности реализации

  • Гибкая архитектура: Легко добавлять новые обработчики через конфигурацию
  • Многофункциональность: Бот объединяет множество различных функций
  • Веб-интерфейс: Удобная статистика через браузер
  • Расширяемость: Система фильтров позволяет гибко настраивать поведение
  • Современный стек: Использует актуальные версии Spring Boot 3 и Java 21
  • Правильная работа с timezone: Данные хранятся в UTC, конвертация происходит на уровне представления

Статус миграции

Миграция завершена успешно

  • Проект компилируется на Spring Boot 3.2.0 и Java 21
  • Все критические ошибки исправлены
  • Остались только предупреждения (deprecated методы, raw types)
  • Проект готов к использованию

Примечание: После первой успешной компиляции будут сгенерированы метамодели Hibernate (MessageEntity_, MessagePK_ и т.д.), что устранит ошибки в target/generated-sources/annotations/.