Skip to main content

Telegram Bot Integration

1. Summary

Goal: Telegram Bot служит центральной точкой интеграции с Telegram для goLoot платформы. Обеспечивает регистрацию пользователей, отправку push-уведомлений, публикацию интерактивных квизов и tracking конверсий через session activation flow.

User Value:

  • Получение push-уведомлений о событиях платформы
  • Участие в квизах прямо в Telegram discussion group и заработок Scrap
  • Seamless onboarding через /start команду
  • Отслеживание конверсий из маркетинговых кампаний (UTM/Referral)

2. Business Logic

Types / Variants

Individual Push — отправка одному пользователю через PushSendingService

Mass Broadcast — массовая рассылка через BroadcastService:

  • Батчи по 25 пользователей
  • 1 секунда между батчами (соблюдение Telegram 30 msg/sec)
  • Retry с exponential backoff (3 попытки)

Scheduled Push — отложенная отправка через PushSchedulerService:

  • Cron каждую минуту проверяет PENDING pushes
  • Восстановление зависших SENDING > 10 мин

Click Tracking — отслеживание кликов через PushRedirect:

  • Короткие ссылки с уникальным кодом
  • Подсчёт clicksCount

Core Mechanics

1. /start Command Handler

User sends /start

Create or update User in DB

Save chatId for push notifications

Set botStatus = ACTIVE (or REACTIVATED if was BLOCKED)

Record UserBotInteraction

Send welcome message with WebApp button

2. Push Notification Flow

Admin creates push (PENDING)

PushSchedulerService picks up (scheduledFor <= NOW)

BroadcastService splits into batches (25 users)

PushSendingService sends to each user

Analytics recorded (SENT/FAILED)

Bot-blocked detection → update user status

3. Quiz Answer Flow

User clicks answer button

RateLimiterService checks limits (50/sec global, 10/min user)

Check duplicate answer

Restore shuffled order from PublishedQuiz.shuffledOrder

Validate answer correctness

Award Scrap + Update stats

Update message with real-time statistics

Process passive income for referrer

Update achievement/quest progress

4. Session Activation Flow

Frontend: /create-session (startParam, telegramId)

Parse session type (ref_*, content_*, UTM code)

Create InviteSession (PENDING state)

... Frontend validates subscription via TG Mini App ...

Frontend: /activate-session (initData with HMAC signature)

Validate Telegram signature (HMAC-SHA256)

Check auth_date < 24h

Activate sessions

Award bonuses (UTM: 200 scrap, Referral: via ReferralRewardService)

Update botStatus to ACTIVE

Protection

ActionRate LimitAuthValidation
check-botbotCheck (30/min)noneCheckBotRegistrationSchema
webhookbotCheck (30/min)noneTelegramWebhookSchema
create-sessionbotCheck (30/min)noneCreateSessionSchema
activate-sessionbotCheck (30/min)Telegram HMACActivateSessionSchema
quiz answerRateLimiter (50/sec + 10/min)none
broadcastmutations (5/min)adminBroadcastSchema
Детали реализации

См. Security Matrix для полного обзора защит.

Telegram Data Validation

HMAC-SHA256 проверка:

secretKey = HMAC-SHA256("WebAppData", BOT_TOKEN)
hash = HMAC-SHA256(secretKey, dataCheckString)

dataCheckString = отсортированные параметры через \n

auth_date должен быть < 24 часов

Реализация: bot.routes.ts:554-592

Retry Configuration (PushSchedulerService)
ПопыткаЗадержка
15 мин
215 мин
345 мин
Max60 мин

Формула: delay × 3^retryCount (capped at 60 min)

Edge Cases

Что видит пользователь (UI):

СитуацияUI поведение
Bot blockedPush не доставляется, botStatus → BLOCKED
Quiz expired (24h)Кнопки неактивны, сообщение удалено
NEW_USER 14+ daysАккаунт физически удалён (cleanup job)
Invalid TG signature400 Bad Request, "Invalid hash signature"
Photo upload failsFallback на текстовое сообщение
Backend Error Codes
КодHTTPОписание
INVALID_HASH_SIGNATURE400Невалидная подпись Telegram
AUTH_DATE_EXPIRED400auth_date старше 24 часов
SELF_REFERRAL400Попытка использовать свой реферальный код
SESSION_NOT_FOUND404Сессия не найдена
RATE_LIMIT_EXCEEDED429Превышен лимит запросов

3. ADR (Architectural Decisions)

Factory Pattern для инициализации бота

Проблема: Grammy Bot требует async инициализации (bot.init()) до того, как handlers смогут получить доступ к bot.botInfo. Стандартный конструктор не может быть async.

Решение: Статический factory метод TelegramBotService.create() гарантирует полную инициализацию бота до создания сервиса.

Альтернативы (отклонены):

  • Lazy initialization — усложняет код, потенциальные race conditions
  • Init в конструкторе с Promise — anti-pattern, нельзя await

Последствия: Сервис всегда имеет полностью инициализированный бот, чистый код.

Composition over Inheritance для сервисов

Проблема: TelegramBotService превращался в "God Object" с 800+ строками, обрабатывающими push, quiz, rate limiting, broadcast.

Решение: Выделение в фокусные сервисы (RateLimiterService, TelegramQuizService, PushSendingService, BroadcastService), композиция через dependency injection.

Последствия:

  • Single Responsibility Principle
  • Простое тестирование (mock отдельных сервисов)
  • Переиспользуемые сервисы
Критичная архитектура

TelegramBotService — это Orchestrator, не монолит. Вся бизнес-логика живёт в composed сервисах.

Fisher-Yates Shuffle с сохранением порядка

Проблема: Кнопки ответов квиза должны быть перемешаны случайно, но валидация ответа должна знать, какой оригинальный вариант был выбран.

Решение:

  1. Перемешать варианты используя Fisher-Yates
  2. Сохранить shuffledOrder массив в PublishedQuiz
  3. При ответе маппить shuffledIndex обратно в originalIndex

Последствия: Честная рандомизация + корректная валидация ответов.

Hybrid Debounce+Throttle для статистики квизов

Проблема: При высокой активности (100+ ответов в минуту) каждый ответ триггерит editMessage → риск достичь Telegram rate limit (30 msg/sec) и создать ненужную нагрузку на API.

Решение: In-memory MessageUpdateManager с hybrid подходом:

  • Debounce 1s — группировка burst-ов (rapid sequential updates)
  • Throttle 2s — минимальный интервал между API вызовами (защита от rate limits)
  • Force update после 10 pending — защита от infinite debounce при постоянном потоке
  • Fresh data fetching — запрос актуальной статистики в момент выполнения, а не в момент планирования

Альтернативы (отклонены):

  • Redis + Bull Queue — over-engineering для нашей нагрузки, добавляет зависимость
  • Pure debounce — риск infinite delay при постоянном потоке ответов
  • Pure throttle — не группирует rapid updates, больше API вызовов чем нужно
  • WebSockets — не поддерживается Telegram Bot API

Последствия:

  • 80-90% reduction API calls (100 ответов → 5-10 обновлений)
  • Real-time ощущение для пользователей (задержка 1-2 секунды)
  • Нет риска rate limit даже при viral quiz
Monitoring

Каждые 5 минут логируется эффективность: totalScheduled, totalPerformed, debounceMerged, savings.


4. Architecture

Services Overview

Key Components

КомпонентПутьОписание
TelegramBotServicebackend/src/domains/telegram/bot.service.tsOrchestrator, композиция сервисов, webhook/polling
TelegramQuizServicebackend/src/domains/telegram/services/telegram-quiz.service.tsПубликация квизов, обработка ответов, real-time stats
PushSendingServicebackend/src/domains/telegram/services/push-sending.service.tsОтправка push, bot-blocked detection
BroadcastServicebackend/src/domains/telegram/services/broadcast.service.tsМассовая рассылка, batch processing, retry
PushSchedulerServicebackend/src/domains/telegram/services/push-scheduler.service.tsCron-scheduling, stuck push recovery
RateLimiterServicebackend/src/domains/telegram/services/rate-limiter.service.tsGlobal/user rate limiting, auto-cleanup
TelegramSubscriptionServicebackend/src/domains/telegram/services/telegram-subscription.service.tsПроверка подписки на канал
Bot Routesbackend/src/domains/telegram/bot.routes.tsAPI endpoints, session flow, TG validation
Start Handlerbackend/src/domains/telegram/handlers/start.handler.ts/start command, user creation, chatId capture

5. Database Schema

Models

МодельОписаниеКлючевые поля
PushNotificationКонфигурация push + статистикаtitle, message, status, scheduledFor, sentCount
PushAnalyticsTracking доставки/открытийpushId, userId, action, messageId, errorCode
PushRedirectClick tracking с короткими ссылкамиshortCode, originalUrl, clicksCount
PushBatchЗаписи batch processingpushId, batchNumber, successCount, failureCount
UserBotInteractionЛогирование действий ботаuserId, action, metadata
PublishedQuizОпубликованные квизыquizId, messageId, shuffledOrder, expiresAt
InviteSessionUTM/Referral tracking сессииtype, telegramId, state, metadata

Relationships

Enums

EnumValuesUsage
BotRegistrationStateNEW_USER, ACTIVE, BLOCKED, REACTIVATEDUser.botStatus
PushStatusPENDING, SENDING, SENT, FAILED, CANCELLEDPushNotification.status
PushActionSENT, DELIVERED, OPENED, CLICKEDPushAnalytics.action
InviteTypeUTM, REFERRALInviteSession.type
InviteSessionStatePENDING, ACTIVATED, EXPIREDInviteSession.state

6. API Endpoints

МетодЭндпоинтОписаниеDocs
POST/api/tg/check-bot-registrationПроверка статуса бота->
POST/api/tg/webhookTelegram webhook receiver->
POST/api/tg/create-sessionСоздание UTM/referral сессии->
POST/api/tg/activate-sessionАктивация сессии после TG валидации->

Admin Notifications (Topic Routing)

AdminNotificationService отправляет уведомления в разные топики Telegram-группы:

ТопикСобытияОписание
SEASONSSEASON_STARTED, SEASON_ENDED, SEASON_REWARDS_NEEDED, SEASON_ENDING_SOONЖизненный цикл сезонов
RAFFLESRAFFLE_PRIZE_POOL_EMPTYПроблемы с розыгрышами
BUDGETPOOL_UPDATE, PERIOD_TRANSITIONЭкономика и пул удачи
SECURITYBUDGET_EXHAUSTED, SUSPICIOUS_CRAFTSБезопасность и фрод
BAN_APPEALBAN_APPEAL_SUBMITTEDАпелляции банов

Каждое событие содержит inline keyboard со ссылками на админ-панель.

Компонент: admin-notification.service.ts


  • Quizzes — CRUD контента квизов, статистика
  • Referrals — Обработка реферальных бонусов, passive income
  • UTM Tracking — Управление UTM кампаниями
  • Onboarding — Проверка подписок, регистрация
  • Profile — Управление User.botStatus
  • Seasons — Уведомления о сезонах