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
|
V2.0: Refonte système bancaire - DB SQLite, RIB FR, TVA auto, multi-banques
- Remplace JSON par SQLite (aiosqlite) pour atomicité et intégrité
- Nouveau format RIB français avec checksum modulo 97
- Chaque banque a son propre rôle Discord (isolation par serveur)
- TVA automatique Particulier -> Entreprise, redirection au Fisc
- Institutions gouvernementales avec droit d'audit optionnel
- Commandes: /gouv, /banque, /audit, /mes-ribs
- Supprime: 16 anciens fichiers (entreprises, FBM, URSAFF, etc.)
- Reset complet des données, repart de zéro
2026-08-18 17:42:03 +02:00
|
|
|
bot = commands.Bot(command_prefix="!", application_id="1337733859814543410", intents=intents)
|
2026-08-16 19:37:15 +02:00
|
|
|
|
|
|
|
|
async def load_cogs():
|
|
|
|
|
"""Charge toutes les commandes."""
|
|
|
|
|
extensions = [
|
|
|
|
|
"commandes.message",
|
|
|
|
|
"commandes.identite",
|
|
|
|
|
"commandes.voir_carte_identite",
|
|
|
|
|
"commandes.virement",
|
V2.0: Refonte système bancaire - DB SQLite, RIB FR, TVA auto, multi-banques
- Remplace JSON par SQLite (aiosqlite) pour atomicité et intégrité
- Nouveau format RIB français avec checksum modulo 97
- Chaque banque a son propre rôle Discord (isolation par serveur)
- TVA automatique Particulier -> Entreprise, redirection au Fisc
- Institutions gouvernementales avec droit d'audit optionnel
- Commandes: /gouv, /banque, /audit, /mes-ribs
- Supprime: 16 anciens fichiers (entreprises, FBM, URSAFF, etc.)
- Reset complet des données, repart de zéro
2026-08-18 17:42:03 +02:00
|
|
|
"commandes.compte",
|
|
|
|
|
"commandes.mes_ribs",
|
|
|
|
|
"commandes.gouv",
|
|
|
|
|
"commandes.banque",
|
|
|
|
|
"commandes.audit",
|
2026-08-16 19:37:15 +02:00
|
|
|
"commandes.ticket",
|
|
|
|
|
"commandes.restranscription_staff",
|
|
|
|
|
"utils.welcome_message",
|
|
|
|
|
"commandes.permis",
|
|
|
|
|
"commandes.change_nickname",
|
|
|
|
|
"commandes.rename_all_on_join",
|
|
|
|
|
"commandes.message_tous",
|
|
|
|
|
"commandes.valider_visite_médicale",
|
|
|
|
|
"commandes.stats_commandes",
|
|
|
|
|
"commandes.roll",
|
2026-08-17 00:04:48 +02:00
|
|
|
"commandes.annonces_sessions",
|
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
|
|
|
"commandes.counting",
|
V2.0: Refonte système bancaire - DB SQLite, RIB FR, TVA auto, multi-banques
- Remplace JSON par SQLite (aiosqlite) pour atomicité et intégrité
- Nouveau format RIB français avec checksum modulo 97
- Chaque banque a son propre rôle Discord (isolation par serveur)
- TVA automatique Particulier -> Entreprise, redirection au Fisc
- Institutions gouvernementales avec droit d'audit optionnel
- Commandes: /gouv, /banque, /audit, /mes-ribs
- Supprime: 16 anciens fichiers (entreprises, FBM, URSAFF, etc.)
- Reset complet des données, repart de zéro
2026-08-18 17:42:03 +02:00
|
|
|
"commandes.config",
|
|
|
|
|
"commandes.panel"
|
2026-08-16 19:37:15 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
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()
|
V2.0: Refonte système bancaire - DB SQLite, RIB FR, TVA auto, multi-banques
- Remplace JSON par SQLite (aiosqlite) pour atomicité et intégrité
- Nouveau format RIB français avec checksum modulo 97
- Chaque banque a son propre rôle Discord (isolation par serveur)
- TVA automatique Particulier -> Entreprise, redirection au Fisc
- Institutions gouvernementales avec droit d'audit optionnel
- Commandes: /gouv, /banque, /audit, /mes-ribs
- Supprime: 16 anciens fichiers (entreprises, FBM, URSAFF, etc.)
- Reset complet des données, repart de zéro
2026-08-18 17:42:03 +02:00
|
|
|
await bot.change_presence(activity=discord.Game(name="la V2.0"))
|
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())
|