Обзор
Система конкурсов состоит из двух подсистем:- Ежедневные игры — мини-игры с мгновенными призами (дни подписки, баланс)
- Реферальные конкурсы — соревнования по привлечению рефералов с рейтингами
CONTESTS_ENABLED, но работают на разных моделях данных.
Участие в конкурсах доступно только пользователям с активной подпиской (платной или триальной).
Ежедневные игры
Архитектура
- Шаблон — определяет тип игры, расписание, призы
- Раунд — конкретный экземпляр игры с временным окном
- Попытка — одна попытка пользователя (уникальна: один раунд — одна попытка)
7 типов игр
Расписание и ротация
Каждый шаблон имеет:schedule_times— список времён запуска (форматHH:MM, через запятую)cooldown_hours— длительность раунда (по умолчанию 24ч)is_enabled— вкл/выкл для конкретной игры
ContestRotationService проверяет расписание каждые 60 секунд. При наступлении времени создаёт новый раунд и:
- Анонсирует в канале подписки (
CHANNEL_SUB_ID) - Рассылает всем пользователям с активной подпиской
Призы
Определение победителя
Используется атомарная проверка с блокировкой строки (SELECT FOR UPDATE):
- Пользователь отправляет ответ
- Стратегия игры проверяет правильность
- Если верно — блокируется строка раунда, проверяется
winners_count < max_winners - При победе приз выдаётся автоматически
Настройки шаблонов по умолчанию
Все 7 шаблонов создаются автоматически при первом запуске, но отключены по умолчанию. Включайте их по мере необходимости.
Реферальные конкурсы
Как работают
Реферальные конкурсы — это соревнования с ограниченным временем, где пользователи зарабатывают очки за привлечение рефералов.Типы конкурсов
Создание конкурса (FSM)
- Выбор режима:
referral_paidилиreferral_registered - Название конкурса
- Описание (опционально,
-для пропуска) - Текст призов (опционально)
- Дата начала (
дд.мм.гггг ЧЧ:ММ) - Дата окончания
- Время ежедневной сводки (
ЧЧ:ММили несколько через запятую)
Ежедневные сводки
- Отправляются в канал подписки и чат администраторов
- Поддержка нескольких времён в день (
daily_summary_times) - По завершении конкурса — финальная сводка (отправляется один раз)
- Содержание: название, топ-5, общее количество рефералов, призы, оставшееся время
Виртуальные участники
Администраторы могут добавлять “призраков” для создания видимости конкуренции:- Индивидуально — имя + количество рефералов
- Массово (“Массовка”) — 1-50 призраков с одинаковым количеством рефералов и случайными именами
- В админке отмечены иконкой призрака
- В публичном канале выглядят как обычные участники
Лидерборд
Лидерборд объединяет реальных участников (изreferral_contest_events) и виртуальных. Доступен из админки (топ-10) и в ежедневных сводках (топ-5).
Управление (админ-панель)
Ежедневные игры
Реферальные конкурсы
Видимость
Конкурсы имеют многоуровневую систему видимости:CONTESTS_ENABLED— глобальный переключатель (фоновые сервисы, обработчики)CONTESTS_BUTTON_VISIBLE— видимость кнопки “Конкурсы” в главном меню- Вкл/выкл шаблона — каждая ежедневная игра переключается отдельно
- Активность конкурса — каждый реферальный конкурс переключается отдельно
- Требование подписки — только пользователи с активной/триальной подпиской
Настройка
Cabinet и Web API
Cabinet (для пользователей)
GET /contests/count— количество доступных (неотыгранных) игрGET /contests— список доступных игр со статусомGET /contests/{round_id}— данные игрыPOST /contests/{round_id}/answer— отправка ответа
