193 lines
5.1 KiB
Markdown
193 lines
5.1 KiB
Markdown
|
|
# 🖥️ Discord Status Bot
|
||
|
|
|
||
|
|
Bot Discord de monitoring serveur en temps réel.
|
||
|
|
Affiche et met à jour automatiquement un message épinglé dans chaque serveur Discord
|
||
|
|
avec l'état des ressources, la cause des ralentissements, et une ETA de retour à la normale.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Architecture
|
||
|
|
|
||
|
|
```
|
||
|
|
[Serveur de jeux] [n'importe où]
|
||
|
|
agent.py ──── HTTP POST ────▶ bot.py
|
||
|
|
(psutil) /metrics ├── serveur aiohttp (port 8765)
|
||
|
|
├── StatusEngine (analyse)
|
||
|
|
└── discord.py (mise à jour embed épinglé)
|
||
|
|
│
|
||
|
|
┌─────────┼─────────┐
|
||
|
|
Guilde 1 Guilde 2 Guilde 3 ...
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Installation
|
||
|
|
|
||
|
|
### 1. Dépendances
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pip install -r requirements.txt
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Configuration
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cp config.example.json config.json
|
||
|
|
```
|
||
|
|
|
||
|
|
Remplis `config.json` :
|
||
|
|
|
||
|
|
| Clé | Description |
|
||
|
|
|-----------------|--------------------------------------------------------------------|
|
||
|
|
| `discord_token` | Token de ton bot (https://discord.com/developers/applications) |
|
||
|
|
| `api_secret` | Mot de passe partagé entre le bot et l'agent (chaîne aléatoire) |
|
||
|
|
| `api_port` | Port HTTP du bot (défaut : 8765) |
|
||
|
|
|
||
|
|
> ⚠️ Le même `api_secret` doit être renseigné dans `agent.py` (`API_SECRET`) et dans `config.json`.
|
||
|
|
|
||
|
|
### 3. Adapter l'agent
|
||
|
|
|
||
|
|
Dans `agent.py`, modifie :
|
||
|
|
|
||
|
|
```python
|
||
|
|
BOT_API_URL = "http://ADRESSE_DU_BOT:8765/metrics"
|
||
|
|
API_SECRET = "le_meme_secret_que_dans_config.json"
|
||
|
|
```
|
||
|
|
|
||
|
|
Si le bot et l'agent tournent sur la même machine, laisse `http://localhost:8765/metrics`.
|
||
|
|
|
||
|
|
Si le bot est sur une autre machine (VPS dédié Discord), utilise son IP/domaine.
|
||
|
|
|
||
|
|
### 4. Ajouter les mots-clés de tes services
|
||
|
|
|
||
|
|
Dans `agent.py`, `SERVICE_KEYWORDS` :
|
||
|
|
|
||
|
|
```python
|
||
|
|
SERVICE_KEYWORDS = {
|
||
|
|
"minecraft": ["java", "minecraft", "paper"],
|
||
|
|
"satisfactory": ["factoryserver"],
|
||
|
|
"ollama": ["ollama"],
|
||
|
|
# Ajoute tes propres services ici
|
||
|
|
"mon_jeu": ["mon_process_name"],
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Lancement
|
||
|
|
|
||
|
|
### Bot (à lancer en premier)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python bot.py
|
||
|
|
```
|
||
|
|
|
||
|
|
Ou en service systemd :
|
||
|
|
|
||
|
|
```ini
|
||
|
|
[Unit]
|
||
|
|
Description=Discord Status Bot
|
||
|
|
After=network.target
|
||
|
|
|
||
|
|
[Service]
|
||
|
|
WorkingDirectory=/chemin/vers/discord-status-bot
|
||
|
|
ExecStart=/usr/bin/python3 bot.py
|
||
|
|
Restart=always
|
||
|
|
|
||
|
|
[Install]
|
||
|
|
WantedBy=multi-user.target
|
||
|
|
```
|
||
|
|
|
||
|
|
### Agent (sur le serveur de jeux)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python agent.py
|
||
|
|
```
|
||
|
|
|
||
|
|
Idem, peut être lancé en service systemd.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Configuration Discord
|
||
|
|
|
||
|
|
### Créer le bot Discord
|
||
|
|
|
||
|
|
1. Aller sur https://discord.com/developers/applications
|
||
|
|
2. **New Application** → donne-lui un nom
|
||
|
|
3. Onglet **Bot** → **Reset Token** → copier le token dans `config.json`
|
||
|
|
4. Activer **Server Members Intent** et **Message Content Intent** si nécessaire
|
||
|
|
5. Onglet **OAuth2 > URL Generator** :
|
||
|
|
- Scopes : `bot`, `applications.commands`
|
||
|
|
- Bot Permissions : `Send Messages`, `Manage Messages`, `Embed Links`, `Read Message History`
|
||
|
|
6. Copier l'URL générée et l'ouvrir pour inviter le bot sur tes serveurs
|
||
|
|
|
||
|
|
### Configurer chaque serveur Discord
|
||
|
|
|
||
|
|
Une fois le bot invité sur un serveur et lancé localement :
|
||
|
|
|
||
|
|
1. Va dans le salon où tu veux le tableau de bord
|
||
|
|
2. Tape `/setup`
|
||
|
|
3. Le bot envoie et épingle le premier message de statut
|
||
|
|
4. Répète sur chaque serveur Discord
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Commandes slash disponibles
|
||
|
|
|
||
|
|
| Commande | Description | Permissions |
|
||
|
|
|--------------|--------------------------------------------------|-------------|
|
||
|
|
| `/status` | Affiche l'état actuel (message éphémère) | Tous |
|
||
|
|
| `/services` | Détail de chaque service détecté | Tous |
|
||
|
|
| `/setup` | Configure le salon actuel comme tableau de bord | Admin |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Personnalisation
|
||
|
|
|
||
|
|
### Seuils d'alerte
|
||
|
|
|
||
|
|
Dans `status_engine.py`, modifie `THRESHOLDS` :
|
||
|
|
|
||
|
|
```python
|
||
|
|
THRESHOLDS = {
|
||
|
|
"cpu": {"warning": 70, "critical": 85},
|
||
|
|
"ram": {"warning": 80, "critical": 90},
|
||
|
|
"swap": {"warning": 40, "critical": 70},
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Fréquence de mise à jour
|
||
|
|
|
||
|
|
- **Agent** → `PUSH_INTERVAL` dans `agent.py` (défaut : 15s)
|
||
|
|
- **Bot** → `@tasks.loop(seconds=20)` dans `bot.py`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Exemple de rendu
|
||
|
|
|
||
|
|
```
|
||
|
|
🔴 Serveur — Surchargé
|
||
|
|
|
||
|
|
📊 Ressources
|
||
|
|
CPU ████████░░ 82% 🌡️ 74°C
|
||
|
|
RAM █████████░ 91% (14.6/16.0 GB)
|
||
|
|
SWAP ████░░░░░░ 43%
|
||
|
|
|
||
|
|
📈 Charge (1m / 5m / 15m) : 7.42 / 6.80 / 5.12
|
||
|
|
|
||
|
|
🎮 Services actifs
|
||
|
|
▸ ⛏️ Minecraft 🔥 — CPU 45% | RAM 4.2 GB
|
||
|
|
▸ 🤖 Ollama (IA) 🔥 — CPU 38% | RAM 8.1 GB
|
||
|
|
▸ 🏭 Satisfactory ⚡ — CPU 12% | RAM 2.1 GB
|
||
|
|
|
||
|
|
🔍 Pourquoi ça rame ?
|
||
|
|
• CPU à 82% — principal consommateur : Minecraft (45%)
|
||
|
|
• RAM à 91% (14.6/16.0 GB) — Ollama (IA) occupe 8.1 GB
|
||
|
|
• 💡 Conflit probable : Ollama (IA) et Minecraft, Satisfactory se partagent les ressources
|
||
|
|
|
||
|
|
⏱️ Retour à la normale
|
||
|
|
⏱️ Retour à la normale dans ~8 min
|
||
|
|
|
||
|
|
Dernière mise à jour 26/02/2026 21:34
|
||
|
|
```
|