Bot Discord ecrit en Rust (Serenity) avec une architecture modulaire, des commandes prefixees, des interactions (slash/components/modals) et une couche PostgreSQL pour la persistance.
Le projet couvre moderation, logs, tickets, suggestions, automatisations, gestion des roles/salons, jeux et configuration fine des permissions.
- 200+ commandes (prefixees + alias)
- Gestion de permissions par commande et par niveau
- Prefixe principal + prefixes par serveur
- Systeme de tickets avec claim/close/add/remove
- Suggestions avec workflow d approbation
- Automod (antispam, antilink, badwords, antimassmention)
- Logs (messages, moderation, vocal, roles, boosts, raids)
- Presence dynamique (play/listen/watch/compet/stream)
- Persistance PostgreSQL (schema cree automatiquement au demarrage)
- Rust edition 2024
- Serenity 0.12
- Tokio
- SQLx + PostgreSQL
- dotenv
- Docker / Docker Compose
src/
main.rs # bootstrap bot + DB
permissions.rs # ACL, prefixes, checks permissions
db.rs # pool SQLx + schema + acces DB
activity.rs # rotation de presence/statut
commands/ # commandes prefixees par domaine
events/ # handlers d evenements Discord
utils/ # services transverses (logs, automod, etc.)
- Rust stable (toolchain recente compatible edition 2024)
- Cargo
- PostgreSQL (optionnel, mais recommande)
- Un bot Discord et son token
Important: le bot utilise GatewayIntents::all(). Pense a activer les intents necessaires dans le portail Discord Developer (dont Message Content intent).
- Copier le fichier d exemple:
cp .env.example .env- Renseigner les variables dans
.env:
# Discord
BOT_TOKEN=change_me
FORCE_OWNER_IDS=671763971803447298
# PostgreSQL
POSTGRES_DB=shadowbot
POSTGRES_USER=shadowbot
POSTGRES_PASSWORD=change_me
# App database URL
DATABASE_URL=postgres://shadowbot:change_me@postgres:5432/shadowbotBOT_TOKEN: token du bot Discord (obligatoire)FORCE_OWNER_IDS: IDs utilisateurs consideres owners (CSV possible)DATABASE_URL: URL PostgreSQL de l application
Note: si DATABASE_URL pointe vers @postgres: mais que le bot tourne hors Docker, le code tente un fallback automatique vers @localhost:.
-
Demarrer PostgreSQL (local ou via Docker).
-
Si besoin, lancer seulement la base via Compose:
docker compose up -d postgres- Lancer le bot:
cargo runLe schema SQL est initialise automatiquement au demarrage.
docker compose up --build -dVoir les logs:
docker compose logs -f botArreter:
docker compose down- Prefixe par defaut:
+ - Prefixe principal modifiable:
+mainprefix <prefix> - Prefixe serveur modifiable:
+prefix <prefix> - Aide:
+helpou/help
Exemples:
+ping
+help moderation
+ticket
+suggestion
+warn @user raison
Le projet supporte les interactions slash/components/modals. La commande /help est enregistree globalement au demarrage, et plusieurs modules gerent aussi des interactions slash specifiques (ticket, suggestions, tempvoc, autopublish, etc.).
Le schema est cree dans src/db.rs via init_schema avec plusieurs tables, notamment:
message_logbot_settings,bot_activitiesbot_command_permissions,bot_command_access,bot_perm_level_accessbot_aliasesbot_tickets,bot_ticket_members,bot_ticket_settingsbot_suggestions,bot_suggestion_settingsbot_autopublish_channels,bot_piconly_channelsbot_moderation_settings,bot_badwords,bot_strike_rules,bot_punish_rulesbot_game_sessions
Si DATABASE_URL est absent ou invalide, le bot demarre quand meme, mais certaines fonctions persistantes sont desactivees (ex: snipe persistant).
cargo fmt
cargo check- Ajouter/modifier un module de commande dans
src/commands/... - Declarer le module dans
src/commands/mod.rs - Ajouter son
COMMAND_DESCRIPTOR(metadata) - Router la commande dans
src/events/message.rs - Si interaction: router explicitement dans
src/events/interaction_create.rs - Verifier ACL/permissions et aliases
- Ne jamais commit de secrets (
.envest ignore) - Utiliser
.env.examplepour partager la config type
Le projet est distribue sous une licence personnalisee. Voir le fichier LICENSE.