diff --git a/commandes/panel.py b/commandes/panel.py index a1b524e..c258c1e 100644 --- a/commandes/panel.py +++ b/commandes/panel.py @@ -37,14 +37,14 @@ def _uid(seed: str) -> str: return hashlib.md5(seed.encode()).hexdigest()[:12] -def _btn(label, style, cid, cb): - b = discord.ui.Button(label=label, style=style, custom_id=cid) +def _btn(label, style, cid, cb, emoji=None): + b = discord.ui.Button(label=label, style=style, custom_id=cid, emoji=emoji) b.callback = cb return b def _back_btn(cid, cb): - return _btn("◀ Retour", discord.ButtonStyle.secondary, cid, cb) + return _btn("Retour", discord.ButtonStyle.secondary, cid, cb, emoji="◀️") async def _get_user_bank(guild, user) -> dict: @@ -572,13 +572,13 @@ class CompteDetailView(discord.ui.LayoutView): items.extend([ discord.ui.Separator(), discord.ui.ActionRow( - _btn("Carte", discord.ButtonStyle.primary, f"cd_card_{safe}", self._card), - _btn("Releve", discord.ButtonStyle.primary, f"cd_stmt_{safe}", self._statement), - _btn("Virement", discord.ButtonStyle.primary, f"cd_vir_{safe}", self._vir), + _btn("Carte", discord.ButtonStyle.primary, f"cd_card_{safe}", self._card, emoji="💳"), + _btn("Relevé", discord.ButtonStyle.primary, f"cd_stmt_{safe}", self._statement, emoji="📄"), + _btn("Virement", discord.ButtonStyle.primary, f"cd_vir_{safe}", self._vir, emoji="💸"), ), discord.ui.ActionRow( - _btn("+ Depot", discord.ButtonStyle.success, f"cd_dep_{safe}", self._depot), - _btn("- Retrait", discord.ButtonStyle.danger, f"cd_ret_{safe}", self._retrait), + _btn("Dépôt", discord.ButtonStyle.success, f"cd_dep_{safe}", self._depot, emoji="💰"), + _btn("Retrait", discord.ButtonStyle.danger, f"cd_ret_{safe}", self._retrait, emoji="🏧"), ), discord.ui.Separator(), discord.ui.ActionRow(_back_btn("back_cd", self._back)), @@ -662,7 +662,7 @@ class ComptePanelView(discord.ui.LayoutView): solde_str = f"{c['solde']:,.2f} EUR".replace(",", " ") label = f"{c['bank_name']} — {c['account_type'].title()} — {solde_str}" safe = _uid(c["rib"]) - btn = _btn(label[:80], discord.ButtonStyle.primary, f"cp_acc_{safe}", self._make_acc_cb(c)) + btn = _btn(label[:80], discord.ButtonStyle.primary, f"cp_acc_{safe}", self._make_acc_cb(c), emoji="💰") items.append(discord.ui.ActionRow(btn)) items.extend([ @@ -706,16 +706,16 @@ class BanquierPanelView(discord.ui.LayoutView): ), discord.ui.Separator(), discord.ui.ActionRow( - _btn("Ouvrir Compte", discord.ButtonStyle.success, _uid("bq_open_" + str(author.id)), self._ouvrir), - _btn("Consulter Clients", discord.ButtonStyle.secondary, _uid("bq_clients_" + str(author.id)), self._clients), + _btn("Ouvrir Compte", discord.ButtonStyle.success, _uid("bq_open_" + str(author.id)), self._ouvrir, emoji="➕"), + _btn("Consulter Clients", discord.ButtonStyle.secondary, _uid("bq_clients_" + str(author.id)), self._clients, emoji="👥"), ), discord.ui.ActionRow( - _btn("Info Banque", discord.ButtonStyle.secondary, _uid("bq_info_" + str(author.id)), self._info), - _btn("Transactions", discord.ButtonStyle.secondary, _uid("bq_tx_" + str(author.id)), self._tx), + _btn("Info Banque", discord.ButtonStyle.secondary, _uid("bq_info_" + str(author.id)), self._info, emoji="ℹ️"), + _btn("Transactions", discord.ButtonStyle.secondary, _uid("bq_tx_" + str(author.id)), self._tx, emoji="📊"), ), discord.ui.ActionRow( - _btn("Set Plafond", discord.ButtonStyle.primary, _uid("bq_plaf_" + str(author.id)), self._plafond), - _btn("Set Reserve", discord.ButtonStyle.primary, _uid("bq_res_" + str(author.id)), self._reserve), + _btn("Set Plafond", discord.ButtonStyle.primary, _uid("bq_plaf_" + str(author.id)), self._plafond, emoji="📉"), + _btn("Set Reserve", discord.ButtonStyle.primary, _uid("bq_res_" + str(author.id)), self._reserve, emoji="🏦"), ), discord.ui.Separator(), discord.ui.ActionRow(_back_btn("back_bp", self._back)), @@ -838,16 +838,16 @@ class GouvernementPanelView(discord.ui.LayoutView): discord.ui.TextDisplay("Institutions, fisc, banques."), discord.ui.Separator(), discord.ui.ActionRow( - _btn("Creer Banque", discord.ButtonStyle.success, "gp_cbanque", self._cbanque), - _btn("Creer Institution", discord.ButtonStyle.success, "gp_cinst", self._cinst), + _btn("Créer Banque", discord.ButtonStyle.success, "gp_cbanque", self._cbanque, emoji="🏦"), + _btn("Créer Institution", discord.ButtonStyle.success, "gp_cinst", self._cinst, emoji="🏛️"), ), discord.ui.ActionRow( - _btn("Config Fisc", discord.ButtonStyle.primary, "gp_fisc", self._fisc), - _btn("Virement Fisc", discord.ButtonStyle.primary, "gp_vfisc", self._vfisc), + _btn("Config Fisc", discord.ButtonStyle.primary, "gp_fisc", self._fisc, emoji="📋"), + _btn("Virement Fisc", discord.ButtonStyle.primary, "gp_vfisc", self._vfisc, emoji="💸"), ), discord.ui.ActionRow( - _btn("Lister Banques", discord.ButtonStyle.secondary, "gp_lbanques", self._lbanques), - _btn("Lister Institutions", discord.ButtonStyle.secondary, "gp_linst", self._linst), + _btn("Lister Banques", discord.ButtonStyle.secondary, "gp_lbanques", self._lbanques, emoji="📃"), + _btn("Lister Institutions", discord.ButtonStyle.secondary, "gp_linst", self._linst, emoji="📃"), ), discord.ui.Separator(), discord.ui.ActionRow(_back_btn("back_gp", self._back)), @@ -943,20 +943,20 @@ class IdentitePanelView(discord.ui.LayoutView): discord.ui.TextDisplay("Cartes d'identite, permis, visites medicales."), discord.ui.Separator(), discord.ui.ActionRow( - _btn("Ma Carte", discord.ButtonStyle.primary, "ip_carte", self._carte), + _btn("Ma Carte", discord.ButtonStyle.primary, "ip_carte", self._carte, emoji="🪪"), ), ] if has_role(author, "gouvernement"): items.append(discord.ui.ActionRow( - _btn("Creer Carte", discord.ButtonStyle.success, "ip_ccar", self._ccar), + _btn("Créer Carte", discord.ButtonStyle.success, "ip_ccar", self._ccar, emoji="🪪"), )) action_items = [] if has_role(author, "auto_ecole"): - action_items.append(_btn("Permis", discord.ButtonStyle.primary, "ip_permis", self._permis)) + action_items.append(_btn("Permis", discord.ButtonStyle.primary, "ip_permis", self._permis, emoji="🚗")) if has_role(author, "ems"): - action_items.append(_btn("Visite Medicale", discord.ButtonStyle.primary, "ip_vismed", self._vismed)) + action_items.append(_btn("Visite Médicale", discord.ButtonStyle.primary, "ip_vismed", self._vismed, emoji="🏥")) if action_items: items.append(discord.ui.ActionRow(*action_items)) @@ -1014,9 +1014,9 @@ class TicketsPanelView(discord.ui.LayoutView): discord.ui.TextDisplay("Gestion des tickets et messages prives."), discord.ui.Separator(), discord.ui.ActionRow( - _btn("Embed Ticket", discord.ButtonStyle.success, "tp_ticket", self._ticket), - _btn("Envoyer MP", discord.ButtonStyle.primary, "tp_mp", self._mp), - _btn("MP a Tous", discord.ButtonStyle.danger, "tp_mptous", self._mptous), + _btn("Embed Ticket", discord.ButtonStyle.success, "tp_ticket", self._ticket, emoji="📩"), + _btn("Envoyer MP", discord.ButtonStyle.primary, "tp_mp", self._mp, emoji="✉️"), + _btn("MP à Tous", discord.ButtonStyle.danger, "tp_mptous", self._mptous, emoji="📢"), ), discord.ui.Separator(), discord.ui.ActionRow(_back_btn("back_tp", self._back)), @@ -1062,8 +1062,8 @@ class SessionsPanelView(discord.ui.LayoutView): discord.ui.TextDisplay("Annonces de sessions et gestion des presences."), discord.ui.Separator(), discord.ui.ActionRow( - _btn("Annoncer Session", discord.ButtonStyle.success, "sp_annonce", self._annonce), - _btn("Liste Presences", discord.ButtonStyle.primary, "sp_liste", self._liste), + _btn("Annoncer Session", discord.ButtonStyle.success, "sp_annonce", self._annonce, emoji="📅"), + _btn("Liste Présences", discord.ButtonStyle.primary, "sp_liste", self._liste, emoji="✅"), ), discord.ui.Separator(), discord.ui.ActionRow(_back_btn("back_sp", self._back)), @@ -1096,13 +1096,13 @@ class ConfigPanelView(discord.ui.LayoutView): discord.ui.TextDisplay("Configurer les roles, salons et categories."), discord.ui.Separator(), discord.ui.ActionRow( - _btn("Definir Role", discord.ButtonStyle.primary, "cfg_role", self._crole), - _btn("Definir Salon", discord.ButtonStyle.primary, "cfg_chan", self._cchan), - _btn("Definir Categorie", discord.ButtonStyle.primary, "cfg_cat", self._ccat), + _btn("Définir Rôle", discord.ButtonStyle.primary, "cfg_role", self._crole, emoji="🎭"), + _btn("Définir Salon", discord.ButtonStyle.primary, "cfg_chan", self._cchan, emoji="💬"), + _btn("Définir Catégorie", discord.ButtonStyle.primary, "cfg_cat", self._ccat, emoji="📂"), ), discord.ui.ActionRow( - _btn("Voir Config", discord.ButtonStyle.secondary, "cfg_voir", self._cvoir), - _btn("Reset Config", discord.ButtonStyle.danger, "cfg_reset", self._creset), + _btn("Voir Config", discord.ButtonStyle.secondary, "cfg_voir", self._cvoir, emoji="👁️"), + _btn("Reset Config", discord.ButtonStyle.danger, "cfg_reset", self._creset, emoji="🗑️"), ), discord.ui.Separator(), discord.ui.ActionRow(_back_btn("back_cfg", self._back)), @@ -1180,13 +1180,13 @@ class DiversPanelView(discord.ui.LayoutView): discord.ui.TextDisplay("Lancer de de et autres outils."), discord.ui.Separator(), discord.ui.ActionRow( - _btn("Lancer un De", discord.ButtonStyle.primary, "dp_roll", self._roll), + _btn("Lancer un Dé", discord.ButtonStyle.primary, "dp_roll", self._roll, emoji="🎲"), ), ] if author.guild_permissions.administrator: items.append(discord.ui.ActionRow( - _btn("Stats Bot", discord.ButtonStyle.secondary, "dp_stats", self._stats), + _btn("Stats Bot", discord.ButtonStyle.secondary, "dp_stats", self._stats, emoji="📊"), )) items.extend([ @@ -1281,7 +1281,7 @@ class MainPanelView(discord.ui.LayoutView): self.add_item(discord.ui.Container( discord.ui.TextDisplay(f"## {guild_name} — Panel de Commandes"), discord.ui.TextDisplay(f"**Vos roles :** {role_text}"), - discord.ui.TextSelect("Selectionnez une categorie ci-dessous."), + discord.ui.TextDisplay("Selectionnez une catégorie ci-dessous."), discord.ui.Separator(), discord.ui.ActionRow(CategorySelect(author, bot)), accent_colour=discord.Colour(C_MAIN), diff --git a/utils/db.py b/utils/db.py index 1f0690f..5dbcbd5 100644 --- a/utils/db.py +++ b/utils/db.py @@ -72,6 +72,11 @@ CREATE INDEX IF NOT EXISTS idx_institutions_guild ON institutions(guild_id); """ +MIGRATIONS = [ + "ALTER TABLE banks ADD COLUMN client_negative_floor REAL DEFAULT 0.0", +] + + async def get_db() -> aiosqlite.Connection: os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) db = await aiosqlite.connect(DB_PATH) @@ -79,5 +84,10 @@ async def get_db() -> aiosqlite.Connection: await db.execute("PRAGMA journal_mode=WAL") await db.execute("PRAGMA foreign_keys=ON") await db.executescript(SCHEMA) + for migration in MIGRATIONS: + try: + await db.execute(migration) + except Exception: + pass await db.commit() return db