From 16fd740fe27f67240f7b5598640acc827c421d66 Mon Sep 17 00:00:00 2001 From: Phiippe Favre Date: Wed, 30 Jul 2025 22:15:22 +0200 Subject: [PATCH] first commit --- Dockerfile | 11 +++++ README.md | 58 +++++++++++++++++++++++ bot.py | 114 +++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 11 +++++ requirements.txt | 2 + statuts.txt | 22 +++++++++ 6 files changed, 218 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 bot.py create mode 100644 docker-compose.yml create mode 100644 requirements.txt create mode 100644 statuts.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a8d3033 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.9-slim + +WORKDIR /app + +COPY requirements.txt . +COPY bot.py . +COPY statuts.txt . + +RUN pip install --no-cache-dir -r requirements.txt + +CMD ["python", "bot.py"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ecfd92 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +Voici le README.md pour votre projet : + +# 👵 Mamie Henrriette - Discord Status Bot 🤖 + +## 📖 Description + +Mamie Henrriette 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. + +## ✨ Fonctionnalités + +- 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 + +## 🛠 Prérequis + +- Docker +- Compte Discord et Token du bot + +## 📦 Installation + +1. Clonez le dépôt +```bash +git clone https://git.favrep.ch/lapatatedouce/MamieHenrriette +cd MamieHenrriette +``` + +2. Conteneur Docker + +```bash +docker-compose up --build +``` + +## 🔧 Configuration + +### Variables d'environnement + +- `TOKEN`: Votre token Discord (obligatoire) +- `STATUS`: Statut initial (défaut: online) +- `INTERVAL`: Intervalle de changement de statut (défaut: 60 secondes) + +### 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 \ No newline at end of file diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..d9fe373 --- /dev/null +++ b/bot.py @@ -0,0 +1,114 @@ +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 new file mode 100644 index 0000000..0e83bdf --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +services: + discord-bot: + container_name: MamieHenrriette + build: . + restart: on-failure + environment: + - TOKEN=your token + - STATUS=online + - INTERVAL=3600 + volumes: + - ./statuts.txt:/app/statuts.txt \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5e6a52d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +discord.py==2.3.2 +python-dotenv==1.0.0 \ No newline at end of file diff --git a/statuts.txt b/statuts.txt new file mode 100644 index 0000000..bf36966 --- /dev/null +++ b/statuts.txt @@ -0,0 +1,22 @@ +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