fix: correction du renommage des salons et ajout de feedback visuel dans les tickets

This commit is contained in:
Mathis 2026-03-28 22:12:36 +01:00
parent 4531b99be4
commit c8d5bf2c4b

View file

@ -495,49 +495,68 @@ 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")
# 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
try:
# Extraction propre de l'ID utilisateur depuis le topic
try:
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
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:
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:
user_id = message.channel.topic.split("Ticket de ")[1]
user = await message.guild.fetch_member(int(user_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
# 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))
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))
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)
# 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)
new_name = f"accepté-{user.display_name}"
new_name = new_name.replace(" ", "-").lower()[:100]
# Mise à jour du nom du salon
new_name = f"accepté-{user.display_name}".replace(" ", "-").lower()[:100]
await message.channel.edit(name=new_name)
# DM Professionnel
# 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 !",
@ -546,46 +565,40 @@ class Ticket(commands.Cog):
)
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)")
except: pass
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)
# 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)
new_name = f"oral-à-faire-{user.display_name}"
new_name = new_name.replace(" ", "-").lower()[:100]
# Mise à jour du nom du salon
new_name = f"oral-à-faire-{user.display_name}".replace(" ", "-").lower()[:100]
await message.channel.edit(name=new_name)
# DM Professionnel
# 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é examinée et validée par notre équipe !",
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()
)
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)")
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}")
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))