33 KiB
🏗 Архитектура телеграм-бота
Обзор
Проект телеграм-бота был полностью реструктурирован для улучшения поддерживаемости, масштабируемости и надежности. Новая модульная архитектура обеспечивает четкое разделение ответственности между компонентами.
🏛 Структура архитектуры
Основные принципы
- Модульность - каждый компонент имеет четко определенную ответственность
- Разделение слоев - четкое разделение между API, бизнес-логикой и данными
- Зависимости - использование dependency injection для связывания компонентов
- Тестируемость - каждый модуль может быть протестирован независимо
- Расширяемость - новые функции добавляются без изменения существующего кода
Слои архитектуры
┌─────────────────────────────────────────────────────────┐
│ Презентационный слой │
│ (Telegram API, Handlers) │
├─────────────────────────────────────────────────────────┤
│ Бизнес-логика (Services) │
├─────────────────────────────────────────────────────────┤
│ Доступ к данным (Repositories) │
├─────────────────────────────────────────────────────────┤
│ База данных │
└─────────────────────────────────────────────────────────┘
📁 Структура проекта
telegram_bot/
├── core/ # Ядро приложения
│ ├── __init__.py
│ ├── application.py # Главный класс приложения
│ ├── config.py # Управление конфигурацией
│ ├── exceptions.py # Кастомные исключения
│ ├── command_router.py # Маршрутизатор команд
│ ├── message_router.py # Маршрутизатор сообщений
│ ├── menu_manager.py # Менеджер меню
│ ├── permissions.py # Система ролей и разрешений
│ ├── unified_router.py # Объединенный маршрутизатор
│ ├── middleware.py # Middleware компоненты
│ └── monitoring.py # Мониторинг и метрики
│
├── database/ # Слой базы данных
│ ├── __init__.py
│ ├── models.py # Модели данных
│ ├── repository.py # Репозитории для работы с БД
│ └── migrations/ # Миграции БД (планируется)
│
├── services/ # Бизнес-логика
│ ├── __init__.py
│ ├── role_service.py # Сервис управления ролями
│ ├── user_service.py # Сервис управления пользователями
│ ├── game_service.py # Игровая логика
│ ├── moderation_service.py # Модерация
│ ├── scheduler_service.py # Планировщик постов
│ ├── welcome_service.py # Сервис приветствий
│ └── donation_service.py # Донаты и достижения
│
├── handlers/ # Обработчики команд
│ ├── __init__.py
│ ├── base_handler.py # Базовый обработчик
│ ├── user_handlers.py # Пользовательские команды
│ ├── game_handlers.py # Игровые команды
│ ├── admin_handlers.py # Админские команды
│ ├── media_handlers.py # Обработка медиа
│ └── moderation_handlers.py # Модерация
│
├── utils/ # Вспомогательные утилиты
│ ├── __init__.py
│ ├── validators.py # Валидация данных
│ ├── formatters.py # Форматирование сообщений
│ └── helpers.py # Вспомогательные функции
│
├── games/ # Игровые модули
│ ├── __init__.py
│ ├── game_2048.py # Игра 2048
│ ├── game_tetris.py # Тетрис
│ ├── game_snake.py # Змейка
│ └── game_base.py # Базовый класс игр
│
├── new_bot.py # Точка входа новой архитектуры
├── bot.py # Старый монолитный файл (для совместимости)
├── requirements.txt
└── README.md
🔧 Компоненты системы
Core (Ядро)
Application (core/application.py)
Главный класс приложения, организующий работу всех компонентов:
- Инициализация всех модулей
- Настройка обработчиков
- Управление жизненным циклом
- Обработка ошибок верхнего уровня
- Интеграция новой системы маршрутизации с fallback на старую
Новая система маршрутизации
UnifiedMessageRouter (core/unified_router.py)
Объединенный маршрутизатор для всех типов обновлений:
- Единая точка входа для обработки сообщений
- Интеграция CommandRouter, MessageTypeRouter и ContextMenuManager
- Централизованное управление маршрутизацией
- Логирование и мониторинг
CommandRouter (core/command_router.py)
Центральный маршрутизатор команд:
- Регистрация и маршрутизация команд
- Проверка прав доступа через middleware
- Обработка callback запросов
- Метаданные команд (описания, категории)
MessageTypeRouter (core/message_router.py)
Маршрутизатор типов сообщений:
- Обработка текстовых сообщений по паттернам
- Роутинг медиафайлов (голос, видео, фото)
- Поддержка регулярных выражений для фильтрации
ContextMenuManager (core/menu_manager.py)
Менеджер контекстных меню:
- Управление доступностью меню на основе ролей
- Кеширование меню для производительности
- Динамическое формирование меню
Система разрешений
PermissionManager (core/permissions.py)
Менеджер разрешений:
- Иерархия ролей пользователей (USER, MODERATOR, ADMIN, SUPER_ADMIN)
- Проверка прав доступа к командам
- Определение роли по ID пользователя или правам в чате
- Матрица разрешений для каждой роли
UserRole (Enum)
Перечисление ролей:
- USER - обычный пользователь
- MODERATOR - модератор с правами предупреждений
- ADMIN - администратор с полными правами модерации
- SUPER_ADMIN - супер-администратор с полным доступом
Permission (Enum)
Перечисление конкретных разрешений:
- USE_BASIC_COMMANDS - базовые команды
- WARN_USERS - предупреждение пользователей
- BAN_USERS - блокировка пользователей
- MANAGE_SYSTEM - управление системой
Config (core/config.py)
Система управления конфигурацией:
- Загрузка из переменных окружения
- Поддержка файлов конфигурации
- Валидация обязательных параметров
- Типизация конфигурации
Exceptions (core/exceptions.py)
Кастомные исключения для единообразной обработки ошибок:
BotException- базовое исключениеValidationError- ошибки валидацииDatabaseError- ошибки базы данныхPermissionError- ошибки доступа
Database (База данных)
Models (database/models.py)
Модели данных с типизацией:
User- модель пользователяScore- очки и статистикаError- ошибки и отчетыScheduledPost- запланированные постыAchievement- достижения
Repositories (database/repository.py)
Паттерн Repository для доступа к данным:
UserRepository- работа с пользователямиScoreRepository- управление очкамиErrorRepository- ошибки и отчетыScheduledPostRepository- планировщик
Services (Бизнес-логика)
RoleService (services/role_service.py)
Управление ролями пользователей:
- Создание и инициализация ролей
- Назначение ролей пользователям
- Проверка принадлежности к ролям
- Управление правами доступа
UserService (services/user_service.py)
Управление пользователями и профилями:
- Создание и обновление профилей
- Расчет рейтингов и рангов
- Управление достижениями
- Статистика активности
- Интеграция с RoleService для проверки прав
WelcomeService (services/welcome_service.py)
Сервис персонализированных приветствий:
- Генерация приветственных сообщений
- Доступные команды по ролям
- Персонализация на основе роли пользователя
Handlers (Обработчики)
BaseHandler (handlers/base_handler.py)
Абстрактный базовый класс для всех обработчиков:
- Общие методы валидации
- Обработка ошибок
- Проверка прав доступа
- Логирование действий
UserHandlers (handlers/user_handlers.py)
Обработчики пользовательских команд:
/start,/help,/rank/leaderboard,/info- Обработка текстовых сообщений
Utils (Утилиты)
Validators (utils/validators.py)
Валидация входящих данных:
- Проверка ID пользователей и чатов
- Валидация текста и ссылок
- Проверка форматов времени и сумм
Formatters (utils/formatters.py)
Форматирование вывода:
- Форматирование сообщений пользователей
- Создание клавиатур и меню
- Экранирование HTML
Helpers (utils/helpers.py)
Вспомогательные функции:
- Безопасное выполнение функций
- Работа с текстом и числами
- Обработка ошибок
🚀 Запуск новой архитектуры
Требования
pip install python-telegram-bot==20.7 requests==2.31.0
Конфигурация
Создайте файл config_local.py или настройте переменные окружения:
# config_local.py
BOT_TOKEN = "ваш_токен_бота"
ADMIN_IDS = [123456789, 987654321]
OPENWEATHER_API_KEY = "ключ_погоды"
NEWS_API_KEY = "ключ_новостей"
OPENAI_API_KEY = "ключ_openai"
Или через переменные окружения:
export BOT_TOKEN="ваш_токен"
export ADMIN_IDS="123456789,987654321"
Запуск
python new_bot.py
🔄 Миграция со старой архитектуры
Пошаговый план миграции
-
Создание резервной копии
cp bot.py bot_old.py cp telegram_bot.db telegram_bot_old.db -
Параллельный запуск
- Запустите новую архитектуру:
python new_bot.py - Старая архитектура остается в
bot.pyдля совместимости
- Запустите новую архитектуру:
-
Тестирование функциональности
- Проверьте основные команды:
/start,/help,/rank - Протестируйте игры и модерацию
- Убедитесь в корректности работы базы данных
- Проверьте основные команды:
-
Постепенная миграция
- Переносите обработчики по одному модулю
- Тестируйте каждый модуль отдельно
- Обновляйте документацию
-
Полная замена
- Замените
bot.pyна новую версию - Обновите скрипты запуска
- Удалите старый код после подтверждения работоспособности
- Замените
📊 Преимущества новой архитектуры
Поддерживаемость
- Размер файлов: Основной файл уменьшен с 3500+ до < 500 строк
- Читаемость: Каждый модуль имеет четкую ответственность
- Отладка: Легче находить и исправлять ошибки
Масштабируемость
- Добавление функций: Новые возможности без изменения существующего кода
- Командная разработка: Каждый разработчик работает с отдельным модулем
- Тестирование: Unit и integration тесты для каждого компонента
Надежность
- Обработка ошибок: Единообразная обработка на всех уровнях
- Валидация: Проверка данных на входе и выходе
- Мониторинг: Логирование действий и ошибок
Производительность
- Оптимизация: Локализация узких мест и оптимизация
- Кеширование: Возможность добавления кеширования (Redis)
- База данных: Оптимизированные запросы
🔧 Расширение функциональности
Добавление новой команды
- Создайте обработчик в соответствующем модуле:
class NewHandlers(BaseHandler):
def get_command_handlers(self) -> Dict[str, Callable]:
return {
'new_command': self.handle_new_command
}
- Добавьте бизнес-логику в сервис:
class NewService:
async def process_new_feature(self, user_id: int) -> str:
# Логика обработки
pass
- Зарегистрируйте в приложении:
# В Application._initialize_handlers()
handlers['new'] = NewHandlers(self.config, NewService(...))
Добавление новой игры
- Создайте игровой модуль в
games/:
class NewGame(GameBase):
async def start_game(self, user_id: int) -> str:
# Логика игры
pass
- Добавьте обработчик в
GameHandlers:
async def handle_new_game(self, update: Update, context: ContextTypes):
# Обработка команды игры
pass
🧪 Тестирование
Структура тестов
tests/
├── __init__.py
├── test_services/
│ ├── test_user_service.py
│ ├── test_game_service.py
│ └── test_moderation_service.py
├── test_handlers/
│ ├── test_user_handlers.py
│ ├── test_admin_handlers.py
│ └── test_game_handlers.py
├── test_utils/
│ ├── test_validators.py
│ └── test_formatters.py
└── test_integration/
└── test_full_flow.py
Запуск тестов
# Установка зависимостей для тестирования
pip install pytest pytest-asyncio pytest-mock
# Запуск всех тестов
pytest
# Запуск тестов конкретного модуля
pytest tests/test_services/test_user_service.py
# Запуск с покрытием
pytest --cov=telegram_bot
📈 Мониторинг и аналитика
Метрики для отслеживания
- Производительность: Время ответа на команды
- Надежность: Количество ошибок и их типы
- Использование: Статистика команд и активность пользователей
- Ресурсы: Загрузка CPU, памяти, базы данных
Инструменты мониторинга
- Логирование: Структурированные логи с уровнями важности
- Метрики: Сбор метрик с помощью библиотеки (например,
prometheus_client) - Отчеты: Регулярные отчеты об ошибках и использовании
🔒 Безопасность
Меры защиты
- Валидация входных данных: Проверка всех пользовательских вводов
- Rate limiting: Ограничение частоты запросов
- Санитизация: Очистка данных перед сохранением
- Доступ к API: Безопасное хранение ключей API
Лучшие практики
- Принцип наименьших прав: Минимальные разрешения для выполнения задач
- Обработка ошибок: Не раскрытие внутренней информации в сообщениях об ошибках
- Логирование: Безопасное логирование без чувствительных данных
📚 Документация
Обновление документации
- README.md: Общая информация о проекте и запуске
- ARCHITECTURE.md: Подробное описание архитектуры (этот файл)
- API.md: Документация API для разработчиков
- DEPLOYMENT.md: Инструкции по развертыванию
Генерация документации
# Автоматическая генерация документации (если используется Sphinx)
sphinx-build docs/ docs/_build/
🔄 Новая система маршрутизации
Архитектура маршрутизации
Telegram Update
↓
UnifiedMessageRouter.handle_update()
↓
├── Команды (/start, /help) → CommandRouter
├── Текстовые сообщения → MessageTypeRouter
├── Callback запросы → CommandRouter (callback handlers)
├── Инлайн запросы → MessageTypeRouter
└── Медиа файлы → MessageTypeRouter
Принципы работы
- Единая точка входа: Все обновления проходят через
UnifiedMessageRouter - Разделение ответственности: Каждый тип обновлений обрабатывается специализированным роутером
- Проверка прав: Middleware проверяет разрешения перед выполнением команд
- Fallback система: При сбое новой системы активируется старая система обработчиков
- Логирование: Все операции маршрутизации логируются для отладки
Преимущества новой системы
- Централизованное управление: Все маршруты в одном месте
- Гибкость: Легко добавлять новые типы обработчиков
- Безопасность: Встроенная проверка прав доступа
- Отказоустойчивость: Fallback на старую систему
- Производительность: Кеширование и оптимизация маршрутов
📨 Архитектура обработки сообщений
Общая структура
Проект использует модульную архитектуру с четким разделением ответственности. Обработка сообщений происходит через многоуровневую систему маршрутизации с интегрированной системой разрешений.
Ключевые компоненты
1. UnifiedMessageRouter (core/unified_router.py)
Единая точка входа для всех обновлений от Telegram API:
- Определяет тип обновления (message, callback_query, inline_query, etc.)
- Распределяет обработку между специализированными роутерами
- Интегрирует CommandRouter, MessageTypeRouter и ContextMenuManager
- Логирует все операции маршрутизации
2. CommandRouter (core/command_router.py)
Центральный маршрутизатор команд:
- Регистрирует и маршрутизирует команды (начинающиеся с
/) - Проверяет права доступа через middleware
- Обрабатывает callback-запросы
- Содержит метаданные команд (описания, категории)
3. MessageTypeRouter (core/message_router.py)
Маршрутизатор типов сообщений:
- Обработка текстовых сообщений по паттернам (регулярные выражения)
- Роутинг медиафайлов (фото, видео, аудио, документы, голосовые)
- Поддержка регулярных выражений для фильтрации
- Регистрация обработчиков с учетом ролей пользователей
4. ContextMenuManager (core/menu_manager.py)
Менеджер контекстных меню:
- Управляет доступностью меню на основе ролей
- Кеширует меню для производительности
- Динамически формирует меню
- Проверяет права доступа к элементам меню
5. PermissionManager (core/permissions.py)
Система ролей и разрешений:
- Иерархия ролей: USER, MODERATOR, ADMIN, SUPER_ADMIN
- Проверка прав доступа к командам и функциям
- Определение роли по ID пользователя или правам в чате
- Матрица разрешений для каждой роли
6. Handlers (handlers/)
Обработчики команд и сообщений:
- BaseHandler - абстрактный базовый класс с общими методами
- GameHandlers - игровые команды и механики
- AdminHandlers - административные функции
- UserHandlers - пользовательские команды
- ModerationHandlers - модерационные функции
7. Services (services/)
Бизнес-логика:
- GameService - управление игровыми сессиями и логикой игр
- UserService - управление пользователями и профилями
- ModerationService - функции модерации
- WelcomeService - персонализированные приветствия
8. Database (database/)
Слой данных:
- Модели данных (User, Score, Warning, etc.)
- Репозитории для работы с БД
- Миграции базы данных
Потоки данных
Основной поток обработки сообщений:
Telegram Update
↓
UnifiedMessageRouter.handle_update()
↓
├── Команды (/start, /help) → CommandRouter
├── Текстовые сообщения → MessageTypeRouter (по паттернам)
├── Callback запросы → CommandRouter (callback handlers)
├── Инлайн запросы → MessageTypeRouter
├── Медиа файлы → MessageTypeRouter
└── Меню → ContextMenuManager
↓
Handlers (с проверкой прав)
↓
Services (бизнес-логика)
↓
Database (сохранение данных)
Обработка игровой команды:
Команда /play_game
↓
GameHandlers.handle_play_game()
↓
GameService.create_game_session()
↓
Возврат клавиатуры выбора игры
↓
Callback от пользователя
↓
MessageTypeRouter.route_callback()
↓
GameHandlers.handle_2048() или другая игра
↓
GameService.play_game_logic()
↓
Database (обновление статистики)
Обработка административных команд:
Команда /admin_stats
↓
AdminHandlers.handle_admin_stats()
↓ (проверка прав ADMIN)
ModerationService.get_moderation_stats()
↓
Database (запрос статистики)
↓
Возврат результатов пользователю
Система маршрутизации
Регистрация обработчиков:
- Command handlers: регистрируются в CommandRouter с указанием требуемой роли
- Message handlers: регистрируются в MessageTypeRouter с паттернами и ролями
- Callback handlers: регистрируются с паттернами callback_data
- Media handlers: регистрируются по типу медиа (photo, video, etc.)
Проверка прав доступа:
- Каждый обработчик имеет требуемую роль
- PermissionManager проверяет соответствие роли пользователя
- Иерархия ролей: SUPER_ADMIN > ADMIN > MODERATOR > USER
Точки интеграции для новой системы триггеров
1. UnifiedMessageRouter - основная точка интеграции
- Можно добавить новый тип обработки: триггеры
- Расширить
handle_update()для обработки триггерных событий
2. MessageTypeRouter - для текстовых паттернов
- Добавить регистрацию триггерных паттернов
- Интегрировать с базой данных триггеров
3. Services layer - бизнес-логика триггеров
- Создать TriggerService для управления триггерами
- Хранение условий и действий триггеров
- Выполнение действий при срабатывании
4. Database layer - хранение триггеров
- Добавить модели: Trigger, TriggerCondition, TriggerAction
- Репозитории для работы с триггерами
- Миграции для новых таблиц
5. Handlers - обработчики триггеров
- TriggerHandlers для управления триггерами через команды
- Интеграция с существующими обработчиками
Возможные триггерные события:
- Текстовые паттерны в сообщениях
- Команды пользователей
- Изменения статуса пользователей
- Временные события (cron-like)
- Игровые события (победы, достижения)
Архитектура интеграции триггеров:
Сообщение пользователя
↓
UnifiedMessageRouter (расширенный)
↓
├── Обычная обработка
└── Проверка триггеров → TriggerService.check_triggers()
↓
TriggerService.execute_actions()
↓
Отправка ответов/выполнение действий
Интеграция с Application
# В Application.__init__()
self._initialize_unified_router() # Создание компонентов
self._setup_unified_router() # Регистрация обработчиков
# В обработчиках команд
async def _handle_command_fallback(self, update, context, command, handler):
try:
if self.unified_router:
await self.unified_router.handle_update(update, context)
else:
await handler(update, context) # Fallback
except AttributeError:
await handler(update, context) # Безопасный fallback
🔮 Планы развития
Короткосрочные цели (1-3 месяца)
- Исправить синтаксическую ошибку в user_handlers.py
- Реализовать fallback для unified_router
- Добавить проверку инициализации unified_router
- Полная миграция на новую архитектуру
- Покрытие тестами > 80%
- Документация всех модулей
- Настройка мониторинга
Среднесрочные цели (3-6 месяцев)
- Веб-интерфейс для управления ботом
- Многоязычность (i18n)
- Миграция на PostgreSQL
- Добавление Redis для кеширования
Долгосрочные цели (6+ месяцев)
- Микросервисная архитектура
- Автоматическое масштабирование
- Расширенная аналитика и ML
- Интеграция с другими платформами
🤝 Вклад в развитие
Рабочий процесс
- Создание задачи в TODO.md или issue tracker
- Разработка в отдельной ветке
- Тестирование с покрытием > 80%
- Code review другими разработчиками
- Слияние после одобрения
Стандарты кода
- Типизация: Использование type hints для всех функций
- Документация: Docstrings для всех публичных методов
- Тестирование: Unit тесты для всех новых функций
- Стиль: Соблюдение PEP 8 и проекта стандартов
Последнее обновление: Октябрь 2025 Версия архитектуры: 2.0.0