From 73714c952599dbbd6bed58d03b899965bd17e4df Mon Sep 17 00:00:00 2001 From: Toutsu Date: Thu, 21 May 2026 18:40:30 +0300 Subject: [PATCH] docs(adr): add ADR-003 Discord Integration Architecture --- .../003-discord-integration-architecture.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 docs/adr/003-discord-integration-architecture.md diff --git a/docs/adr/003-discord-integration-architecture.md b/docs/adr/003-discord-integration-architecture.md new file mode 100644 index 0000000..2b15bac --- /dev/null +++ b/docs/adr/003-discord-integration-architecture.md @@ -0,0 +1,57 @@ +# ADR 003: Discord Integration Architecture + +## Status + +**Accepted** — implemented in v2.6.0 (PR #87, issue #30). + +## Context + +После Telegram-бота требовалась поддержка Discord для кросс-платформенных групп. Нужно было выбрать: +1. Библиотеку для Discord API (NetCord vs DSharpPlus vs Discord.NET). +2. Модель runtime (отдельный процесс vs тот же Worker). +3. Способ обработки интеракций (Gateway events vs HTTP interactions). + +## Decision + +### 1. NetCord (не DSharpPlus, не Discord.NET) + +- **NetCord** — лёгкий, AOT-compatible, minimal dependencies. +- **DSharpPlus** — слишком тяжёлый, много зависимостей, reflection-heavy. +- **Discord.NET** — несовместим с Native AOT (heavy reflection, dynamic IL). + +### 2. Gateway Events внутри GmRelay.Bot + +- Discord Gateway worker живёт **внутри** `GmRelay.Bot` (тот же Worker Service), а не как отдельный проект. +- Это упрощает DI, shared DB connection, shared `IPlatformMessenger`. +- Для масштабирования можно вынести в отдельный контейнер позже. + +### 3. Slash-команды через NetCord ApplicationCommandService + +- Регистрация глобальных slash-команд (`/newsession`, `/listsessions`) через `ApplicationCommandService`. +- Команды мапятся на vertical slice handlers через `DiscordSessionInteractionModule`. + +### 4. Ephemeral Replies + +- Все кнопки (Join/Leave/RSVP) отвечают ephemeral (`MessageFlags.Ephemeral`). +- Schedule message редактируется через `DiscordPlatformMessenger` (реализация `IPlatformMessenger`). + +## Consequences + +### Positive + +- Один бинарник для Telegram + Discord. +- Shared DI, shared DB pool, shared domain logic. +- Native AOT совместимость. + +### Negative + +- Gateway connection требует persistent WebSocket — при разрыве происходит reconnect. +- Discord rate limits агрессивнее Telegram — нужен backoff. + +## Related + +- Issue #30 — reschedule voting (кнопки + дедлайн). +- Issue #31 — scheduler notifications через `IPlatformMessenger`. +- Issue #32 — compose wiring + healthcheck. +- ADR 001 — Vertical Slice, Native AOT, Aspire. +- ADR 002 — Platform-Neutral Rendering.