- Add utils/guild_config.py: centralized config loader per guild (data/guilds/{id}.json)
- Add commandes/config.py: /config set_role, /config set_channel, /config set_category, /config voir, /config reset
- Replace ALL hardcoded role IDs (banquier, gouvernement, citoyen, staff, ems, permis, fbm, ursaff, etc.) with guild_config lookups
- Replace ALL hardcoded channel IDs (welcome, candidature, questions, mp_reception) with guild_config lookups
- Replace ALL hardcoded category IDs (ticket) with guild_config lookups
- Remove duplicate commandes/welcome_message.py (kept utils/ version)
- Remove 20+ hardcoded snowflake IDs across 22 files
- Guilds configure via /config on Discord, no code changes needed
126 lines
4 KiB
Python
126 lines
4 KiB
Python
import discord
|
|
import asyncio
|
|
import logging
|
|
from utils.logger import log_info, log_error
|
|
from discord.ext import commands
|
|
from discord import app_commands, Intents, Permissions
|
|
from dotenv import load_dotenv
|
|
import os
|
|
from utils.stats_manager import enregistrer_utilisation
|
|
|
|
# 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.roll",
|
|
"commandes.annonces_sessions",
|
|
"commandes.retrait_gouv",
|
|
"commandes.counting",
|
|
"commandes.config"
|
|
]
|
|
|
|
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()
|
|
await bot.change_presence(activity=discord.Game(name="la V1.8")) # Ajout du status
|
|
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())
|