-
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, подменяется в тестах)WizardSteprenderer — pure-функцииpayload → (text, InlineKeyboardMarkup)для всех 17 шагов (12 single + 5 pool)IWizardDraftRepository— извлечён из sealedWizardDraftRepository, чтобы wizard тестировался hand-rolled fakes- Пул = один вызов shared
CreateSessionHandlerс NScheduledTimes. 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-changescleandotnet list package --vulnerable --include-transitivecleandotnet build— 0 warnings
Известное ограничение
Wizard сохраняет
VisibilityиClubIdв payload, но sharedCreateSessionCommandвGmRelay.Sharedпока их не принимает. Сессии, созданные через wizard, по умолчанию ведут себя как не-витринные. Это отдельная задача — когда shared handler научится showcase-видимости, в wizard ничего менять не придётся.Что вышло из скоупа
- Визуальные mock-апы из brainstorm-сессии (не требуются для корректности wizard'а)
- Шаг с загрузкой фото в
/newsession— оставлено, чтобы не ломать AOT-публикацию и не добавлять хрупкую Telegram download зависимость
Closes #111.
Downloads