148 lines
No EOL
5 KiB
Python
148 lines
No EOL
5 KiB
Python
import discord
|
|
from discord import app_commands
|
|
from discord.ext import commands, tasks
|
|
import json
|
|
import datetime
|
|
|
|
ABONNEMENTS_FILE = "abonnements.json"
|
|
|
|
BANQUES_DISPONIBLES = [
|
|
"Victoria's Credit Bank",
|
|
"NGC Bank"
|
|
]
|
|
|
|
JOURS_SEMAINE = [
|
|
"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"
|
|
]
|
|
|
|
class Abonnement(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.abonnements = self.load_abonnements()
|
|
self.executer_abonnements.start()
|
|
|
|
def load_abonnements(self):
|
|
try:
|
|
with open(ABONNEMENTS_FILE, 'r', encoding='utf-8') as f:
|
|
return json.load(f)
|
|
except (FileNotFoundError, json.JSONDecodeError):
|
|
return []
|
|
|
|
def save_abonnements(self):
|
|
with open(ABONNEMENTS_FILE, 'w', encoding='utf-8') as f:
|
|
json.dump(self.abonnements, f, ensure_ascii=False, indent=4)
|
|
|
|
# 🎯 Auto-complétion pour les banques
|
|
async def autocomplete_banque(self, interaction: discord.Interaction, current: str):
|
|
return [
|
|
app_commands.Choice(name=b, value=b)
|
|
for b in BANQUES_DISPONIBLES if current.lower() in b.lower()
|
|
]
|
|
|
|
# 🎯 Auto-complétion pour les jours
|
|
async def autocomplete_jour(self, interaction: discord.Interaction, current: str):
|
|
return [
|
|
app_commands.Choice(name=day.capitalize(), value=day)
|
|
for day in JOURS_SEMAINE if current.lower() in day
|
|
]
|
|
|
|
@app_commands.command(name="abonnement", description="Crée un abonnement bancaire hebdomadaire.")
|
|
@app_commands.describe(
|
|
nom="Nom de l'abonnement",
|
|
rib_emetteur="RIB de l'expéditeur",
|
|
montant="Montant à envoyer",
|
|
rib_receveur="RIB du bénéficiaire",
|
|
banque="Nom de la banque",
|
|
jour="Jour de la semaine du virement"
|
|
)
|
|
@app_commands.autocomplete(banque=autocomplete_banque, jour=autocomplete_jour)
|
|
async def abonnement(
|
|
self,
|
|
interaction: discord.Interaction,
|
|
nom: str,
|
|
rib_emetteur: str,
|
|
montant: float,
|
|
rib_receveur: str,
|
|
banque: str,
|
|
jour: str
|
|
):
|
|
if jour.lower() not in JOURS_SEMAINE:
|
|
await interaction.response.send_message("❌ Jour invalide. Choisissez un jour valide de la semaine.", ephemeral=True)
|
|
return
|
|
|
|
abonnement = {
|
|
"nom": nom,
|
|
"rib_emetteur": rib_emetteur,
|
|
"rib_receveur": rib_receveur,
|
|
"montant": montant,
|
|
"banque": banque,
|
|
"jour": jour.lower()
|
|
}
|
|
|
|
self.abonnements.append(abonnement)
|
|
self.save_abonnements()
|
|
|
|
await interaction.response.send_message(f"✅ Abonnement **{nom}** enregistré. Virement automatique tous les **{jour}**.", ephemeral=True)
|
|
|
|
@tasks.loop(minutes=60)
|
|
async def executer_abonnements(self):
|
|
today = datetime.datetime.now().strftime("%A").lower()
|
|
try:
|
|
with open("comptes_bancaires.json", "r", encoding="utf-8") as f:
|
|
comptes = json.load(f)
|
|
except:
|
|
comptes = {}
|
|
|
|
updated = False
|
|
for abonnement in self.abonnements:
|
|
if abonnement["jour"] != today:
|
|
continue
|
|
|
|
banque = abonnement["banque"]
|
|
rib_emetteur = abonnement["rib_emetteur"]
|
|
rib_receveur = abonnement["rib_receveur"]
|
|
montant = abonnement["montant"]
|
|
|
|
destinataire_id = None
|
|
emetteur_id = None
|
|
|
|
for user_id, data in comptes.get(banque, {}).items():
|
|
if data.get("rib") == rib_emetteur:
|
|
emetteur_id = user_id
|
|
if data.get("rib") == rib_receveur:
|
|
destinataire_id = user_id
|
|
|
|
if not emetteur_id or not destinataire_id:
|
|
continue
|
|
|
|
if comptes[banque][emetteur_id]["solde"] < montant:
|
|
continue
|
|
|
|
comptes[banque][emetteur_id]["solde"] -= montant
|
|
comptes[banque][emetteur_id]["transactions"].append({
|
|
"date": datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S"),
|
|
"type": "Virement automatique (abonnement)",
|
|
"source": f"Vers RIB {rib_receveur}",
|
|
"montant": -montant
|
|
})
|
|
|
|
comptes[banque][destinataire_id]["solde"] += montant
|
|
comptes[banque][destinataire_id]["transactions"].append({
|
|
"date": datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S"),
|
|
"type": "Virement reçu (abonnement)",
|
|
"source": f"{rib_emetteur}",
|
|
"montant": montant
|
|
})
|
|
|
|
updated = True
|
|
|
|
if updated:
|
|
with open("comptes_bancaires.json", 'w', encoding='utf-8') as f:
|
|
json.dump(comptes, f, ensure_ascii=False, indent=4)
|
|
|
|
@executer_abonnements.before_loop
|
|
async def before_abonnement_loop(self):
|
|
await self.bot.wait_until_ready()
|
|
|
|
async def setup(bot):
|
|
await bot.add_cog(Abonnement(bot)) |