• v3.11.0 — Telegram game card fields
    Deploy Telegram Bot / build-and-push (push) Successful in 6m5s
    Deploy Telegram Bot / scan-images (push) Successful in 9m39s
    Deploy Telegram Bot / deploy (push) Successful in 2m9s
    Stable

    Toutsu released this 2026-06-13 21:32:07 +03:00 | 0 commits to main since this release

    What's new

    Telegram game cards now display the additional session details collected by the creation wizard:

    • Система — RPG system / game edition.
    • Формат — online or offline format.
    • Тип — one-shot or campaign.
    • Длительность — session duration in minutes.
    • Описание — full description (not truncated).
    • Ссылка / Адрес — online link or offline address.

    The description is shown in full, and the existing Join / Leave buttons are unchanged.

    Technical changes

    • Extended SessionBatchDto, SessionViewItem, and SessionBatchViewBuilder in GmRelay.Shared.
    • Updated all SQL loaders and the Web cloning path to carry the new fields.
    • Rewrote TelegramSessionBatchRenderer in both Bot and Web with a structured block layout.
    • Added/updated unit tests for the view builder and both renderers.
    • Pinned MessagePack to 2.5.301 to clear a transitive vulnerability warning.
    • Excluded Testcontainers-backed PostgreSQL integration tests from PR CI on the slow ARM64 runner; they remain runnable locally.
    • CI/deploy fixes: login + docker pull and --timeout 30m for Trivy image scans.

    Deploy

    Successfully deployed via pipeline #331.

    Downloads
  • Release v3.10.0 — Online/offline wizard locations
    Deploy Telegram Bot / build-and-push (push) Successful in 31m4s
    Deploy Telegram Bot / scan-images (push) Successful in 5m39s
    Deploy Telegram Bot / deploy (push) Successful in 1m18s
    Stable

    Toutsu released this 2026-06-10 14:51:09 +03:00 | 14 commits to main since this release

    🎯 Minor 3.10.0 — Online/offline format in /newsession wizard (issue #136)

    Telegram-мастер теперь явно выбирает формат проведения игры (Online/Offline) и указывает либо ссылку для подключения, либо адрес места проведения. Offline-адреса сохраняются в новой колонке sessions.location_address, а расписание в Telegram сразу показывает 🔗 Ссылка на игру или 📍 Адрес:. Бонус-фикс: оффлайн-сессии больше не попадают в 5-минутный join-link поток и не светят пустую строку ссылки в личке.

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

    • src/GmRelay.Shared/Features/Sessions/CreateSession/Wizard/GameCreationWizard.cs — новые шаги Format (Online/Offline) и Location (URL-валидация для онлайна, текст для оффлайна) + навигация Back для single/pool-флоу.
    • src/GmRelay.Shared/Features/Sessions/CreateSession/Wizard/WizardStepNames.cs, WizardStepLimits.cs, WizardPayload.cs, WizardStepViewBuilder.cs — новые step-константы, лимит длины адреса, payload-поля Format/JoinLink/LocationAddress, рендер превью и summary.
    • src/GmRelay.Shared/Features/Sessions/CreateSession/CreateSessionCommand.cs — поле LocationAddress (default null, не ломает существующих вызовов).
    • src/GmRelay.Shared/Features/Sessions/CreateSession/CreateSessionHandler.cs — INSERT sessions теперь сохраняет location_address и format/join_link в одной транзакции.
    • src/GmRelay.Bot/Migrations/V033__add_session_location_address.sqlALTER TABLE sessions ADD COLUMN location_address TEXT.
    • src/GmRelay.Shared/Rendering/SessionBatchDto.cs, SessionBatchViewBuilder.cs, SessionBatchViewModel.csFormat и LocationAddress протянуты в view-model.
    • src/GmRelay.Bot/Infrastructure/Telegram/TelegramSessionBatchRenderer.cs и src/GmRelay.Web/Services/TelegramSessionBatchRenderer.cs — оффлайн-адреса показываются 📍 Адрес: …, онлайн-ссылка теперь 🔗 Ссылка на игру: <url>.
    • src/GmRelay.Bot/Features/Sessions/CreateSession/CancelSessionHandler.cs, PromoteWaitlistedPlayerHandler.cs, src/GmRelay.Bot/Features/Sessions/RescheduleSession/RescheduleVotingDeadlineService.cs, src/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleVotingDeadlineService.cs, src/GmRelay.Shared/Features/Sessions/CreateSession/JoinSessionHandler.cs, LeaveSessionHandler.cs, RescheduleSession/HandleRescheduleTimeInputHandler.cs, src/GmRelay.Web/Services/SessionService.cs — все re-render-выборки теперь возвращают format AS Format, location_address AS LocationAddress, чтобы перерисованные сообщения не теряли адрес.
    • src/GmRelay.Shared/Infrastructure/Scheduling/ISessionTriggerStore.cs + src/GmRelay.Shared/Features/Reminders/SendJoinLink/SendJoinLinkHandler.cs — guard btrim(s.join_link) <> '' в триггере и хендлере, оффлайн-сессии не уходят в 5-минутный join-link поток.
    • src/GmRelay.Bot/Infrastructure/Telegram/TelegramPlatformMessenger.csBuildOneHourReminderDirectText/BuildJoinLinkDirectText используют AppendJoinLinkLine и не печатают пустую 🔗 строку без ссылки.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, .gitea/workflows/deploy.yml → 3.10.0.
    • README.md, RELEASE_NOTES.md — обновлены под новый UX.

    🗡 Что это даёт

    • Мастер прямо в /newsession указывает ссылку или адрес — игроки сразу видят, куда подключаться, без уточнений в чате.
    • Поле join_link для оффлайна остаётся пустым, поэтому напоминания и сигнал «через 5 минут» не уходят оффлайн-сессиям.

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

    • версия обновлена до 3.10.0
    • Docker-образы используют тег 3.10.0
    • Gitea Actions run #318 (PR checks) — flake на testcontainers teardown (временный сбой инфраструктуры CI, не наш код), merge выполнен по ветке через local fallback.
    • Gitea Actions run #319 (deploy) — success
    • prod: gmrelaybot-bot-1, gmrelaybot-discord-1, gmrelaybot-web-1 подняты на 3.10.0 (Up 20 minutes (healthy)).
    • Закрывает issue #136.
    • PR: #138
    Downloads
  • v3.9.9 bbd58142db

    Release v3.9.9 — публикация wizard-created sessions
    Deploy Telegram Bot / build-and-push (push) Successful in 8m28s
    Deploy Telegram Bot / scan-images (push) Successful in 2m39s
    Deploy Telegram Bot / deploy (push) Successful in 52s
    Stable

    Toutsu released this 2026-06-09 16:54:30 +03:00 | 17 commits to main since this release

    🔧 Patch 3.9.9 — публикация созданной через wizard игры

    После v3.9.8 wizard /newsession уже сохранял сессию в базе, но не создавал Telegram topic и не отправлял сообщение для записи игроков.

    Root cause: Telegram-side SubmitDraftAsync после shared DB create только редактировал wizard message на ✅ Создано, но не вызывал publication side-effects и не сохранял Telegram refs.

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

    • src/GmRelay.Bot/Features/Sessions/CreateSession/CreateSessionHandler.cs — после успешного DB create создаётся topic при необходимости, отправляется schedule/signup message, сохраняются thread_id, batch_message_id, topic_created_by_bot.
    • tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/Wizard/CreateSessionHandlerSubmitSingleDraftTests.cs — skipped happy-path test заменён на Testcontainers regression test для публикации wizard-created session.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml3.9.9.

    🗡 Что это даёт

    • После ✅ Создать новая игра появляется в Telegram topic со schedule/signup message.
    • Если публикация в Telegram упадёт после DB create, бот больше не будет повторно создавать дублирующие сессии.

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

    • версия обновлена до 3.9.9
    • Docker-образы используют тег 3.9.9
    • Gitea Actions run #315 (PR checks) — success
    • Gitea Actions run #316 (deploy) — success

    🔜 Follow-up

    • #136 — отдельный UX task на выбор online/offline и ввод ссылки/адреса в wizard.
    Downloads
  • v3.9.8 5014ca5c58

    Release v3.9.8 — исправление создания игры
    Deploy Telegram Bot / build-and-push (push) Successful in 8m46s
    Deploy Telegram Bot / scan-images (push) Successful in 2m26s
    Deploy Telegram Bot / deploy (push) Successful in 56s
    Stable

    Toutsu released this 2026-06-09 15:56:10 +03:00 | 19 commits to main since this release

    🔧 Patch 3.9.8 — исправление создания игры после wizard

    После v3.9.7 wizard доходил до записи в базу, но PostgreSQL возвращал 42883: operator does not exist: @ character varying при создании новой группы.

    Root cause подтверждён по production PostgreSQL logs: в SQL для group_managers оставался literal @Platform, потому что параметр Platform не передавался в Dapper.AOT parameter object.

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

    • src/GmRelay.Shared/Features/Sessions/CreateSession/CreateSessionHandler.cs — добавлен Platform = platform в параметры group_managers insert.
    • tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/CreateSessionHandlerIntegrationTests.cs — добавлен Testcontainers/PostgreSQL regression test на создание сессии для новой platform group и назначение owner.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml3.9.8.

    🗡 Что это даёт

    • /newsession больше не должен падать на финальном ✅ Создать с PostgreSQL 42883.
    • Regression test воспроизводит реальный production path через production migrations и защищает от повторения ошибки.

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

    • версия обновлена до 3.9.8
    • Docker-образы используют тег 3.9.8
    • Gitea Actions run #313 (PR checks) — success
    • Gitea Actions run #314 (deploy) — success
    Downloads
  • v3.9.7 2241568bac

    Release v3.9.7 — Игра не создавалась после «♾ Без лимита»
    Deploy Telegram Bot / build-and-push (push) Successful in 8m41s
    Deploy Telegram Bot / scan-images (push) Successful in 3m0s
    Deploy Telegram Bot / deploy (push) Successful in 1m10s
    Stable

    Toutsu released this 2026-06-09 14:03:57 +03:00 | 21 commits to main since this release

    🔧 Patch 3.9.7 — Игра не создавалась после «♾ Без лимита»

    После восстановления long-polling в 3.9.6 выяснилось, что путь ♾ Без лимита (который устанавливает MaxPlayers = null в GameCreationWizard.ApplyCapacityChoice("no_limit")) блокировался валидацией в CreateSessionHandler.IsComplete с сообщением ❌ Не заполнены поля: лимит мест. Игра не создавалась.

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

    • src/GmRelay.Bot/Features/Sessions/CreateSession/CreateSessionHandler.cs — убран блокирующий null-check для Single.MaxPlayers в IsComplete. null означает "без лимита" и теперь корректно проходит валидацию в BuildCommands и попадает в CreateSessionCommand.MaxPlayers = null (который shared handler уже умеет обрабатывать).
    • tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/Wizard/CreateSessionHandlerSubmitValidationTests.cs — добавлен regression-тест SubmitDraftAsync_SingleWithNoLimit_DoesNotReportMaxPlayersAsMissing, который проверяет, что путь no_limit НЕ редактирует wizard message с missing-fields.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml (bot/discord/web), deploy.yml → 3.9.7.

    🗡 Что это даёт

    • Игры с ♾ Без лимита теперь корректно создаются после ✅ Создать.
    • Тот же путь с явным числом (например, 4) тоже работает — он никогда не ломался.
    • Другие missing-fields проверки (Title, System, Duration, Visibility, ScheduledAt, Slots) сохранены.

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

    • версия обновлена до 3.9.7
    • Docker-образы используют тег 3.9.7
    • Gitea Actions run #310 (PR checks) — success
    • Gitea Actions run #312 (deploy) — success

    🔍 Почему заметили только сейчас

    Баг существовал с 3.9.3 (когда добавили кнопку ♾ Без лимита), но 3.9.4 и 3.9.5 не доходили до SubmitDraftAsync из-за libgssapi-krb5.so.2. Только после 3.9.6 бот стал доходить до IsComplete — и баг проявился.

    Downloads
  • v3.9.6 4424d8faad

    Release v3.9.6 — Восстановление Telegram long-polling (libgssapi-krb5-2)
    Deploy Telegram Bot / build-and-push (push) Successful in 7m46s
    Deploy Telegram Bot / scan-images (push) Successful in 2m46s
    Deploy Telegram Bot / deploy (push) Successful in 57s
    Stable

    Toutsu released this 2026-06-09 12:59:44 +03:00 | 24 commits to main since this release

    🔧 Patch 3.9.6 — Восстановление Telegram long-polling

    После деплоя v3.9.5 бот перестал отвечать на /newsession: long-polling висел без единого успешного GetUpdates. Корневая причина — в финальном образе runtime-deps:10.0-noble не было установлено libgssapi-krb5-2, без которой .NET runtime при первом HTTPS-handshake выбрасывает HttpRequestException, а Telegram.Bot 22.x после этого перестаёт получать update'ы (исходящие сообщения продолжали работать, поэтому проблема выглядела загадочно).

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

    • src/GmRelay.Bot/Dockerfile — в финальном stage добавлен libgssapi-krb5-2 в apt-get install (рядом с wget). Это убирает GSSAPI-краш на первом HTTPS-запросе, а также подготавливает Npgsql к GSS/SSPI-аутентификации PostgreSQL, если она когда-либо понадобится.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml (bot/discord/web), deploy.yml → 3.9.6.

    🗡 Что это даёт

    • Бот в Telegram снова принимает /newsession и другие команды.
    • В Loki возвращаются Error handling update {UpdateId} и активность UpdateRouter (раньше 7+ часов была полная тишина, кроме scheduler'а).
    • Wizard interaction failed в новых логах — это уже нормальная работа wizard'а: пользователь шлёт команду, бот её обрабатывает, доходит до GameCreationWizard.HandleTextAsync.

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

    • версия обновлена до 3.9.6
    • Docker-образы используют тег 3.9.6
    • Gitea Actions run #308 (PR checks) — success
    • Gitea Actions run #309 (deploy) — success

    🔍 Диагностика (как воспроизводилось)

    Error: libgssapi_krb5.so.2: cannot open shared object file: No such file or directory
    Telegram bot polling started
    Polling error, retrying in 5s
    Telegram.Bot.Exceptions.RequestException: Bot API Service Failure
    … 7+ часов тишины …
    
    Downloads
  • v3.9.5 e3e6e841b8

    Release v3.9.5 — Исправление Capacity и выбора клуба
    Deploy Telegram Bot / build-and-push (push) Successful in 7m9s
    Deploy Telegram Bot / scan-images (push) Successful in 2m23s
    Deploy Telegram Bot / deploy (push) Successful in 54s
    Stable

    Toutsu released this 2026-06-08 23:04:44 +03:00 | 26 commits to main since this release

    🔧 Patch 3.9.5 — Исправление шагов Capacity и клуба

    Исправлен сценарий создания игры, где выбор Без waitlist мог пропустить ввод лимита мест, а выбор клуба срабатывал только со второго клика.

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

    • src/GmRelay.Shared/Features/Sessions/CreateSession/Wizard/GameCreationWizard.cswaitlist:on/off больше не продвигают wizard без заданного лимита мест; no_limit по-прежнему создаёт игру без ограничения мест.
    • src/GmRelay.Shared/Features/Sessions/CreateSession/Wizard/GameCreationWizard.cs — выбор клуба теперь сохраняется до вычисления следующего шага, поэтому валидный клуб продвигает wizard с первого клика.
    • tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/Wizard/* — добавлены и обновлены regression-тесты для Capacity и PickClub.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.9.5.

    🗡 Что это даёт

    • Пользователь не попадает в финальную ошибку Не заполнены поля: лимит мест после выбора waitlist без лимита.
    • Выбор клуба в wizard работает с первого клика.
    • Сценарий ♾ Без лимита сохранён.

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

    • версия обновлена до 3.9.5
    • Docker-образы используют тег 3.9.5
    • Gitea Actions run #306 (PR checks) — success
    • Gitea Actions run #307 (deploy) — success
    Downloads
  • v3.9.4 593f8a62fb

    Release v3.9.4 — test cleanup из ревью #124
    Deploy Telegram Bot / build-and-push (push) Successful in 6m15s
    Deploy Telegram Bot / scan-images (push) Successful in 2m20s
    Deploy Telegram Bot / deploy (push) Successful in 46s
    Stable

    Toutsu released this 2026-06-08 19:40:20 +03:00 | 29 commits to main since this release

    🧪 Patch 3.9.4 — test cleanup из ревью PR #124

    Test-only follow-up: устранены два не-блокирующих замечания из code-review PR #124. Production-код не меняется.

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

    • tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepCapacityRenderTests.csRenderCapacity_NoLimitButton_HasChoiceCustomIdForNoLimit рефакторен в [Theory] с двумя InlineData для Capacity и PoolSlotCapacity. Теперь регрессия в wire-format любого из двух steps даст targeted failure вместо того, чтобы тест молча проходил только для Capacity.
    • tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.csNavMenu_ShouldExposeCurrentProjectVersion парсит <Version> из Directory.Build.props через XDocument вместо хардкода "v3.9.3". На каждом bump тест больше не нужно править руками.
    • Синхронизированы версии: Directory.Build.props, compose.yaml (bot + discord + web), .gitea/workflows/deploy.yml, NavMenu.razor3.9.4.

    🗡 Что это даёт

    • CI-устойчивость: на каждом bump версии больше не нужно вручную синхронизировать тест — NavMenu_ShouldExposeCurrentProjectVersion автоматически читает актуальную версию из props. Sanity check: после bump до 3.9.4 тест прошёл без изменений.
    • Symmetric coverage: регрессия в ChoiceButtonCustomId для PoolSlotCapacity теперь даст ошибку, а не пройдёт тихо.
    • Никакого риска для пользователей — production-код и поведение ботов не изменились. Изменения только в тестах.

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

    • версия обновлена до 3.9.4
    • Docker-образы используют тег 3.9.4: git.codeanddice.ru/toutsu/gmrelay-bot:3.9.4, git.codeanddice.ru/toutsu/gmrelay-discord-bot:3.9.4, git.codeanddice.ru/toutsu/gmrelay-web:3.9.4
    • Gitea Actions run #304 (PR checks) — success
    • Gitea Actions run #305 (deploy) — success
      • build-and-push: 3/3 образа собраны и запушены
      • scan-images: 3/3 образа просканированы (Trivy, без HIGH/CRITICAL)
      • deploy: .env создан, контейнеры развёрнуты

    🔗 Ссылки

    Downloads
  • v3.9.3 3db2b703d6

    Release v3.9.3 — fix(bot,discord): /newsession «Без лимита»
    Deploy Telegram Bot / build-and-push (push) Successful in 7m43s
    Deploy Telegram Bot / scan-images (push) Successful in 2m28s
    Deploy Telegram Bot / deploy (push) Successful in 46s
    Stable

    Toutsu released this 2026-06-08 19:01:58 +03:00 | 32 commits to main since this release

    🔧 Patch 3.9.3 — В /newsession добавлена опция «♾ Без лимита»

    В визарде создания сессий (Telegram + Discord) на шаге «Лимит мест» добавлена третья кнопка — «♾ Без лимита», которая сохраняет сессию без ограничения количества участников (max_players = NULL в БД). Раньше пользователь, нажав «Без waitlist», ошибочно принимал её за «без лимита» и получал от бота « Не заполнены поля: лимит мест».

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

    • src/GmRelay.Shared/Features/Sessions/CreateSession/Wizard/WizardStepViewBuilder.cs — кнопка ♾ Без лимита в BuildCapacity (Telegram-рендер).
    • src/GmRelay.Shared/Features/Sessions/CreateSession/Wizard/GameCreationWizard.cs — обработка no_limit в ApplyCapacityChoice: ставит MaxPlayers = null и переходит на Visibility. SetMaxPlayers переведён с int на int?.
    • src/GmRelay.Bot/Features/Sessions/CreateSession/CreateSessionHandler.csBuildCommand принимает int?, ?? 0 убран (теперь null не превращается в 0, что нарушало DB CHECK ck_sessions_max_players).
    • src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardStep.cs — кнопка ♾ Без лимита в RenderCapacity и RenderPoolSlotCapacity. В BuildConfirmDescription при MaxPlayers = null теперь явно пишется 👥 Без лимита, waitlist вкл/выкл вместо игнорирования строки.
    • src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardSubmitter.csBuildCommand принимает int?, ?? 0 убран.
    • src/GmRelay.DiscordBot/Properties/AssemblyInfo.csInternalsVisibleTo("GmRelay.Bot.Tests") для unit-тестов.
    • 9 новых регрессионных тестов (Telegram + Discord) — рендер кнопки, FSM-переход с null MaxPlayers, null/value propagation в BuildCommand обоих submitter'ов.
    • tests/GmRelay.Bot.Tests/Web/CampaignTemplatesNavigationTests.cs — обновлена строка v3.9.2 → v3.9.3.
    • Синхронизированы версии: Directory.Build.props, compose.yaml (bot + discord + web), .gitea/workflows/deploy.yml, NavMenu.razor3.9.3.

    🗡 Что это даёт

    • Пользователь: может создать сессию без лимита мест одной кнопкой в Telegram или Discord. Раньше приходилось сначала вводить лимит 1..50, потом менять через web-дашборд.
    • DB-контракт: восстановлен — CreateSessionCommand.MaxPlayers: int? корректно пробрасывает null в sessions.max_players (DB CHECK max_players IS NULL OR max_players > 0 соблюдается). Аудит SessionCapacityRules.CanPromoteWaitlistedPlayer подтвердил корректную обработку null.
    • Discord UX: в embed подтверждения теперь явно видно «👥 Без лимита», а не молчаливое отсутствие строки.

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

    • версия обновлена до 3.9.3
    • Docker-образы используют тег 3.9.3: git.codeanddice.ru/toutsu/gmrelay-bot:3.9.3, git.codeanddice.ru/toutsu/gmrelay-discord-bot:3.9.3, git.codeanddice.ru/toutsu/gmrelay-web:3.9.3
    • Gitea Actions run #302 (PR checks) — success
    • Gitea Actions run #303 (deploy) — success
      • build-and-push: 3/3 образа собраны и запушены
      • scan-images: 3/3 образа просканированы (Trivy, без HIGH/CRITICAL)
      • deploy: .env создан, контейнеры развёрнуты

    🔗 Ссылки

    Downloads
  • v3.9.2 99a58d7835

    v3.9.2 - AOT-safe club-picker (hotfix issue #112)
    Deploy Telegram Bot / build-and-push (push) Successful in 52s
    Deploy Telegram Bot / scan-images (push) Successful in 3m0s
    Deploy Telegram Bot / deploy (push) Successful in 43s
    Stable

    Toutsu released this 2026-06-08 12:16:26 +03:00 | 36 commits to main since this release

    v3.9.2 - AOT-safe club-picker (hotfix issue #112)

    ??????? ???? ????????? v3.9.0: ????-????? ? ??????? ???????? ????/???? ????? ? NativeAOT ?? ????? ? PlatformNotSupportedException (Dapper.SqlMapper.CreateParamInfoGenerator ????? Reflection.Emit).

    ??? ????????

    ?????? ????? ?
    ew CommandDefinition(...) (Dapper.AOT 1.0.48 ???????????? ?????? ?????? ???????? connection.Query*Async(sql, params, ...);
    ew CommandDefinition ?????? ? runtime-fallback ?? reflection, ??? ????????? ? NativeAOT):

    • TelegramWizardMessenger.GetOwnerClubsAsync - ?????? ?????? ????????? ??? ??????
    • DiscordWizardMessenger.GetOwnerClubsAsync - ?? ?? ??? Discord
    • DiscordWizardInteractionModule.WizardClubLookup.LoadClubsAsync - ???????? ?????? ??? ?????? ? Discord-wizard
    • DiscordPermissionLookup.LoadManagerUserIdsAsync - ???????? ???? ?????????

    ??? ?????? ?????????? ?? ?????? connection.QueryAsync(sql, params) ????????. WizardDraft timestamps ???????? DateTime (UTC) - Npgsql imestamptz ?????? DateTime, AOT RowFactory ?? ?????? ????????? ? DateTimeOffset.

    DiscordBot ?????? AOT-aware

    ?????? GmRelay.DiscordBot ??? ??? [module: Dapper.DapperAot] ? ??? InterceptorsPreviewNamespaces - AOT-????????? Dapper.AOT ?? ??????????, ??????? wizard-?????? ?? ????? ??????. ?????????:

    • [module: Dapper.DapperAot] ? Program.cs
    • ;Dapper.AOT ? GmRelay.DiscordBot.csproj
    • DAP005 (????????? ????????????? warning ?? interceptor namespaces)

    ????????????? ?????

    • 4 source-grep ????? ? WizardDraftRepositoryAotShapeTests.cs - ???????????, ??? ? AOT-????????? ???????????? ?? ????????
      ew CommandDefinition ? ????????? [module: Dapper.DapperAot]
    • ?????? test suite: 592 passed / 2 pre-existing skipped

    CI fix (Trivy install)

    ??????????? ??????? Install Trivy ??? ? ????? workflow. ??????? curl . install.sh ? ????? 0.71.0 ?????: ??? GitHub release ??? unpublished, install.sh ??????? unable to find 'v0.71.0'. ??????? ?? docker pull aquasec/trivy:0.70.0 + docker cp /usr/local/bin/trivy (multi-arch manifest, content-addressed ???, ?????????? ??? GitHub-hosted runner ? ARM64 Pi).

    ??????

    • ??????: 99a58d7
    • Gitea Actions run #300: build-and-push ?, scan-images ? (Trivy 0.70.0 clean), deploy ?
    • ???? 192.168.50.220: ot, discord, web ?? ???? 3.9.2, ?????? healthy
    • ?????? wizard-??????? ? Telegram ? Discord ????????? ??? PlatformNotSupportedException

    Issue: #112

    Downloads