fix(modmail): button custom_id mismatch causing interaction timeout
All checks were successful
deploy / deploy (push) Successful in 21s

- PersistentQuickOpen expects custom_id='modmail_quick_open'
- Panel button had custom_id='modmail_quick_open:{key}' (mismatch)
- Discord couldn't find the handler -> 3s timeout
- Added error logging on CategorySelect callback
This commit is contained in:
Mathis 2026-09-20 19:14:23 +02:00
parent 4d2be145aa
commit 9312be91fd

View file

@ -1,4 +1,5 @@
import contextlib import contextlib
import logging
import discord import discord
from discord import app_commands from discord import app_commands
@ -27,26 +28,31 @@ class CategorySelect(discord.ui.Select):
) )
async def callback(self, interaction: discord.Interaction): async def callback(self, interaction: discord.Interaction):
category_key = self.values[0] try:
categories = cfg.get_categories() category_key = self.values[0]
cat = categories.get(category_key, {}) categories = cfg.get_categories()
data = cfg.get_config() cat = categories.get(category_key, {})
guild = interaction.client.get_guild(data.get("guild_id")) data = cfg.get_config()
if not guild: guild = interaction.client.get_guild(data.get("guild_id"))
await interaction.response.send_message("Erreur: serveur introuvable.", ephemeral=True) if not guild:
return await interaction.response.send_message("Erreur: serveur introuvable.", ephemeral=True)
return
user = interaction.user user = interaction.user
existing = cfg.get_ticket_by_user(user.id) existing = cfg.get_ticket_by_user(user.id)
if existing: if existing:
ch = guild.get_channel(existing["channel_id"]) ch = guild.get_channel(existing["channel_id"])
await interaction.response.send_message( await interaction.response.send_message(
f"Tu as deja un ticket ouvert: {ch.mention if ch else 'inconnu'}", f"Tu as deja un ticket ouvert: {ch.mention if ch else 'inconnu'}",
ephemeral=True, ephemeral=True,
) )
return return
await interaction.response.send_modal(TicketModal(category_key, cat.get("name", category_key))) await interaction.response.send_modal(TicketModal(category_key, cat.get("name", category_key)))
except Exception as e:
logging.getLogger("vision").error(f"CategorySelect callback error: {e}", exc_info=True)
if not interaction.response.is_done():
await interaction.response.send_message(f"Erreur interne: `{e}`", ephemeral=True)
class TicketModal(discord.ui.Modal, title="Nouveau Ticket"): class TicketModal(discord.ui.Modal, title="Nouveau Ticket"):
@ -444,7 +450,7 @@ class ModMail(commands.Cog):
open_button = discord.ui.Button( open_button = discord.ui.Button(
label=f"Ouvrir — {cat['name']}", label=f"Ouvrir — {cat['name']}",
style=discord.ButtonStyle.primary, style=discord.ButtonStyle.primary,
custom_id=f"modmail_quick_open:{key}", custom_id="modmail_quick_open",
) )
container.add_item(discord.ui.ActionRow(open_button)) container.add_item(discord.ui.ActionRow(open_button))