2026-08-16 19:37:15 +02:00
import discord
from discord import app_commands
from discord . ext import commands
import json
from datetime import datetime
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
from utils . guild_config import has_role
2026-08-16 19:37:15 +02:00
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
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
if not has_role ( interaction . user , " gouvernement " ) :
2026-08-16 19:37:15 +02:00
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 ) )