diff --git a/README.md b/README.md index e0ae999..7d5511b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Проект разработан с упором на производительность, архитектуру Vertical Slice, Native AOT (для бота) и удобство развертывания с использованием .NET Aspire. -**Текущая версия:** `v2.7.0`. +**Текущая версия:** `v2.7.2`. --- @@ -25,11 +25,11 @@ - **🔄 Автоматическая синхронизация**: Любые изменения в веб-интерфейсе мгновенно обновляют сообщения с расписанием в подключенных Telegram- и Discord-каналах. ### Discord Bot -- **Slash-команды расписания**: GM создаёт сессию через `/newsession` и публикует актуальное расписание через `/listsessions`. -- **Кнопки записи и выхода**: игроки нажимают Join/Leave в Discord-сообщении; бот отвечает ephemeral-сообщением и обновляет schedule message. -- **Подтверждения и RSVP**: scheduler публикует запрос подтверждения в Discord-канале, игроки отвечают кнопками, а GM получает исходы RSVP через платформенный messenger. -- **Напоминания и ссылки**: one-hour reminders и join-link notifications отправляются в Discord DM при включенных личных уведомлениях; сбои DM логируются без публичного fallback. -- **Переносы**: deadline-сервис обновляет Discord vote message и schedule message через `IPlatformMessenger`. +- **Slash-команды `/newsession` и `/listsessions`**: GM создаёт сессии и публикует актуальное расписание прямо в Discord-канале. +- **Кнопки Join/Leave с ephemeral-ответами**: игроки нажимают Join/Leave в Discord-сообщении; бот отвечает ephemeral-сообщением и обновляет schedule message. +- **RSVP (подтверждения) за 24ч до сессии**: scheduler публикует запрос подтверждения в Discord-канале, игроки отвечают кнопками, а GM получает итоги RSVP. +- **DM-напоминания за 1ч и ссылки перед игрой**: one-hour reminders и join-link notifications отправляются в Discord DM при включённых личных уведомлениях; сбои DM логируются без публичного fallback. +- **Reschedule voting (голосование за перенос)**: deadline-сервис обновляет Discord vote message и schedule message через `IPlatformMessenger`. - **Лимиты и waitlist**: при заполненном составе игрок попадает в waitlist, а при выходе участника первый ожидающий автоматически продвигается в основной состав. ### 🌐 Web Dashboard (Blazor Server) @@ -55,7 +55,7 @@ |---|---| | Язык | C# 14 (.NET 10) | | Архитектура | Vertical Slice + общая библиотека `GmRelay.Shared` | -| Боты | Telegram.Bot (**Native AOT**), NetCord Gateway (Discord worker) | +| Боты | Telegram.Bot (**Native AOT**), NetCord Gateway (Discord worker внутри `GmRelay.Bot`) | | Веб | Blazor Server | | Оркестрация | .NET Aspire (`GmRelay.AppHost`) | | БД | PostgreSQL | @@ -85,6 +85,9 @@ TELEGRAM_BOT_TOKEN=ваш_токен_здесь # Токен Discord application bot DISCORD_BOT_TOKEN=ваш_discord_токен_здесь +# Client ID Discord application (используется для slash-команд) +DISCORD_BOT_CLIENT_ID=ваш_discord_client_id_здесь + # Имя бота без @ (для Telegram Login Widget) TELEGRAM_BOT_USERNAME=ваше_имя_бота_здесь @@ -109,15 +112,15 @@ docker compose up -d - создание Docker-сети и volume PostgreSQL; - подъём PostgreSQL (`db:5432`); - запуск бота с плавной миграцией (DbUp); -- запуск отдельного Discord Gateway worker на NetCord; +- запуск Discord Gateway worker на NetCord (healthcheck на `:8082`); - запуск веб-приложения с подключением к БД и Telegram API. ### 3. Первоначальная настройка 1. Напишите боту `/start`. 2. Создайте группу через `/newgroup`. 3. Откройте Mini App или Web Dashboard для расширенного управления. -4. Для Discord пригласите application bot на сервер с правами `bot` и `applications.commands`. -5. В Discord создайте сессию через `/newsession` или опубликуйте расписание через `/listsessions`; игроки записываются и выходят кнопками в опубликованном сообщении. +4. Для Discord пригласите application bot на сервер с правами `bot` и `applications.commands`. Скопируйте `DISCORD_BOT_TOKEN` и `DISCORD_BOT_CLIENT_ID` в `.env`. +5. Перезапустите Docker Compose (`docker compose up -d`), а затем в Discord создайте сессию через `/newsession` или опубликуйте расписание через `/listsessions`; игроки записываются и выходят кнопками в опубликованном сообщении. ## 💾 Backup и восстановление @@ -164,8 +167,7 @@ BACKUP_VOLUME_NAME=game_pgbackups ``` ├── src/ │ ├── GmRelay.AppHost/ # .NET Aspire orchestrator -│ ├── GmRelay.Bot/ # Telegram-бот (Native AOT) -│ ├── GmRelay.DiscordBot/ # Discord Gateway worker на NetCord +│ ├── GmRelay.Bot/ # Telegram- и Discord-бот (Native AOT + NetCord Gateway worker) │ ├── GmRelay.ServiceDefaults/ # Aspire service defaults │ ├── GmRelay.Shared/ # Общие доменные модели │ └── GmRelay.Web/ # Blazor Server dashboard @@ -177,6 +179,16 @@ BACKUP_VOLUME_NAME=game_pgbackups --- +## 👨‍💻 Для разработчиков + +- **Архитектура**: проект следует Vertical Slice с явным DI. Подробности — в [ADR-001](docs/adr/0001-use-vertical-slice-native-aot-and-aspire.md) и [ADR-002](docs/adr/002-platform-neutral-batch-rendering.md). +- **Добавление обработчика**: из-за Native AOT все DI-регистрации выполняются вручную в `src/GmRelay.Bot/Program.cs` (assembly scanning не используется). +- **Миграции**: SQL-скрипты добавляются как embedded resources в `src/GmRelay.Bot/Migrations/` и применяются автоматически при старте бота через DbUp. +- **Тесты**: `dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --verbosity normal` +- **Сборка**: `dotnet build` + +--- + ## 📜 Лицензия MIT License. См. [LICENSE](./LICENSE).