From c8d5bf2c4b02ceae6fde0a41f94e6be4299ac0f7 Mon Sep 17 00:00:00 2001 From: Mathis Date: Sat, 28 Mar 2026 22:12:36 +0100 Subject: [PATCH] fix: correction du renommage des salons et ajout de feedback visuel dans les tickets --- commandes/ticket_whitelist.py | 163 ++++++++++++++++++---------------- 1 file changed, 88 insertions(+), 75 deletions(-) diff --git a/commandes/ticket_whitelist.py b/commandes/ticket_whitelist.py index 29b01a0..55f8d9b 100644 --- a/commandes/ticket_whitelist.py +++ b/commandes/ticket_whitelist.py @@ -495,97 +495,110 @@ class Ticket(commands.Cog): @commands.Cog.listener() async def on_message(self, message): - """Surveille les messages des staffs dans les tickets""" + """Surveille les messages des staffs dans les tickets pour validation automatique""" if message.guild is None or message.author.bot: return + + # Détection du format du topic du ticket if not message.channel.topic or not message.channel.topic.startswith("Ticket de"): return + # On ne traite que si le message contient "validé" + if "validé" not in message.content.lower(): + return + settings = load_settings(message.guild.id) staff_role_id = settings.get("staff_role_id") - attente_oral_role_id = settings.get("attente_oral_role_id") - candidature_a_faire_role_id = settings.get("candidature_a_faire_role_id") - citoyen_role_id = settings.get("citoyen_role_id") - if not staff_role_id: + # Vérification si l'auteur est staff ou admin + is_staff = False + if staff_role_id: + is_staff = any(r.id == int(staff_role_id) for r in message.author.roles) + + if not is_staff and not message.author.guild_permissions.administrator: return - staff_role = discord.utils.get(message.guild.roles, id=int(staff_role_id)) - - if staff_role in message.author.roles and "validé" in message.content.lower(): + try: + # Extraction propre de l'ID utilisateur depuis le topic try: - user_id = message.channel.topic.split("Ticket de ")[1] - user = await message.guild.fetch_member(int(user_id)) + user_id_str = message.channel.topic.replace("Ticket de ", "").strip() + user = await message.guild.fetch_member(int(user_id_str)) + except (ValueError, IndexError, discord.NotFound, discord.HTTPException): + kuby_logger.warning(f"Impossible de trouver l'utilisateur du ticket via le topic: {message.channel.topic}") + return - if not attente_oral_role_id or not candidature_a_faire_role_id or not citoyen_role_id: - await message.channel.send("❌ Erreur de configuration : Impossible d'attribuer les rôles, ils ne sont pas tous définis dans `/ticket_whitelist_config`.", delete_after=10) - return + attente_oral_role_id = settings.get("attente_oral_role_id") + candidature_a_faire_role_id = settings.get("candidature_a_faire_role_id") + citoyen_role_id = settings.get("citoyen_role_id") - # Vérifier si le rôle "attente oral" est déjà attribué - attente_oral_role = discord.utils.get(message.guild.roles, id=int(attente_oral_role_id)) - candidature_a_faire_role = discord.utils.get(message.guild.roles, id=int(candidature_a_faire_role_id)) - citoyen_role = discord.utils.get(message.guild.roles, id=int(citoyen_role_id)) + if not attente_oral_role_id or not candidature_a_faire_role_id or not citoyen_role_id: + await message.channel.send("❌ Erreur de configuration : Impossible d'attribuer les rôles, ils ne sont pas tous définis dans `/ticket_whitelist_config`.", delete_after=10) + return - if attente_oral_role in user.roles: - # Deuxième "validé" détecté -> Citoyen / Accepté - if attente_oral_role: - await user.remove_roles(attente_oral_role) - if citoyen_role: - await user.add_roles(citoyen_role) - - new_name = f"accepté-{user.display_name}" - new_name = new_name.replace(" ", "-").lower()[:100] - await message.channel.edit(name=new_name) - - # DM Professionnel - try: - embed_dm = discord.Embed( - title="🎉 Félicitations - Citoyenneté Validée !", - description=f"Nous avons le plaisir de t'annoncer que ton passage sur **{message.guild.name}** a été validé avec succès !", - color=discord.Color.green() - ) - embed_dm.add_field(name="🏙️ Nouveau Statut", value="Citoyen", inline=True) - embed_dm.add_field(name="📍 Serveur", value=message.guild.name, inline=True) - embed_dm.add_field(name="📋 Prochaine étape", value="Tu peux désormais te connecter au serveur et commencer ton aventure RP. N'oublie pas de consulter les salons d'informations !", inline=False) - embed_dm.add_field(name="🔗 Lien vers ton ticket", value=f"[Clique ici pour voir ton ticket]({message.channel.jump_url})", inline=False) - embed_dm.set_footer(text=f"L'équipe {message.guild.name}") - embed_dm.set_thumbnail(url=message.guild.icon.url if message.guild.icon else None) - - await user.send(embed=embed_dm) - except (discord.Forbidden, discord.HTTPException): - kuby_logger.warning(f"Impossible d'envoyer le DM de validation finale à {user} (DMs fermés)") + attente_oral_role = message.guild.get_role(int(attente_oral_role_id)) + candidature_a_faire_role = message.guild.get_role(int(candidature_a_faire_role_id)) + citoyen_role = message.guild.get_role(int(citoyen_role_id)) - else: - # Premier "validé" détecté -> Oral à faire - if candidature_a_faire_role: - await user.remove_roles(candidature_a_faire_role) - if attente_oral_role: - await user.add_roles(attente_oral_role) - - new_name = f"oral-à-faire-{user.display_name}" - new_name = new_name.replace(" ", "-").lower()[:100] - await message.channel.edit(name=new_name) - - # DM Professionnel - try: - embed_dm = discord.Embed( - title="📝 Validation Étape Écrite", - description=f"Ta candidature écrite sur **{message.guild.name}** a été examinée et validée par notre équipe !", - color=discord.Color.orange() - ) - embed_dm.add_field(name="🎤 Statut Actuel", value="Attente Oral", inline=True) - embed_dm.add_field(name="🛠️ Action Requise", value="Merci de te rendre dans le salon vocal 'Attente Oral' dès que tu es disponible pour passer ton entretien.", inline=False) - embed_dm.add_field(name="🔗 Lien vers ton ticket", value=f"[Clique ici pour voir ton ticket]({message.channel.jump_url})", inline=False) - embed_dm.set_footer(text=f"L'équipe {message.guild.name}") - embed_dm.set_thumbnail(url=message.guild.icon.url if message.guild.icon else None) - - await user.send(embed=embed_dm) - except (discord.Forbidden, discord.HTTPException): - kuby_logger.warning(f"Impossible d'envoyer le DM de validation écrite à {user} (DMs fermés)") + if attente_oral_role in user.roles: + # DEUXIÈME VALIDATION -> ACCEPTÉ / CITOYEN + if attente_oral_role: await user.remove_roles(attente_oral_role) + if citoyen_role: await user.add_roles(citoyen_role) + + # Mise à jour du nom du salon + new_name = f"accepté-{user.display_name}".replace(" ", "-").lower()[:100] + await message.channel.edit(name=new_name) + + # Confirmation dans le salon (Feedback visuel) + embed_val = discord.Embed( + title="🎉 Whitelist Validée !", + description=f"Félicitations {user.mention}, ton entretien oral a été validé par {message.author.mention} !\nTu es désormais **Citoyen**.", + color=discord.Color.green() + ) + await message.channel.send(embed=embed_val) + + # DM au joueur + try: + embed_dm = discord.Embed( + title="🎉 Félicitations - Citoyenneté Validée !", + description=f"Nous avons le plaisir de t'annoncer que ton passage sur **{message.guild.name}** a été validé avec succès !", + color=discord.Color.green() + ) + embed_dm.add_field(name="🏙️ Nouveau Statut", value="Citoyen", inline=True) + embed_dm.add_field(name="📍 Serveur", value=message.guild.name, inline=True) + embed_dm.set_footer(text=f"L'équipe {message.guild.name}") + await user.send(embed=embed_dm) + except: pass - except Exception as e: - kuby_logger.error(f"Erreur lors du traitement du ticket whitelist : {e}", exc_info=True) - await message.channel.send(f"❌ Une erreur est survenue lors de l'attribution des rôles : {e}") + else: + # PREMIÈRE VALIDATION -> ORAL À FAIRE + if candidature_a_faire_role: await user.remove_roles(candidature_a_faire_role) + if attente_oral_role: await user.add_roles(attente_oral_role) + + # Mise à jour du nom du salon + new_name = f"oral-à-faire-{user.display_name}".replace(" ", "-").lower()[:100] + await message.channel.edit(name=new_name) + + # Confirmation dans le salon + embed_val = discord.Embed( + title="📝 Étape Écrite Validée !", + description=f"Ta candidature écrite a été validée par {message.author.mention}.\nTu passes désormais en **Attente Oral**.", + color=discord.Color.orange() + ) + await message.channel.send(embed=embed_val) + + # DM au joueur + try: + embed_dm = discord.Embed( + title="📝 Validation Étape Écrite", + description=f"Ta candidature écrite sur **{message.guild.name}** a été validée ! Merci de te rendre en vocal 'Attente Oral'.", + color=discord.Color.orange() + ) + await user.send(embed=embed_dm) + except: pass + + except Exception as e: + kuby_logger.error(f"Erreur lors de la validation du ticket: {e}", exc_info=True) + await message.channel.send(f"❌ Une erreur système est survenue : {e}") async def setup(bot): await bot.add_cog(Ticket(bot))