• v3.8.0 71080aeab6

    v3.8.0 — Wizard создания игр (issue #111)
    Deploy Telegram Bot / build-and-push (push) Successful in 5m3s
    Deploy Telegram Bot / scan-images (push) Successful in 1m40s
    Deploy Telegram Bot / deploy (push) Successful in 37s
    Stable

    Toutsu released this 2026-06-04 15:50:32 +03:00 | 36 commits to main since this release

    🧩 Wizard для создания игры

    /newsession в Telegram-боте больше не принимает текстовый шаблон — теперь это интерактивный пошаговый сценарий с inline-кнопками. Поддерживает и одиночные игры, и пулы (несколько связанных слотов под одним batch_id).

    Что нового для пользователей

    • /newsession открывает wizard: тип → одиночная или пул
    • Внутри: inline-кнопки везде, где есть выбор (тип, формат, видимость, waitlist, подтверждение)
    • Свободный текст там, где кнопок мало: название, описание, дата/время, комментарии
    • Back / Reset / Cancel на любом шаге
    • Черновик сохраняется в wizard_drafts (TTL 24 ч) — бот можно перезапустить, и /newsession подхватит черновик через «Continue»
    • Одиночная игра и пул — один и тот же wizard: пул = type=pool + цикл добавления слотов (общие system/duration задаются на уровне пула)
    • Предпросмотр перед финальным созданием
    • Ошибки валидации возвращают на конкретный шаг, а не сбрасывают весь процесс

    Архитектура

    • wizard_drafts (V031): JSONB payload + 24 ч TTL, чистится WizardDraftCleanupService раз в минуту
    • GameCreationWizard — чистый state machine без I/O: читает/пишет WizardPayload из JSONB, делегирует Telegram-вызовы в ITelegramWizardMessenger (AOT-safe, подменяется в тестах)
    • WizardStep renderer — pure-функции payload → (text, InlineKeyboardMarkup) для всех 17 шагов (12 single + 5 pool)
    • IWizardDraftRepository — извлечён из sealed WizardDraftRepository, чтобы wizard тестировался hand-rolled fakes
    • Пул = один вызов shared CreateSessionHandler с N ScheduledTimes. Shared handler сам создаёт N сессий с одним batch_id
    • Router-level takeover: пока есть активный черновик, любое обновление в (chat, thread, owner) уходит в wizard, минуя обычные handlers

    Тесты

    • 66 wizard-юнит-тестов — state-machine переходы, pool-slot lifecycle, валидация, рендер, cancel/back
    • 8 handler/router тестов — submit-валидация, missing fields, cleanup-tick, router delegation, stale-command reset
    • 2 Testcontainers-плейсхолдера (skipped локально, выполняются в CI на реальной Postgres)
    • Полный прогон: 564 passed, 2 skipped, 0 failed
    • dotnet format --verify-no-changes clean
    • dotnet list package --vulnerable --include-transitive clean
    • dotnet build — 0 warnings

    Известное ограничение

    Wizard сохраняет Visibility и ClubId в payload, но shared CreateSessionCommand в GmRelay.Shared пока их не принимает. Сессии, созданные через wizard, по умолчанию ведут себя как не-витринные. Это отдельная задача — когда shared handler научится showcase-видимости, в wizard ничего менять не придётся.

    Что вышло из скоупа

    • Визуальные mock-апы из brainstorm-сессии (не требуются для корректности wizard'а)
    • Шаг с загрузкой фото в /newsession — оставлено, чтобы не ломать AOT-публикацию и не добавлять хрупкую Telegram download зависимость

    Closes #111.

    Downloads