3.9 KiB
3.9 KiB
ROADMAP - Loki Blog Bot (Rust kernel)
Цель: не клон
discord-bot(экономика/музыка/левел), а бот для блога/портфолио - чистый, KISS, ≤200 строк/файл, ≤4 файла/папку.
Сервер блога - желаемая структура Discord
📁 INFO #rules, #welcome, #announcements, #blog-feed (RSS → webhook), #changelog
📁 COMMUNITY #general, #ideas, #showcase (юзеры постят проекты), #feedback
📁 SUPPORT #open-ticket, #faq
📁 VOICE create-voice (temp), afk
📁 STAFF (🔒) #mod-logs, #bot-logs
Роли: @Verified (кнопка в #welcome), @Blogger, @Support, @Staff, @Muted.
Phase 1 - Ядро ✅ (скелет готов)
- Rust 1.82, tokio, serenity 0.12 + poise 0.6 (slash + prefix
!) config/loaderdotenv → BotConfig,db/poolWAL + FK=ON (фикс C6 старого бота)db/migrationidempotent транзакции (фикс C5)core/lifecycletrait,core/botReadyEvent + graceful shutdownfeature/help|info|admin-!ping,!serverinfo,!shutdown(owner)ds-setupCLI:inspect/bootstrap --dry-run/--apply(BOT token, user-token с ворнингом)
Запуск:
cp .env.example .env # вставь DISCORD_BOT_TOKEN, GUILD_ID
cargo run --bin bot
cargo run --bin ds-setup -- inspect --guild-id 123
cargo run --bin ds-setup -- bootstrap --guild-id 123 --dry-run
Phase 2 - Верификация и доступ (guild 1509503154708811837, next)
- Verify (embed+✅) -
#✅|verifyread-only (@everyone: VIEW ✅, SEND ❌, ADD_REACTIONS ✅), embed +✅реакция → выдача✅ Verified(1509503647480811610), бот роль выше Verified,GUILD_MESSAGE_REACTIONS+ partials. Кнопка - альтернатива, но делаем реакцию как просил. Фикс F3: проверкаMANAGE_ROLES. !mute/!unmute/!warn/!purge/!slowmode- атомарные транзакции, безUndeclaredThrowableException(фикс C1)- Logging в #mod-logs (join/leave, edit/delete, mod actions)
- RateLimiter +
core/queueSemaphore 100 (уже заготовка)
Phase 3 - Блог-фичи (главное отличие от старого бота)
- RSS/Telegram → #blog-feed (webhook,
reqwest+feed-rs) !post- анонс поста (embed с cover, линк)- Showcase: треды в #showcase, реакции ⭐
- GitHub webhook → #changelog
- Ticket (кнопки в #open-ticket → приватный канал/тред в SUPPORT, overwrites за 1 операцию, claim, transcript → #ticket-logs) - см. ARCHITECTURE.md
Phase 4 - Комьюнити
- Welcome embed, counters (member count в канале)
- Polls в #ideas
- Scheduler (напоминания)
- Temp voice (
#create-voice→ временный канал)
Phase 5 - Опционально (AI)
- AI FAQ (DeepSeek/GPT) в #faq - только по базе знаний блога
- Auto-mod (спам/ссылки)
Уроки старого бота - что НЕ повторяем
F1,F2,F4 - экономика: атомарные UPDATE ... WHERE cash>=?, daily WHERE last_daily != today.
F8/C1 - не блокировать gateway: все DB/HTTP вне EventHandler, tokio::spawn, sqlx async.
C6 - foreign_keys=ON через SqliteConnectOptions::foreign_keys(true), не одним PRAGMA.
M1 - destroy() на ScheduledExecutorService → в Rust JoinHandle::abort / pool.close().await.
Качество
cargo fmt --check, cargo clippy -- -D warnings, cargo test, cargo audit. Лимит 200 строк - rustfmt max_width=100.
Каждый feature/* ≤4 файла, >150 строк → дробить (service/, repository/).