first commit

This commit is contained in:
2025-07-30 22:15:22 +02:00
commit 16fd740fe2
6 changed files with 218 additions and 0 deletions

11
Dockerfile Normal file
View File

@@ -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"]

58
README.md Normal file
View File

@@ -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

114
bot.py Normal file
View File

@@ -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()

11
docker-compose.yml Normal file
View File

@@ -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

2
requirements.txt Normal file
View File

@@ -0,0 +1,2 @@
discord.py==2.3.2
python-dotenv==1.0.0

22
statuts.txt Normal file
View File

@@ -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, cest mamie qui veille, alors écoutez un peu.
STEvE dort, moi je fais tourner la baraque.
Jaime râler, mais cest 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 sinstalle, je veille au grain.
Cest 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, cest pour votre bien.
Pas dembrouille, 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.