Files
MamieHenriette/bot.py
2025-08-05 17:27:46 +02:00

114 lines
3.9 KiB
Python
Executable File

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