Vicy_Publique/__main__.py
utilisateurqu 2e38d05152 Modularize bot: per-guild config system for roles/channels/categories
- 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
2026-08-17 00:12:57 +02:00

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