import discord from discord import app_commands from discord.ext import commands from utils.guild_config import has_role from utils.bank_manager import BankManager bank_manager = BankManager() class Gouv(commands.Cog): def __init__(self, bot): self.bot = bot gouv_group = app_commands.Group(name="gouv", description="Commandes gouvernementales") def _check_gouv(self, interaction: discord.Interaction) -> bool: return has_role(interaction.user, "gouvernement") @gouv_group.command(name="creer-banque", description="Créer une nouvelle banque commerciale") @app_commands.describe( nom="Nom de la banque (ex: NGC Bank)", role="Le rôle Discord des banquiers de cette banque" ) async def creer_banque(self, interaction: discord.Interaction, nom: str, role: discord.Role): if not self._check_gouv(interaction): await interaction.response.send_message("❌ Réservé au rôle **Gouvernement**.", ephemeral=True) return try: result = await bank_manager.creer_banque(interaction.guild.id, nom, role.id) embed = discord.Embed( title="🏦 Banque créée", description=( f"**{nom}** a été créée avec succès.\n\n" f"**Rôle banquiers :** {role.mention}\n" f"**Code établissement :** `{result['establishment_code']}`\n" f"**ID banque :** `{result['id']}`" ), color=discord.Color.green(), ) await interaction.response.send_message(embed=embed, ephemeral=True) except Exception as e: await interaction.response.send_message(f"❌ Erreur : {e}", ephemeral=True) @gouv_group.command(name="creer-institution", description="Créer une institution (Fisc, URSAFF, etc.)") @app_commands.describe( nom="Nom de l'institution", role="Le rôle Discord qui gère cette institution", audit="Peut-elle consulter les comptes de toutes les banques ?" ) async def creer_institution( self, interaction: discord.Interaction, nom: str, role: discord.Role, audit: bool = False, ): if not self._check_gouv(interaction): await interaction.response.send_message("❌ Réservé au rôle **Gouvernement**.", ephemeral=True) return try: result = await bank_manager.creer_institution( interaction.guild.id, nom, role.id, audit ) embed = discord.Embed( title="🏛️ Institution créée", description=( f"**{nom}** a été créée.\n\n" f"**Rôle :** {role.mention}\n" f"**Droit d'audit :** {'✅ Oui' if audit else '❌ Non'}\n" f"**ID :** `{result['id']}`" ), color=discord.Color.blue(), ) await interaction.response.send_message(embed=embed, ephemeral=True) except Exception as e: await interaction.response.send_message(f"❌ Erreur : {e}", ephemeral=True) @gouv_group.command(name="config-fisc", description="Définir quelle institution reçoit la TVA") @app_commands.describe( institution="L'institution qui servira de Fisc" ) async def config_fisc(self, interaction: discord.Interaction, institution: str): if not self._check_gouv(interaction): await interaction.response.send_message("❌ Réservé au rôle **Gouvernement**.", ephemeral=True) return institutions = await bank_manager.lister_institutions(interaction.guild.id) target = None for inst in institutions: if inst["name"].lower() == institution.lower(): target = inst break if not target: await interaction.response.send_message( f"❌ Institution **{institution}** introuvable. Institutions disponibles : {', '.join(i['name'] for i in institutions) or 'aucune'}", ephemeral=True, ) return ok = await bank_manager.configurer_fisc(interaction.guild.id, target["id"]) if ok: embed = discord.Embed( title="🏛️ Fisc configuré", description=f"**{target['name']}** reçoit désormais la TVA de tous les virements Particulier → Entreprise.", color=discord.Color.green(), ) await interaction.response.send_message(embed=embed, ephemeral=True) else: await interaction.response.send_message("❌ Erreur lors de la configuration.", ephemeral=True) @gouv_group.command(name="lister-banques", description="Lister toutes les banques du serveur") async def lister_banques(self, interaction: discord.Interaction): if not self._check_gouv(interaction): await interaction.response.send_message("❌ Réservé au rôle **Gouvernement**.", ephemeral=True) return banques = await bank_manager.lister_banques(interaction.guild.id) if not banques: await interaction.response.send_message("Aucune banque configurée.", ephemeral=True) return embed = discord.Embed(title="🏦 Banques du serveur", color=discord.Color.blue()) for b in banques: role = interaction.guild.get_role(b["role_id"]) role_text = role.mention if role else f"`{b['role_id']}` introuvable" embed.add_field( name=b["name"], value=( f"**Rôle :** {role_text}\n" f"**Code établissement :** `{b['establishment_code']}`\n" f"**Réserve :** `{b['vault_balance']:.2f}€`\n" f"**Encours clients :** `{b['clients_total_balance']:.2f}€`" ), inline=False, ) await interaction.response.send_message(embed=embed, ephemeral=True) @gouv_group.command(name="lister-institutions", description="Lister toutes les institutions du serveur") async def lister_institutions(self, interaction: discord.Interaction): if not self._check_gouv(interaction): await interaction.response.send_message("❌ Réservé au rôle **Gouvernement**.", ephemeral=True) return institutions = await bank_manager.lister_institutions(interaction.guild.id) if not institutions: await interaction.response.send_message("Aucune institution configurée.", ephemeral=True) return fisc_config = await bank_manager.get_fisc_config(interaction.guild.id) fisc_id = fisc_config["institution_id"] if fisc_config else None embed = discord.Embed(title="🏛️ Institutions du serveur", color=discord.Color.blue()) for inst in institutions: role = interaction.guild.get_role(inst["role_id"]) if inst["role_id"] else None role_text = role.mention if role else "Non assigné" is_fisc = " 💰 **(Fisc)**" if inst["id"] == fisc_id else "" embed.add_field( name=f"{inst['name']}{is_fisc}", value=( f"**Rôle :** {role_text}\n" f"**Audit :** {'✅ Toutes les banques' if inst['can_audit_all'] else '❌ Non'}\n" f"**ID :** `{inst['id']}`" ), inline=False, ) await interaction.response.send_message(embed=embed, ephemeral=True) @gouv_group.command(name="supprimer-banque", description="Supprimer une banque") @app_commands.describe(nom="Nom de la banque à supprimer") async def supprimer_banque(self, interaction: discord.Interaction, nom: str): if not self._check_gouv(interaction): await interaction.response.send_message("❌ Réservé au rôle **Gouvernement**.", ephemeral=True) return banque = await bank_manager.get_banque_by_name(interaction.guild.id, nom) if not banque: await interaction.response.send_message(f"❌ Banque **{nom}** introuvable.", ephemeral=True) return ok = await bank_manager.supprimer_banque(interaction.guild.id, banque["id"]) if ok: await interaction.response.send_message( f"✅ Banque **{nom}** supprimée avec tous ses comptes.", ephemeral=True ) else: await interaction.response.send_message("❌ Erreur lors de la suppression.", ephemeral=True) async def setup(bot): await bot.add_cog(Gouv(bot))