Telegram-бот для рассылки уведомлений подписчикам. Написан на TypeScript, поддерживает подписку/отписку через inline-кнопки, событийно-управляемую рассылку через очередь из базы данных MySQL.
- Подписка / отписка — пользователи управляют подпиской через Telegram inline-кнопки (
/subscribe,/unsubscribe) - Broadcast рассылка — отправка сообщений всем активным подписчикам с задержкой между сообщениями (flood protection)
- EventDispatcher — фоновый цикл опроса MySQL, забирает pending-сообщения порциями и публикует через RxJS Subject
- MySQL интеграция — connection pool, Observable-обёртки над
mysql(queryList, queryOnceOfList, query) - PM2 ready —
ecosystem.config.jsнастроен для продакшн-деплоя - Docker —
compose-dev.yamlдля локальной разработки - Secrets management —
.env.vaultдля безопасного хранения токенов
BHBot/
├── bot/
│ ├── bhbot.ts # Основной класс бота (Telegraf): handlers, subscribe/unsubscribe, broadcast
│ └── bhbot.model.ts # Интерфейсы BotConfig
├── events/
│ ├── driver.ts # EventDispatcher — RxJS-управляемый polling MySQL очереди сообщений
│ └── config.ts # BotEvent, EventDispatcherConfig типы
├── sql/
│ ├── sql.ts # DataBaseService — Observable MySQL pool (createPool)
│ └── sql.config.ts # Параметры подключения
├── index.ts # Точка входа — инициализация BHBot, EventDispatcher, DataBaseService
├── ecosystem.config.js # PM2 конфиг
└── compose-dev.yaml # Docker Compose для разработки
| Технология | Использование |
|---|---|
| TypeScript | Основной язык |
| Telegraf | Telegram Bot API wrapper |
| RxJS | EventDispatcher (Subject, Observable) |
MySQL / mysql pool |
Хранение очереди сообщений |
| PM2 | Process manager (продакшн) |
| Docker Compose | Разработка |
| dotenv-vault | Управление секретами |
# Установка зависимостей
npm install
# Настройка переменных окружения
cp .env.vault .env
# заполнить BHBOTTOKEN=<telegram_bot_token>
# Разработка (с автоперезагрузкой)
npm run dev
# Продакшн через PM2
pm2 start ecosystem.config.jsMySQL (bot_messages) → polling каждые 30s → порция BotEvent[]
→ RxJS Subject → broadcast подписчикам
Статусы сообщений в БД: pending → sending → (delivered)