• 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
  • v3.7.1 771ff9be34

    Release v3.7.1 — Hotfix: /showcase 500
    Deploy Telegram Bot / build-and-push (push) Successful in 5m11s
    Deploy Telegram Bot / scan-images (push) Successful in 1m30s
    Deploy Telegram Bot / deploy (push) Successful in 38s
    Stable

    Toutsu released this 2026-06-03 22:43:09 +03:00 | 55 commits to main since this release

    🔧 Patch v3.7.1 — Hotfix: каталог игр возвращал 500

    В v3.7.0 на странице /showcase падал 500: Dapper.AOT не мог материализовать ShowcaseSessionRow — в SELECT не хватало колонок PublicationMode / IsMembersOnly, добавленных в DTO.

    🧩 Что вошло в релиз

    • src/GmRelay.Web/Services/SessionService.cs — в SELECT-ы GetShowcaseSessionsAsync и GetShowcaseSessionAsync добавлены s.publication_mode AS PublicationMode и (s.publication_mode = 'ClubOnly') AS IsMembersOnly. Конструкторы ShowcaseSessionDto теперь пробрасывают значения из row.
    • Версия синхронизирована: Directory.Build.props, NavMenu.razor, compose.yaml (3 image refs), deploy.yml, CampaignTemplatesNavigationTests → 3.7.1.

    🗡 Что это даёт

    • /showcase снова рендерится: витрина игр со всеми фильтрами (когда/места/система/тип/формат).
    • Заодно в DTO через SQL корректно приходят PublicationMode и IsMembersOnly — раньше они захардкожились в "Catalog" / false, что скрывало настоящее значение режима публикации.
    • Никаких изменений в миграциях или API: это чистый bugfix.

    📦 Версия и деплой

    • Версия 3.7.1.
    • Docker-образы с тегом 3.7.1 собраны и запушены.
    • Gitea Actions run #289 (PR checks) — success.
    • Gitea Actions run #290 (deploy) — success.
    • PR #120 — merged.
    Downloads
  • v3.7.0 6951c72f3c

    Release v3.7.0 — Приватные клубные витрины
    Deploy Telegram Bot / build-and-push (push) Successful in 5m29s
    Deploy Telegram Bot / scan-images (push) Successful in 1m29s
    Deploy Telegram Bot / deploy (push) Successful in 39s
    Stable

    Toutsu released this 2026-06-03 11:58:07 +03:00 | 57 commits to main since this release

    🛠 Release v3.7.0 — Приватные клубные витрины

    Issue #110: GM теперь может публиковать сессии только в клубной витрине, не показывая их в общем каталоге. Доступ к таким играм — только для одобренных участников клуба.

    🧩 Что вошло в релиз

    Data model (миграция V030)

    • Новая таблица club_memberships со статусами Pending/Active/Rejected/Left, частичный уникальный индекс ux_club_memberships_one_active.
    • sessions.publication_mode (None/Catalog/ClubOnly/Both) вместо is_public, CHECK-ограничение и пересозданные partial-индексы.
    • portfolio_games.publication_mode (default Both) для совместимости с Portfolio-фичей.

    Domain

    • GmRelay.Shared.Domain.PublicationMode с методами ToDatabaseValue, FromDatabaseValue, IsVisibleInCatalog, IsVisibleToClubMembers.

    Сервисы

    • ISessionStore расширен 12 методами для membership/showcase.
    • AuthorizedMembershipService (новый) — подача заявки, одобрение/отклонение GM-ом с проверкой прав.
    • SessionService — SQL с учётом членства (EXISTS на club_memberships со статусом Active).
    • AuthorizedSessionServiceSetSessionPublic* переименованы в SetSessionPublicationMode*.

    UI

    • MyClubMemberships.razor (/profile/memberships) — Active/Pending/History + кнопки покинуть/отозвать.
    • ClubApplications.razor (/group/{GroupId}/applications) — owner/co-GM, approve/reject.
    • PublicClub.razor — публичная и members-only секции, CTA «Подать заявку» и «Войти как участник».
    • PublicMasterProfile.razor — member-aware видимость клубных сессий.
    • EditSession.razor и GroupDetails.razor — булев toggle заменён на 4-state <select>.
    • GroupDetails.razor — карточка «Заявки участников (N)» со ссылкой на /applications.
    • NavMenu.razor — ссылка «Мои клубы» → /profile/memberships, версия v3.7.0.
    • PublicLayout.razor — ссылка «Клубы» → /showcase.

    Тесты (493 всего, все проходят)

    • Новые файлы: PublicationModeTests, ClubMembershipsTests, ClubShowcaseSourceTests, AuthorizedMembershipServiceTests.
    • Обновлены: PublicClubPagesTests, AuthorizedSessionServiceTests, AuthorizedPortfolioServiceTests, CampaignTemplatesNavigationTests.

    Версионирование

    • Directory.Build.props, compose.yaml, .gitea/workflows/deploy.yml, NavMenu.razor — синхронизированы на 3.7.0.

    🗡 Что это даёт

    • Клубы получают приватную витрину: игры видны только одобренным участникам, а не всему каталогу.
    • GM сами управляют составом клуба: заявка (Pending) → одобрение (Active) или отказ (Rejected).
    • Никаких сюрпризов в общем /showcase — ClubOnly-игры туда не попадают.
    • Управление режимом публикации — в Web-дашборде (тот же UX, что и раньше, но с 4 опциями вместо 2).

    📦 Версия и деплой

    • Версия обновлена до 3.7.0 (Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml).
    • Docker-образы опубликованы с тегом 3.7.0.
    • Gitea Actions run #287 (PR checks) — success.
    • Gitea Actions run #288 (deploy) — success (bot, discord, web — healthy).
    • PR #119 — merged.
    Downloads
  • v3.6.0 992f71c0e4

    Release v3.6.0 — Портфолио прошедших игр
    Deploy Telegram Bot / build-and-push (push) Successful in 5m36s
    Deploy Telegram Bot / scan-images (push) Successful in 1m44s
    Deploy Telegram Bot / deploy (push) Successful in 39s
    Stable

    Toutsu released this 2026-06-02 18:38:48 +03:00 | 60 commits to main since this release

    🛠 Feature 3.6.0 — Портфолио прошедших игр

    Добавлено публичное портфолио завершённых приключений на витрине мастера: мастера могут оформлять проведённые игры с обложкой, описанием, составом ГМов и модерируемыми отзывами игроков. Публичная страница /portfolio/{slug} дополняет каталог будущих игр из /showcase (3.4.0) и публичные профили мастеров (3.5.0).

    🧩 Что вошло в релиз

    • src/GmRelay.Bot/Migrations/V029__add_completed_game_portfolios_and_reviews.sql — таблицы portfolio_games, portfolio_game_sessions, portfolio_game_masters, portfolio_game_reviews + statement-level триггеры + deferred constraint trigger validate_public_portfolio_game_required_links, атомарно проверяющий обязательные связи опубликованной игры
    • src/GmRelay.Web/Services/Portfolio/PortfolioContracts.cs — sanitized public DTOs (PublicPortfolioCard, PublicPortfolioGame, PublicPortfolioMaster, PublicPortfolioReview) без приватных UUID / storage keys / platform info; protected DTOs для редактора и модерации
    • src/GmRelay.Web/Services/Portfolio/IPortfolioStore.cs — 16 методов: 3 публичных чтения, 11 protected CRUD, 2 метода модерации отзывов
    • src/GmRelay.Web/Services/Portfolio/PortfolioValidation.cs — slug regex + trim/collapse, title/description/format/review body нормализация
    • src/GmRelay.Web/Services/Portfolio/Covers/LocalPortfolioCoverStorage.cs — JPEG/PNG/WebP signature validation (не только content-type), 5 MB cap, SafeKeyPattern от path traversal, temp-file cleanup на ошибке
    • src/GmRelay.Web/Services/Portfolio/PortfolioService.cs — публичные чтения мастер/клуб/detail, protected CRUD с advisory lock pg_advisory_xact_lock(20260530, 108), friendly error mapping на UniqueViolation (slug), publish-валидация (slug + description + cover + ≥1 past session + ≥1 master) перед is_public = true
    • src/GmRelay.Web/Services/Portfolio/AuthorizedPortfolioService.cs — все 9 management-методов под IsGroupManagerAsync; cross-club → SessionAccessDeniedException; review submission требует publicationConsent = true; cover replace: new → DB → old с cleanup новой обложки на ошибке; delete: row first, cover second
    • src/GmRelay.Web/Components/Pages/PortfolioEditor.razor/portfolio/manage/{PortfolioGameId:guid} (Authorize) с cover upload, draft/publish, delete, модерация отзывов
    • src/GmRelay.Web/Components/Pages/GroupCompletedSessions.razor/group/{GroupId:guid}/completed со списком прошедших сессий и Добавить в портфолио quick action
    • src/GmRelay.Web/Components/Portfolio/PortfolioCardGrid.razor — переиспользуемая сетка карточек для публичных страниц
    • src/GmRelay.Web/Components/Pages/PublicPortfolio.razor/portfolio/{slug} (PublicLayout, без [Authorize]) с обложкой, описанием, составом ГМов, одобренными отзывами, формой отзыва с consent-чекбоксом
    • src/GmRelay.Web/Components/Pages/PublicMasterProfile.razor, PublicClub.razor — portfolio card grid под существующим upcoming-session контентом
    • src/GmRelay.Web/Components/Pages/GroupDetails.razor, SessionHistory.razor — секция Проведённые приключения с badges и quick action
    • src/GmRelay.Web/Services/Portfolio/PortfolioCoverStorageExtensions.cs + Program.cs — регистрация IPortfolioCoverStorage и AuthorizedPortfolioService в DI
    • compose.yaml — Docker volume portfolio_covers для Bot и Web сервисов
    • .env.example — добавлен PORTFOLIO_COVERS_VOLUME_NAME=gmrelay_portfolio_covers
    • README.md — новая секция "📚 Портфолио завершённых приключений" + portfolio bullets в Web Dashboard
    • docs/c4-system-context.md — обновлены System Context и Container диаграммы, новая Level 3 Component диаграмма для портфолио с границей IPortfolioCoverStorage (future S3 replacement)
    • Тесты: PortfolioContractsTests, PortfolioValidationTests, LocalPortfolioCoverStorageTests, PortfolioCoverRuntimeWiringTests, PortfolioServiceSourceTests (включая regression assertion на неизменённый interval '4 hours' для showcase), AuthorizedPortfolioServiceTests, PortfolioPagesTests (Tasks 6+7)
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml (3 образа), deploy.yml, README.md → 3.6.0

    🗡 Что это даёт

    • Мастера могут публиковать проведённые приключения с обложкой, описанием, системой, форматом, составом ГМов
    • Публичная страница /portfolio/{slug} показывает карточку с обложкой, описанием, составом и одобренными отзывами — без раскрытия приватных идентификаторов
    • Публичные профили мастеров /gm/{slug} и публичные страницы клубов /club/{slug} получают секцию Завершённые приключения с карточками
    • Игроки, участвовавшие в сессии (non-GM, Active), могут оставить модерируемый отзыв — без consent-чекбокса отзыв не сохраняется
    • Мастер/co-GM модерируют отзывы (Approve/Reject/Hide) перед публикацией
    • Cross-club изоляция: ни одна управляющая операция не доступна менеджеру чужого клуба
    • Обложки хранятся в persistent volume portfolio_covers (env PORTFOLIO_COVERS_VOLUME_NAME); будущая замена на S3 — через IPortfolioCoverStorage без изменений в PortfolioService

    📦 Версия и деплой

    • версия обновлена до 3.6.0
    • Docker-образы используют тег 3.6.0
    • PR #118 интегрирован в main через merge commit 992f71c0e471e8250a717392c1a4f81f41ae8e95
    • Gitea Actions run #284 (PR checks) — success
    • Gitea Actions run #285 (deploy) — success
    • Issue #108 закрыт
    Downloads
  • v3.5.1 394bd19b95

    Release v3.5.1 — Исправление публичных страниц игр
    Deploy Telegram Bot / build-and-push (push) Successful in 6m0s
    Deploy Telegram Bot / scan-images (push) Successful in 3m30s
    Deploy Telegram Bot / deploy (push) Successful in 30s
    Stable

    Toutsu released this 2026-05-29 09:53:41 +03:00 | 94 commits to main since this release

    🔧 Patch 3.5.1 — Исправление публичных страниц игр

    Исправлен HTTP 500 на /showcase, публичных страницах клубов /club/{slug} и публичных страницах сессий /s/{id} после релиза 3.5.0.

    🧩 Что вошло в релиз

    • src/GmRelay.Web/Services/SessionService.cs — публичные запросы профилей мастеров теперь сортируют owner manager по существующей колонке group_managers.created_at вместо несуществующей gm.added_at
    • tests/GmRelay.Bot.Tests/Web/MasterProfilesTests.cs — добавлен regression test на соответствие публичных запросов реальной схеме group_managers
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml, README.md → 3.5.1

    🗡 Что это даёт

    • Каталог игр /showcase снова открывается
    • Публичные страницы клубов и сессий снова рендерятся без 500
    • Новая проверка не даст снова сослаться на несуществующую колонку added_at

    📦 Версия и деплой

    • версия обновлена до 3.5.1
    • Docker-образы используют тег 3.5.1
    • PR #114 интегрирован в main через merge commit 394bd19b95bc4148cd349da0116089a1e6c1656e
    • Gitea Actions run #280 (PR checks) — success
    • Gitea Actions run #281 (deploy) — success
    • Продовая проверка после деплоя: /showcase, /club/kulaki, /s/c7336ee7-84f3-4b34-9d07-9bf82460bb97 — HTTP 200
    Downloads
  • v3.5.0 b32f962f11

    Release v3.5.0 — Публичные профили мастеров
    Deploy Telegram Bot / build-and-push (push) Successful in 6m20s
    Deploy Telegram Bot / scan-images (push) Successful in 3m0s
    Deploy Telegram Bot / deploy (push) Successful in 28s
    Stable

    Toutsu released this 2026-05-29 00:35:40 +03:00 | 96 commits to main since this release

    🛠 Feature 3.5.0 — Публичные профили мастеров

    Добавлены публичные профили мастеров /gm/{slug} с управлением публикацией из /profile. Публичные страницы игр и клубов теперь могут вести на профиль мастера без раскрытия технических идентификаторов.

    🧩 Что вошло в релиз

    • src/GmRelay.Bot/Migrations/V028__add_master_profiles.sql — новая таблица master_profiles с публичным slug, флагом публикации, именем и описанием
    • src/GmRelay.Web/Components/Pages/Profile.razor — управление публикацией профиля мастера из личного профиля
    • src/GmRelay.Web/Components/Pages/PublicMasterProfile.razor — публичная страница /gm/{slug} с клубами и опубликованными играми мастера
    • src/GmRelay.Web/Services/SessionService.cs — privacy-filtered запросы публичного профиля, связи с опубликованными клубами и играми, поддержка owner/co-GM ассоциаций
    • src/GmRelay.Web/Components/Pages/PublicClub.razor, PublicSession.razor, Showcase.razor — ссылки на опубликованные профили мастеров
    • tests/GmRelay.Bot.Tests/Web/MasterProfilesTests.cs — source-level проверки миграции, публичных контрактов, отсутствия приватных идентификаторов и поддержки co-GM
    • README.md, docs/c4-system-context.md — документация обновлена под публичные профили мастеров
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml, README.md → 3.5.0

    🗡 Что это даёт

    • Мастера могут публиковать отдельную публичную визитку с коротким адресом
    • Игроки могут перейти от опубликованной игры или клуба к профилю мастера
    • Публичный профиль не отдаёт Telegram/Discord ID, external user id, linked identities или avatar URL с платформенными идентификаторами
    • Публичные игры co-GM тоже попадают в профиль соответствующего мастера

    📦 Версия и деплой

    • версия обновлена до 3.5.0
    • Docker-образы используют тег 3.5.0
    • PR #113 интегрирован в main через merge commit b32f962f1159a81fad3d9f288a914122692194e3
    • Gitea Actions run #278 (PR checks) — success
    • Gitea Actions run #279 (deploy) — success
    Downloads
  • v3.4.0 d81564c308

    Release v3.4.0 — Каталог игр и витрина ваншотов
    Deploy Telegram Bot / build-and-push (push) Successful in 6m52s
    Deploy Telegram Bot / scan-images (push) Successful in 3m21s
    Deploy Telegram Bot / deploy (push) Successful in 33s
    Stable

    Toutsu released this 2026-05-28 18:13:55 +03:00 | 98 commits to main since this release

    🛠 Feature 3.4.0 — Каталог игр и витрина ваншотов

    Реализован публичный каталог опубликованных игр /showcase и обновлённая карточка сессии /s/{id} с поддержкой прямой записи.

    🧩 Что вошло в релиз

    • src/GmRelay.Bot/Migrations/V027__add_showcase_fields.sql — добавлены поля is_one_shot, system, description, cover_image_url, duration_minutes, format, allow_direct_registration в таблицу sessions + partial index для каталога
    • src/GmRelay.Shared/Domain/GameSystem.cs — enum с 21 TTRPG-системой + Other, методы ToDisplayName() и TryParseFuzzy()
    • src/GmRelay.Shared/Features/Showcase/ShowcaseSessionDto.cs, ShowcaseFilter.cs — DTO для каталога и фильтров
    • src/GmRelay.Web/Components/Pages/Showcase.razor — страница /showcase с фильтрами по дате, системе, наличию мест и формату, пагинацией и карточками
    • src/GmRelay.Web/Components/Pages/PublicSession.razor — обновлённая публичная карточка с обложкой, бейджами, описанием, длительностью и поддержкой ?register=1 для прямой записи
    • src/GmRelay.Web/Services/SessionService.csGetShowcaseSessionsAsync с динамическим SQL и LATERAL join; RegisterFromShowcaseAsync с FOR UPDATE и ON CONFLICT
    • src/GmRelay.Shared/Features/Sessions/CreateSession/CreateSessionCommand.cs — новые поля при создании сессии
    • src/GmRelay.Shared/Features/Sessions/CreateSession/CreateSessionHandler.cs — сохранение новых полей + cover_image_url
    • tests/GmRelay.Bot.Tests/Domain/GameSystemTests.cs — тесты для fuzzy matching
    • tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/SessionCapacityRulesTests.cs — boundary тесты для waitlist
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml, README.md → 3.4.0

    🗡 Что это даёт

    • Пользователи могут находить опубликованные игры через /showcase без доступа к приватному dashboard
    • ГМы могут публиковать игры с детальным описанием, системой, форматом и обложкой
    • Включена прямая запись на игры (allow_direct_registration) с соблюдением лимитов мест и waitlist
    • Owner/co-GM контролируют, что попадает в витрину через флаги публикации

    📦 Версия и деплой

    • версия обновлена до 3.4.0
    • Docker-образы используют тег 3.4.0
    • Gitea Actions run #275 (PR checks) — success
    • Gitea Actions run #276 (PR checks after fix) — success
    • Gitea Actions run #277 (deploy) — success
    Downloads
  • v3.3.0 c2ccc35e50

    Release v3.3.0 — Public club pages
    Deploy Telegram Bot / build-and-push (push) Successful in 6m53s
    Deploy Telegram Bot / scan-images (push) Successful in 3m39s
    Deploy Telegram Bot / deploy (push) Successful in 33s
    Stable

    Toutsu released this 2026-05-28 12:51:26 +03:00 | 118 commits to main since this release

    🛠 Minor 3.3.0 — Публичные страницы клубов

    Добавлены read-only публичные страницы клубов и отдельных сессий. Owner и co-GM управляют публикацией из Web Dashboard, а закрытые группы и приватные сессии остаются недоступны публично.

    🧩 Что вошло в релиз

    • src/GmRelay.Bot/Migrations/V026__add_public_club_pages.sql — поля публикации клубов и сессий, уникальный slug и индекс публичного расписания
    • src/GmRelay.Web/Services/SessionService.cs — privacy-filtered запросы для публичных страниц без состава игроков и join-ссылок
    • src/GmRelay.Web/Components/Pages/PublicClub.razor и PublicSession.razor — публичные маршруты /club/{slug} и /s/{sessionId}
    • src/GmRelay.Web/Components/Pages/GroupDetails.razor — настройки публикации клуба, batch и отдельных сессий
    • README.md, docs/c4-system-context.md — документация обновлена под публичные страницы
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.3.0

    🗡 Что это даёт

    • Клубы могут делиться открытым расписанием без раскрытия личных данных игроков
    • Приватные сессии не доступны по публичным URL и получают noindex-страницы
    • Share-friendly ссылки работают для клуба и опубликованных сессий

    📦 Версия и деплой

    • версия обновлена до 3.3.0
    • Docker-образы используют тег 3.3.0
    • Gitea Actions run #273 (PR checks) — success
    • Gitea Actions run #274 (deploy) — success
    Downloads
  • v3.2.0 7a2965b43f

    Release v3.2.0 — Platform-neutral handler extraction complete
    Deploy Telegram Bot / build-and-push (push) Successful in 6m39s
    Deploy Telegram Bot / scan-images (push) Successful in 3m26s
    Deploy Telegram Bot / deploy (push) Successful in 29s
    Stable

    Toutsu released this 2026-05-27 16:11:45 +03:00 | 121 commits to main since this release

    🛠 Minor 3.2.0 — Завершение platform-neutral архитектуры

    Все оставшиеся Telegram handlers перенесены в GmRelay.Shared с platform-neutral контрактами. Discord Bot получил parity для reschedule voting.

    🧩 Что вошло в релиз

    • src/GmRelay.Shared/Features/Sessions/* — извлечены 6 shared handlers: CreateSession, ListSessions, DeleteSession, ExportCalendar, HandleRescheduleTimeInput, HandleRescheduleVote
    • src/GmRelay.Bot/Infrastructure/Telegram/TelegramPlatformMessenger.cs — новые методы SendScheduleAsync, UpdateScheduleAsync, CreateThreadAsync, DeleteThreadAsync, UpdateGroupMessageAsync
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleVoteHandler.cs — делегирует в shared HandleRescheduleVoteHandler
    • src/GmRelay.Bot/Program.cs — hotfix: добавлены недостающие DI-регистрации для shared DeleteSessionHandler и ListSessionsHandler
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.2.0

    🗡 Что это даёт

    • Новая платформа добавляется adapter-ом, без переписывания core flow
    • Telegram и Discord routers используют единые command contracts
    • Core handlers тестируются без Telegram SDK

    📦 Версия и деплой

    • версия обновлена до 3.2.0
    • Docker-образы используют тег 3.2.0
    • Gitea Actions run #269 (PR checks) — success
    • Gitea Actions run #271 (deploy) — success
    Downloads
  • v3.1.1 64216f5a26

    Release v3.1.1 — Telegram topics для batch из шаблонов
    Deploy Telegram Bot / build-and-push (push) Successful in 6m3s
    Deploy Telegram Bot / scan-images (push) Successful in 3m25s
    Deploy Telegram Bot / deploy (push) Successful in 29s
    Stable

    Toutsu released this 2026-05-27 14:18:40 +03:00 | 125 commits to main since this release

    🔧 Patch 3.1.1 — Telegram topics для batch из шаблонов

    Исправлено создание batch из шаблона через Web UI: в Telegram forum-группах новая пачка игр теперь получает отдельный topic так же, как batch, созданный через /newsession.

    🧩 Что вошло в релиз

    • src/GmRelay.Web/Services/SessionService.cs — Web-путь создания batch из шаблона проверяет Telegram-чат, создаёт forum topic, сохраняет thread_id/topic_created_by_bot в новых sessions и отправляет расписание в созданный topic.
    • tests/GmRelay.Bot.Tests/Infrastructure/Telegram/TelegramTopicIntegrationSmokeTests.cs — добавлен regression test на создание и сохранение Telegram topic для template batches.
    • tests/GmRelay.Bot.Tests/Discord/DiscordProjectStructureTests.cs — синхронизированы release assertions под 3.1.1.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.1.1.

    🗡 Что это даёт

    • Batch, созданный из Web-шаблона, больше не публикуется в общий чат forum-группы.
    • Дальнейшие групповые уведомления и удаление пустого bot-owned topic работают по сохранённому thread_id.
    • Поведение Web UI стало согласовано с /newsession в Telegram.

    📦 Версия и деплой

    • версия обновлена до 3.1.1
    • Docker-образы используют тег 3.1.1
    • Gitea Actions run #267 (PR checks) — success
    • Gitea Actions run #268 (deploy) — success
    • PR #105 интегрирован в main через merge commit 64216f5a262048c6337f27e9422766be59e57b16
    Downloads