- 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
184 lines
7.5 KiB
Python
184 lines
7.5 KiB
Python
import discord
|
|
from discord import app_commands
|
|
from discord.ext import commands
|
|
import json
|
|
from datetime import datetime
|
|
|
|
from utils.guild_config import has_role
|
|
GOUV_BANQUE = "Gouvernement"
|
|
GOUV_COMPTE = "GOUV"
|
|
GOUV_RIB = "00000 00000 00000000000 00"
|
|
|
|
class GouvVirement(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
|
|
# Liste des banques à jour (ajoute ici toutes les banques possibles de ton système)
|
|
banque_choices = [
|
|
app_commands.Choice(name="Victoria's Credit Bank", value="Victoria's Credit Bank"),
|
|
app_commands.Choice(name="NGC Bank", value="NGC Bank"),
|
|
]
|
|
|
|
@app_commands.command(
|
|
name="gouv_virer",
|
|
description="Le Gouvernement vire de l'argent de son compte vers un autre RIB (entreprise ou particulier)."
|
|
)
|
|
@app_commands.choices(banque=banque_choices)
|
|
@app_commands.describe(
|
|
rib="Le RIB destinataire",
|
|
montant="Montant à virer",
|
|
banque="Banque cible (facultatif)"
|
|
)
|
|
async def gouv_virer(
|
|
self,
|
|
interaction: discord.Interaction,
|
|
rib: str,
|
|
montant: float,
|
|
banque: app_commands.Choice[str] = None
|
|
):
|
|
# Vérification du rôle Gouvernement
|
|
if not has_role(interaction.user, "gouvernement"):
|
|
await interaction.response.send_message("❌ Seul le Gouvernement peut utiliser cette commande.", ephemeral=True)
|
|
return
|
|
|
|
if montant <= 0:
|
|
await interaction.response.send_message("❌ Le montant doit être supérieur à zéro.", ephemeral=True)
|
|
return
|
|
|
|
banque_nom = banque.value if banque else None
|
|
|
|
# Charger les fichiers
|
|
try:
|
|
with open("comptes_bancaires.json", "r", encoding="utf-8") as f:
|
|
comptes_bancaires = json.load(f)
|
|
except Exception:
|
|
comptes_bancaires = {}
|
|
|
|
try:
|
|
with open("comptes_entreprises.json", "r", encoding="utf-8") as f:
|
|
comptes_entreprises = json.load(f)
|
|
except Exception:
|
|
await interaction.response.send_message("❌ Erreur lors de la lecture des fichiers JSON.", ephemeral=True)
|
|
return
|
|
|
|
# Récupérer le compte du Gouvernement
|
|
try:
|
|
gouv_compte = comptes_entreprises[GOUV_BANQUE][GOUV_COMPTE]
|
|
except KeyError:
|
|
await interaction.response.send_message("❌ Compte Gouvernement introuvable.", ephemeral=True)
|
|
return
|
|
|
|
if gouv_compte["solde"] < montant:
|
|
await interaction.response.send_message("❌ Le Gouvernement n'a pas assez de fonds.", ephemeral=True)
|
|
return
|
|
|
|
# Chercher le destinataire
|
|
destinataire_compte = None
|
|
destinataire_banque = None
|
|
destinataire_nom = None
|
|
destinataire_type = None
|
|
|
|
# Si banque précisée, chercher d'abord dans cette banque (entreprises puis particuliers)
|
|
if banque_nom:
|
|
# Entreprises
|
|
if banque_nom in comptes_entreprises:
|
|
for nom, data in comptes_entreprises[banque_nom].items():
|
|
if data.get("rib") == rib:
|
|
destinataire_compte = data
|
|
destinataire_banque = banque_nom
|
|
destinataire_nom = nom
|
|
destinataire_type = "entreprise"
|
|
break
|
|
# Particuliers
|
|
if not destinataire_compte and banque_nom in comptes_bancaires:
|
|
for uid, data in comptes_bancaires[banque_nom].items():
|
|
if data.get("rib") == rib:
|
|
destinataire_compte = data
|
|
destinataire_banque = banque_nom
|
|
destinataire_nom = uid
|
|
destinataire_type = "particulier"
|
|
break
|
|
# Si banque non précisée, chercher dans toutes les banques
|
|
else:
|
|
# Entreprises
|
|
for banque_courante, entreprises in comptes_entreprises.items():
|
|
for nom, data in entreprises.items():
|
|
if data.get("rib") == rib:
|
|
destinataire_compte = data
|
|
destinataire_banque = banque_courante
|
|
destinataire_nom = nom
|
|
destinataire_type = "entreprise"
|
|
break
|
|
if destinataire_compte:
|
|
break
|
|
# Particuliers
|
|
if not destinataire_compte:
|
|
for banque_courante, comptes in comptes_bancaires.items():
|
|
for uid, data in comptes.items():
|
|
if data.get("rib") == rib:
|
|
destinataire_compte = data
|
|
destinataire_banque = banque_courante
|
|
destinataire_nom = uid
|
|
destinataire_type = "particulier"
|
|
break
|
|
if destinataire_compte:
|
|
break
|
|
|
|
if not destinataire_compte:
|
|
await interaction.response.send_message("❌ Aucun compte trouvé avec ce RIB dans la banque spécifiée." if banque_nom else "❌ Aucun compte trouvé avec ce RIB.", ephemeral=True)
|
|
return
|
|
|
|
# Effectuer le virement
|
|
gouv_compte["solde"] -= montant
|
|
destinataire_compte["solde"] += montant
|
|
|
|
now = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
|
|
|
|
# Transaction côté Gouvernement (sortant)
|
|
gouv_compte.setdefault("transactions", []).append({
|
|
"date": now,
|
|
"type": "Virement",
|
|
"source": "Gouvernement",
|
|
"montant": -montant,
|
|
"emetteur": "Gouvernement",
|
|
"destinataire": destinataire_nom
|
|
})
|
|
|
|
# Transaction côté destinataire (entrant)
|
|
destinataire_compte.setdefault("transactions", []).append({
|
|
"date": now,
|
|
"type": "Virement",
|
|
"source": "Gouvernement",
|
|
"montant": montant,
|
|
"emetteur": "Gouvernement",
|
|
"destinataire": destinataire_nom
|
|
})
|
|
|
|
# Sauvegarde
|
|
comptes_entreprises[GOUV_BANQUE][GOUV_COMPTE] = gouv_compte
|
|
if destinataire_type == "entreprise":
|
|
comptes_entreprises[destinataire_banque][destinataire_nom] = destinataire_compte
|
|
with open("comptes_entreprises.json", "w", encoding="utf-8") as f:
|
|
json.dump(comptes_entreprises, f, indent=4, ensure_ascii=False)
|
|
else:
|
|
comptes_bancaires[destinataire_banque][destinataire_nom] = destinataire_compte
|
|
with open("comptes_entreprises.json", "w", encoding="utf-8") as f:
|
|
json.dump(comptes_entreprises, f, indent=4, ensure_ascii=False)
|
|
with open("comptes_bancaires.json", "w", encoding="utf-8") as f:
|
|
json.dump(comptes_bancaires, f, indent=4, ensure_ascii=False)
|
|
|
|
# Message de confirmation
|
|
embed = discord.Embed(
|
|
title="🏛️ Virement Gouvernemental effectué",
|
|
description=f"💼 Banque destinataire : **{destinataire_banque}**\n📌 Type : **{destinataire_type.capitalize()}**",
|
|
color=discord.Color.gold()
|
|
)
|
|
embed.add_field(name="RIB destinataire", value=rib, inline=False)
|
|
embed.add_field(name="Montant viré", value=f"{montant:.2f}€", inline=True)
|
|
embed.add_field(name="Effectué par", value=interaction.user.mention, inline=True)
|
|
embed.set_footer(text="Transaction enregistrée ✅")
|
|
|
|
await interaction.response.send_message(embed=embed, ephemeral=False)
|
|
|
|
async def setup(bot):
|
|
await bot.add_cog(GouvVirement(bot))
|