ticketbot — Bot Discord de gestion de tickets (Phase 1)
Bot Discord en Go pour la gestion de tickets : claim system, re-up automatique, transcripts HTML, hot reload de config.
Stack
- Go 1.22+ · bwmarrin/discordgo · modernc.org/sqlite (pas de CGO) · gopkg.in/yaml.v3 · fsnotify · log/slog
Installation
Prérequis
- Go 1.22+ ou Docker + Docker Compose
- Un bot Discord configuré (voir ci-dessous)
Configurer le bot Discord
- Aller sur discord.com/developers
- Créer une application → Bot
- Activer les Privileged Gateway Intents suivants :
Server Members Intent(GUILD_MEMBERS)Message Content Intent(MESSAGE_CONTENT)
- Récupérer le Token et l'Application ID
- Inviter le bot avec les permissions suivantes (valeur
536890374208) :- Manage Channels
- Manage Roles (seulement pour les rôles en dessous du rôle du bot)
- Read Messages / View Channels
- Send Messages
- Read Message History
- Attach Files
- Manage Messages
Hiérarchie de rôles : le bot ne peut gérer que des rôles en dessous de son rôle le plus haut dans le serveur. Placez le rôle du bot au-dessus des staff roles concernés.
Configuration
cp config.yaml.example config.yaml
cp .env.example .env
Editer .env :
DISCORD_TOKEN=ton_token_ici
DISCORD_APP_ID=ton_app_id_ici
GUILD_ID=ton_guild_id_ici
LOG_LEVEL=info # debug / info / warn / error
LOG_FORMAT=text # text (dev) ou json (prod)
Editer config.yaml en remplaçant tous les *_ID par les vrais IDs Discord (clic droit → Copier l'ID avec mode développeur activé).
Démarrage
Sans Docker
go build -o ticketbot ./cmd/bot
./ticketbot
Avec Docker Compose
docker compose up -d
docker compose logs -f
Commandes Discord
| Commande | Permission | Description |
|---|---|---|
/panel_send <panel> <channel> |
admin_role |
Envoie un panel de tickets dans un channel |
/ticket close [reason] |
staff du ticket ou admin | Ferme le ticket (génère transcript) |
/ticket add <user> |
staff du ticket ou admin | Ajoute un user au channel ticket |
/ticket remove <user> |
staff du ticket ou admin | Retire un user du channel ticket |
/ticket rename <name> |
staff du ticket ou admin | Renomme le channel ticket |
/ticket transcript |
staff du ticket ou admin | Génère le transcript HTML à la volée |
/ticket reclaim |
staff du type du ticket ou admin | Reprend un ticket claimé par un staff parti |
/convocation <user> <reason> |
tout staff (n'importe quel type) | Crée une convocation |
Toutes les commandes
/ticket *doivent être utilisées dans le channel du ticket.
Système de claim
- À l'ouverture d'un ticket, un message est posté dans
claim_channelavec un bouton Claim - Après
claim_reup_minutesminutes sans claim, le message est re-posté avec un ping<@&staff_role> - Le re-up continue jusqu'au claim
- Au redémarrage du bot, les boucles re-up sont automatiquement reprises depuis la DB
Autorisation
Toute la logique d'autorisation repose sur les rôles configurés dans config.yaml, jamais sur les permissions Discord natives.
admin_role: accès à toutes les commandes admin et staffstaff_rolepar type : claim du type concerné, toutes les actions/ticket *sur les tickets de ce type/convocation: tout membre ayant au moins un staff_role (tous types confondus)
Hot reload
Modifier config.yaml → le bot recharge automatiquement dans les 500ms.
- Si la config est invalide, l'ancienne est conservée et l'erreur est loggée
- Les tickets ouverts ne sont pas impactés par les changements de config
Structure des fichiers
ticketbot/
├── cmd/bot/main.go # Point d'entrée
├── internal/
│ ├── config/ # Config YAML + hot reload
│ ├── db/ # SQLite + repos
│ ├── tickets/ # Logique métier + AuthService
│ ├── claim/ # Gestionnaire claim + re-up
│ ├── transcript/ # Génération HTML
│ ├── discord/ # Session, router, commandes, composants
│ └── logger/ # Logs channel Discord
├── transcripts/ # Transcripts HTML générés (gitignore)
├── data/ # Base SQLite (gitignore)
├── config.yaml.example
├── .env.example
├── Dockerfile
└── docker-compose.yml
Logs
- Format
texten dev,jsonen prod (viaLOG_FORMAT) - Niveaux :
debug/info/warn/error(viaLOG_LEVEL) - En
debug: log de chaque interaction, action claim/re-up/close, hot reload, requêtes DB lentes
Déploiement
- Cloner le repo
- Configurer
.envetconfig.yaml docker compose up -d- Vérifier les logs :
docker compose logs -f
Les données SQLite sont persistées dans ./data/, les transcripts dans ./transcripts/.