2026-08-16 19:37:15 +02:00
import discord
import asyncio
import logging
from utils . logger import log_info , log_error
from discord . ext import commands
2026-08-16 19:55:22 +02:00
from discord import app_commands , Intents , Permissions
2026-08-16 19:37:15 +02:00
from dotenv import load_dotenv
import os
2026-08-16 19:55:22 +02:00
from utils . stats_manager import enregistrer_utilisation
2026-08-16 19:37:15 +02:00
# Configuration du logger Discord (niveau DEBUG pour afficher tous les événements importants)
logging . basicConfig ( level = logging . DEBUG )
discord . utils . setup_logging ( level = logging . DEBUG , root = False )
# Configuration des intents
intents = Intents . default ( )
intents . message_content = True
intents . guilds = True
intents . members = True
intents . reactions = True
# Permissions du bot
permissions = Permissions ( )
permissions . update (
manage_nicknames = True ,
send_messages = True ,
read_messages = True ,
manage_channels = True ,
manage_messages = True ,
add_reactions = True ,
use_application_commands = True ,
view_channel = True
)
# Initialisation du bot
bot = commands . Bot ( command_prefix = " ! " , application_id = " 1310235313461002241 " , intents = intents )
async def load_cogs ( ) :
""" Charge toutes les commandes. """
extensions = [
" commandes.message " ,
" commandes.identite " ,
" commandes.voir_carte_identite " ,
" commandes.virement " ,
" commandes.transactions " ,
" commandes.ajouter_argent " ,
" commandes.ticket " ,
" commandes.restranscription_staff " ,
" utils.welcome_message " ,
" commandes.permis " ,
" commandes.ouvrir_compte " ,
" commandes.compte " ,
" commandes.change_nickname " ,
" commandes.rename_all_on_join " ,
" commandes.message_tous " ,
" commandes.retirer_argent " ,
" commandes.ouvrir_comptes_entreprises " ,
" commandes.compte_gouvernement " ,
" commandes.comptes_entreprises " ,
" commandes.compte_urssaf " ,
" commandes.compte_banque_nationale " ,
" commandes.virement_entreprise " ,
" commandes.virement_gouvernement " ,
" commandes.valider_visite_médicale " ,
" commandes.abonnement " ,
" commandes.virement_banquier " ,
" commandes.virement_banquier_entreprise " ,
" commandes.compte_fbm " ,
" commandes.virement_fbm " ,
" commandes.virement_ursaff " ,
" commandes.stats_commandes " ,
" commandes.taches " ,
" commandes.roll " ,
" commandes.annonces_sessions " , # Fait : V1.7 correction des annonces de sessions
" commandes.retrait_gouv " ,
" commandes.absence_staff " , # Fait : V1.7 pouvoir voir plus de 3 absences staff (pagination)
" commandes.liste_taches " , # Fait : V1.7 Rebuild du système de taches pour le rendre plus moderne
" commandes.counting "
# Pas fait : V1.8 Amélioration des stats de commandes ajouts de courbes et de graphiques + Voir le top 10 des personnes qui utilisent le plus les commandes
]
for ext in extensions :
try :
await bot . load_extension ( ext )
log_info ( f " Extension chargée : { ext } " )
except Exception as e :
log_error ( f " Erreur lors du chargement de { ext } : { e } " )
@bot.event
async def on_ready ( ) :
# Affiche que le bot est prêt et synchronise les commandes slash
log_info ( f " Connecté en tant que { bot . user } " )
await load_cogs ( )
await bot . tree . sync ( )
2026-08-16 19:55:22 +02:00
await bot . change_presence ( activity = discord . Game ( name = " la V1.8 " ) ) # Ajout du status
2026-08-16 19:37:15 +02:00
log_info ( " Commandes synchronisées. " )
# Gère les erreurs de commandes classiques
@bot.event
async def on_command_error ( ctx , error ) :
log_error ( f " Erreur dans la commande { ctx . command } : { error } " )
# Gère toutes les autres erreurs inattendues
@bot.event
async def on_error ( event_method , * args , * * kwargs ) :
log_error ( f " Erreur non gérée dans l ' événement { event_method } " , exc_info = True )
# 👉 Enregistre chaque commande slash utilisée
@bot.event
async def on_app_command_completion ( interaction : discord . Interaction , command : app_commands . Command ) :
try :
user_id = interaction . user . id
guild_id = interaction . guild . id if interaction . guild else 0
enregistrer_utilisation ( command . name , user_id , guild_id )
except Exception as e :
log_error ( f " Erreur en enregistrant les stats : { e } " )
async def main ( ) :
# Charge les variables d'environnement et démarre le bot
load_dotenv ( )
token = os . getenv ( " TOKEN " )
try :
log_info ( " Démarrage du bot... " )
await bot . start ( token )
except Exception as e :
log_error ( f " Erreur critique: { e } " , exc_info = True )
if __name__ == " __main__ " :
asyncio . run ( main ( ) )