commit 338edfb137c8b01233f7b3d37f8a3385814e2ec5 Author: lfirmin Date: Sat May 2 02:53:55 2026 +0200 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..71c780a --- /dev/null +++ b/README.md @@ -0,0 +1,139 @@ +# 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 + +1. Aller sur [discord.com/developers](https://discord.com/developers/applications) +2. Créer une application → Bot +3. Activer les **Privileged Gateway Intents** suivants : + - `Server Members Intent` (GUILD_MEMBERS) + - `Message Content Intent` (MESSAGE_CONTENT) +4. Récupérer le **Token** et l'**Application ID** +5. 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 + +```bash +cp config.yaml.example config.yaml +cp .env.example .env +``` + +Editer `.env` : +```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 + +```bash +go build -o ticketbot ./cmd/bot +./ticketbot +``` + +### Avec Docker Compose + +```bash +docker compose up -d +docker compose logs -f +``` + +## Commandes Discord + +| Commande | Permission | Description | +|----------|-----------|-------------| +| `/panel_send ` | `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 ` | staff du ticket ou admin | Ajoute un user au channel ticket | +| `/ticket remove ` | staff du ticket ou admin | Retire un user du channel ticket | +| `/ticket rename ` | 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 ` | 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_channel` avec un bouton **Claim** +- Après `claim_reup_minutes` minutes 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 staff +- `staff_role` par 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 `text` en dev, `json` en prod (via `LOG_FORMAT`) +- Niveaux : `debug` / `info` / `warn` / `error` (via `LOG_LEVEL`) +- En `debug` : log de chaque interaction, action claim/re-up/close, hot reload, requêtes DB lentes + +## Déploiement + +1. Cloner le repo +2. Configurer `.env` et `config.yaml` +3. `docker compose up -d` +4. Vérifier les logs : `docker compose logs -f` + +Les données SQLite sont persistées dans `./data/`, les transcripts dans `./transcripts/`.