From 86e8e4695983e4d4c980048c9a199e6c4ede066a Mon Sep 17 00:00:00 2001 From: skylanix Date: Tue, 12 Aug 2025 01:33:04 +0200 Subject: [PATCH] =?UTF-8?q?Migration=20vers=20pr=C3=A9-prod=20:=20refonte?= =?UTF-8?q?=20Docker=20et=20documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile modernisé avec venv Python et locales françaises - Configuration docker-compose simplifiée - README complètement réécrit pour l'architecture multi-plateformes - Suppression bot.py et statuts.txt (remplacés par modules webapp/discordbot) - Migration vers interface d'administration web --- .env.example | 5 - Dockerfile | 14 ++- README.md | 271 ++++++++++++++++++++++++--------------------- bot.py | 114 ------------------- docker-compose.yml | 11 +- start.sh | 2 +- statuts.txt | 22 ---- 7 files changed, 159 insertions(+), 280 deletions(-) delete mode 100755 bot.py delete mode 100755 statuts.txt diff --git a/.env.example b/.env.example index 36cd4eb..7f886eb 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,3 @@ -# Configuration Discord Bot -TOKEN=votre_token_discord -STATUS=online -INTERVAL=3600 - # Configuration Zabbix (optionnel) ENABLE_ZABBIX=false ZABBIX_SERVER=zabbix-server.example.com diff --git a/Dockerfile b/Dockerfile index b72b160..743b41c 100755 --- a/Dockerfile +++ b/Dockerfile @@ -3,9 +3,12 @@ FROM debian:trixie-slim WORKDIR /app ENV DEBIAN_FRONTEND=noninteractive +ENV LANG=fr_FR.UTF-8 +ENV LC_ALL=fr_FR.UTF-8 RUN apt-get update && apt-get install -y --no-install-recommends \ apt-utils \ + locales \ python3 \ python3-pip \ python3-venv \ @@ -14,16 +17,21 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && dpkg -i zabbix-release_latest_7.4+debian12_all.deb \ && apt-get update \ && apt-get install -y --no-install-recommends zabbix-agent2 \ + && sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen \ + && locale-gen \ && rm -rf /var/lib/apt/lists/* \ && rm zabbix-release_latest_7.4+debian12_all.deb COPY requirements.txt . -COPY bot.py . -COPY statuts.txt . +COPY run-web.py . +COPY ./webapp ./webapp +COPY ./discordbot ./discordbot +COPY ./database ./database COPY zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf COPY start.sh /start.sh -RUN pip3 install --no-cache-dir --break-system-packages --root-user-action=ignore -r requirements.txt && \ +RUN python3 -m venv /app/venv && \ + /app/venv/bin/pip install --no-cache-dir -r requirements.txt && \ chmod +x /start.sh CMD ["/start.sh"] \ No newline at end of file diff --git a/README.md b/README.md index 68e01d3..61595cc 100755 --- a/README.md +++ b/README.md @@ -1,175 +1,188 @@ +# MamieHenriette 👵 -# 👵 Mamie Henriette - Discord Status Bot 🤖 +**Bot multi-plateformes pour Discord, Twitch et YouTube Live** -## 📖 Description -Mamie Henriette est un bot Discord intelligent qui change automatiquement de statut, surveillant et gérant votre serveur avec une touche d'humour et de caractère. +## Vue d'ensemble -## ✨ Fonctionnalités +Mamie Henriette est un bot intelligent open-source développé spécifiquement pour les communautés de [STEvE](https://www.youtube.com/@STEvE_YT) sur YouTube, [Twitch](https://www.twitch.tv/steve_yt) et Discord. -- Changement cyclique automatique des statuts -- Configuration flexible via variables d'environnement -- Gestion des erreurs et logging -- Support multi-statuts Discord -- Déploiement simplifié avec Docker -- 📊 Surveillance optionnelle avec Zabbix +> ⚠️ **Statut** : En cours de développement -## 🛠 Prérequis +### Caractéristiques principales +- Interface web d'administration complète +- Gestion multi-plateformes (Discord, Twitch, YouTube Live) +- Système de notifications automatiques +- Base de données intégrée pour la persistance +- Surveillance optionnelle avec Zabbix *(non testée)* + +## Fonctionnalités + +### Discord +- **Statuts dynamiques** : Rotation automatique des humeurs (10 min) +- **Notifications Humble Bundle** : Surveillance et alertes automatiques (30 min) +- **Commandes personnalisées** : Gestion via interface web +- **Modération** : Outils intégrés + +### Twitch *(en développement)* +- **Chat bot** : Commandes et interactions +- **Événements live** : Notifications de stream + +### YouTube Live *(en développement)* +- **Chat bot** : Modération et commandes +- **Événements** : Notifications de diffusion + +### Interface d'administration +- **Dashboard** : Vue d'ensemble et statistiques +- **Configuration** : Tokens, paramètres des plateformes +- **Gestion des humeurs** : Création et modification des statuts +- **Commandes** : Édition des commandes personnalisées +- **Modération** : Outils de gestion communautaire + +### Surveillance +- **Zabbix Agent 2** : Monitoring avancé *(non testé)* +- **Métriques** : Santé du bot et uptime + +## Installation + +### Prérequis - Docker et Docker Compose -- Compte Discord et Token du bot -- (Optionnel) Serveur Zabbix pour la surveillance +- Token Discord pour le bot -## 📦 Installation +### Démarrage rapide -1. Clonez le dépôt ```bash -git clone https://git.favrep.ch/lapatatedouce/MamieHenrriette -cd MamieHenrriette +# 1. Cloner le projet +git clone https://github.com/skylanix/MamieHenrietteCredential ``` -2. Copiez le fichier de configuration ```bash -cp .env.example .env +cd MamieHenriette ``` -3. Éditez le fichier `.env` avec vos paramètres ```bash -nano .env +# 2. Lancer avec Docker +docker compose up --build -d ``` -4. Démarrez le conteneur Docker +### Configuration + +1. **Interface web** : Accédez à http://localhost +2. **Token Discord** : Section "Configurations" +3. **Humeurs** : Définir les statuts du bot +4. **Canaux** : Configurer les notifications + +> ⚠️ **Important** : Après avoir configuré le token Discord, les humeurs et autres fonctionnalités via l'interface web, **redémarrez le conteneur** pour que les changements soient pris en compte : +> ```bash +> docker compose restart mamiehenriette +> ``` + +### Commandes Docker utiles -**Mode développement (avec logs):** ```bash -docker-compose up --build +# Logs en temps réel +docker compose logs -f mamiehenriette ``` -**Mode production (en arrière-plan):** ```bash -docker-compose up --build -d +# Logs d'un conteneur en cours d'exécution +docker logs -f mamiehenriette ``` -**Voir les logs:** ```bash -docker-compose logs -f discord-bot +# Redémarrer +docker compose restart mamiehenriette ``` -**Arrêter le conteneur:** ```bash -docker-compose down +# Arrêter +docker compose down ``` -## 🔧 Configuration +## Configuration avancée -### Variables d'environnement principales +### Variables d'environnement -- `TOKEN`: Votre token Discord (obligatoire) -- `STATUS`: Statut initial (défaut: online) -- `INTERVAL`: Intervalle de changement de statut (défaut: 3600 secondes) +```yaml +environment: + - ENABLE_ZABBIX=false # Surveillance (non testée) + - ZABBIX_SERVER=localhost + - ZABBIX_HOSTNAME=MamieHenriette +``` -### 📊 Configuration Zabbix (optionnelle) +### Interface d'administration -- `ENABLE_ZABBIX`: Activer la surveillance Zabbix (défaut: false) -- `ZABBIX_SERVER`: Adresse du serveur Zabbix -- `ZABBIX_HOSTNAME`: Nom d'hôte pour identifier le bot -- `ZABBIX_PORT`: Port d'exposition Zabbix (défaut: 10050) +| Section | Fonction | +|---------|----------| +| **Configurations** | Tokens et paramètres généraux | +| **Humeurs** | Gestion des statuts Discord | +| **Commandes** | Commandes personnalisées | +| **Modération** | Outils de gestion | -#### Métriques surveillées par Zabbix +## Architecture du projet -- Statut du bot Discord -- Temps de fonctionnement (uptime) -- Utilisation mémoire -- Erreurs et avertissements dans les logs -- Connectivité à Discord +### Structure des modules -#### Activation de Zabbix +``` +├── database/ # Couche données +│ ├── models.py # Modèles ORM +│ ├── helpers.py # Utilitaires BDD +│ └── schema.sql # Structure initiale +│ +├── discordbot/ # Module Discord +│ └── __init__.py # Bot et handlers +│ +└── webapp/ # Interface d'administration + ├── static/ # Assets statiques + ├── templates/ # Vues HTML + └── *.py # Contrôleurs par section +``` -Dans votre fichier `.env` : +### Composants principaux + +| Fichier | Rôle | +|---------|------| +| `run-web.py` | Point d'entrée principal | +| `start.sh` | Script de démarrage Docker | +| `docker-compose.yml` | Configuration des services | +| `requirements.txt` | Dépendances Python | + +## Spécifications techniques + +### Base de données (SQLite) +- **Configuration** : Paramètres et tokens +- **Humeur** : Statuts Discord rotatifs +- **Message** : Messages périodiques *(planifié)* +- **GameBundle** : Historique Humble Bundle + +### Architecture multi-thread +- **Thread 1** : Interface web Flask (port 5000) +- **Thread 2** : Bot Discord et tâches automatisées + +### Dépendances principales +``` +discord.py # API Discord +flask # Interface web +requests # Client HTTP +waitress # Serveur WSGI +``` + +## Développement + +### Installation locale ```bash -ENABLE_ZABBIX=true -ZABBIX_SERVER=votre-serveur-zabbix.com -ZABBIX_HOSTNAME=MamieHenriette +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt +python run-web.py ``` -### Fichier `statuts.txt` - -Créez un fichier `statuts.txt` avec vos statuts, un par ligne. - -Exemple : -``` -Surveiller le serveur -Mamie est là ! -En mode supervision -``` - -## 📋 Dépendances - -- discord.py==2.3.2 -- python-dotenv==1.0.0 +### Contribution +1. Fork du projet +2. Branche feature +3. Pull Request --- -# 🖥️ Installation environnement de développement - -## Installation des dépendances système - -```bash -sudo apt install python3 python3-pip -``` - -## Création de l'environnement Python local - -Dans le dossier du projet : - -```bash -python3 -m venv .venv -``` - -Puis activer l'environnement : - -```bash -source .venv/bin/activate -``` - -## Installation des dépendances Python - -```bash -pip install -r requirements.txt -``` - -## Exécution - -```bash -python3 run-web.py -``` - -# Structure du projet - -``` -. -|-- database : module de connexion à la BDD -| |-- __init.py__ -| |-- models.py : contient les pojo représentant chaque table -| |-- schema.sql : contient un scrip sql d'initialisation de la bdd, celui-ci doit être réentrant -| -|-- discordbot : module de connexion à discord -| |-- __init.py__ -| -|-- webapp : module du site web d'administration -| |-- static : Ressource fixe directement accessible par le navigateir -| | |-- css -| | |-- ... -| | -| |-- template : Fichier html -| | |-- template.html : structure globale du site -| | |-- commandes.html : page de gestion des commandes -| | |-- ... -| | -| |-- __init.py__ -| |-- index.py : controller de la page d'acceuil -| |-- commandes.py : controller de gestion des commandes -| |-- ... -| -|-- run-web.py : launcher -``` \ No newline at end of file +*Mamie Henriette vous surveille ! 👵👀* \ No newline at end of file diff --git a/bot.py b/bot.py deleted file mode 100755 index d9fe373..0000000 --- a/bot.py +++ /dev/null @@ -1,114 +0,0 @@ -import discord -import json -import random -import asyncio -import logging -import os - -class DiscordStatusBot: - def __init__(self): - # Configuration des logs - logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s') - - # Charger la configuration à partir des variables d'environnement - self.config = self.charger_configuration() - if not self.config: - logging.error("Impossible de charger la configuration") - exit(1) - - # Configuration des intents - intents = discord.Intents.default() - intents.message_content = False - - # Création du client - self.client = discord.Client(intents=intents) - - # Événements - self.setup_events() - - def charger_configuration(self): - """Chargement de la configuration à partir des variables d'environnement""" - config = { - 'token': os.getenv('TOKEN'), - 'status': os.getenv('STATUS', 'online'), - 'interval': int(os.getenv('INTERVAL', 60)) - } - - if not config['token']: - logging.error("Token non fourni") - return None - - return config - - def charger_statuts(self): - """Chargement des statuts depuis le fichier""" - try: - with open('/app/statuts.txt', 'r', encoding='utf-8') as fichier: - return [ligne.strip() for ligne in fichier.readlines() if ligne.strip()] - except FileNotFoundError: - logging.error("Fichier de statuts non trouvé") - return [] - - def setup_events(self): - """Configuration des événements du bot""" - @self.client.event - async def on_ready(): - logging.info(f'Bot connecté : {self.client.user}') - self.client.loop.create_task(self.changer_statut()) - - # Déplacez changer_statut à l'extérieur de setup_events - async def changer_statut(self): - """Changement cyclique du statut""" - await self.client.wait_until_ready() - statuts = self.charger_statuts() - if not statuts: - logging.warning("Aucun statut disponible") - return - - # Mapping des status Discord - status_mapping = { - 'online': discord.Status.online, - 'idle': discord.Status.idle, - 'dnd': discord.Status.dnd, - 'invisible': discord.Status.invisible - } - - # Récupérer le status depuis la configuration - status_discord = status_mapping.get(self.config.get('status', 'online'), discord.Status.online) - - while not self.client.is_closed(): - try: - # Sélection du statut - statut = random.choice(statuts) - - # Changement de statut avec custom activity - await self.client.change_presence( - status=status_discord, - activity=discord.CustomActivity(name=statut) - ) - logging.info(f"Statut changé : {statut}") - - # Délai entre les changements - await asyncio.sleep(self.config.get('interval', 60)) - except Exception as e: - logging.error(f"Erreur lors du changement de statut : {e}") - await asyncio.sleep(30) # Attente en cas d'erreur - - def executer(self): - """Lancement du bot""" - try: - if self.config and 'token' in self.config: - self.client.run(self.config['token']) - else: - logging.error("Token non trouvé dans la configuration") - except discord.LoginFailure: - logging.error("Échec de connexion - Vérifiez votre token") - except Exception as e: - logging.error(f"Erreur lors du lancement : {e}") - -def main(): - bot = DiscordStatusBot() - bot.executer() - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f6f46a0..c5f75bf 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,15 @@ services: - discord-bot: + mamiehenriette: container_name: MamieHenriette build: . restart: on-failure environment: - - TOKEN=VOTRE_TOKEN_DISCORD_ICI - - STATUS=online - - INTERVAL=3600 - ENABLE_ZABBIX=false - ZABBIX_SERVER=zabbix-server.example.com - ZABBIX_HOSTNAME=mamie-henriette-bot volumes: - - ./statuts.txt:/app/statuts.txt - # ports: + - ./instance:/app/instance + + ports: + - 80:5000 # - "10050:10050" # Décommentez si ENABLE_ZABBIX=true \ No newline at end of file diff --git a/start.sh b/start.sh index 4371cb5..b6cc32c 100644 --- a/start.sh +++ b/start.sh @@ -18,4 +18,4 @@ else fi echo "Démarrage du bot Discord..." -exec python3 bot.py \ No newline at end of file +exec /app/venv/bin/python run-web.py \ No newline at end of file diff --git a/statuts.txt b/statuts.txt deleted file mode 100755 index bf36966..0000000 --- a/statuts.txt +++ /dev/null @@ -1,22 +0,0 @@ -STEvE galère un peu, mais moi je gère le bazar. -Sans mamie, vous seriez bien vite paumés. -Ici, c’est mamie qui veille, alors écoutez un peu. -STEvE dort, moi je fais tourner la baraque. -J’aime râler, mais c’est pour vous réveiller un peu. -Restez sages, sinon mamie va grogner un peu. -Les malins, faites-moi plaisir, écoutez mamie. -Jamais le bazar ne s’installe, je veille au grain. -C’est moi qui tiens la maison. -Vous aimez STEvE ? Moi, je vous tolère. -Gardez votre calme, mamie veille sur vous. -Quand STEvE foire, je suis là pour arranger ça. -Suivez STEvE, mais surtout ne perdez pas mamie de vue. -STEvE rêve, moi je travaille en coulisses. -Ecoutez mamie, c’est pour votre bien. -Pas d’embrouille, ou mamie va devoir intervenir. -STEvE dort, mais mamie veille toujours. -Vous râlez ? Moi aussi, mais on fait avec. -STEvE prend son temps, moi je veille au grain. -Pas de bazar, mamie préfère le calme. -STEvE est parfois perdu, mais mamie est là. -Le serveur est calme, grâce à mamie. \ No newline at end of file