From fa04ce36c5ee5139b02b80656615db74f1da0388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C9=A7=CF=83=E2=84=93=CF=83?= Date: Wed, 10 Dec 2025 19:44:17 +0100 Subject: [PATCH] feat: add delete button to PDF viewer for session cleanup --- src/commands/handlers/PdfHandler.js | 72 +++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/src/commands/handlers/PdfHandler.js b/src/commands/handlers/PdfHandler.js index 8d64ff8..3cc2b46 100644 --- a/src/commands/handlers/PdfHandler.js +++ b/src/commands/handlers/PdfHandler.js @@ -97,11 +97,15 @@ class PdfHandler { * Gestion des boutons */ async handleButton(interaction) { - const parts = (interaction.customId || '').split(':'); // pdf-nav:{userId}:{page}:{total} - if (parts.length !== 4) return; - const [, ownerId, pageStr, totalStr] = parts; - const requestedPage = parseInt(pageStr, 10); - const totalPages = parseInt(totalStr, 10); + const customId = interaction.customId || ''; + + // Navigation + if (customId.startsWith('pdf-nav:')) { + const parts = customId.split(':'); // pdf-nav:{userId}:{page}:{total} + if (parts.length !== 4) return; + const [, ownerId, pageStr, totalStr] = parts; + const requestedPage = parseInt(pageStr, 10); + const totalPages = parseInt(totalStr, 10); const session = this.sessions.get(interaction.message.id); if (!session) { @@ -146,6 +150,40 @@ class PdfHandler { logger.error('Erreur lors de la navigation PDF:', error); await interaction.editReply({ content: '❌ Erreur lors du rendu de la page.' }); } + return; + } + + // Suppression + if (customId.startsWith('pdf-del:')) { + const parts = customId.split(':'); // pdf-del:{ownerId} + if (parts.length !== 2) return; + const [, ownerId] = parts; + + const session = this.sessions.get(interaction.message.id); + if (!session) { + await interaction.reply({ + content: '❌ Session expirée ou introuvable.', + flags: require('discord.js').MessageFlags.Ephemeral + }); + return; + } + + if (interaction.user.id !== ownerId) { + await interaction.reply({ + content: '❌ Seul l’auteur de la commande peut supprimer.', + flags: require('discord.js').MessageFlags.Ephemeral + }); + return; + } + + await this.deleteSession(interaction.message.id, session); + await interaction.update({ + content: '🗑️ Session PDF supprimée.', + embeds: [], + components: [], + files: [] + }); + } } /** @@ -236,6 +274,10 @@ class PdfHandler { .setLabel('Suivant ▶️') .setStyle(ButtonStyle.Primary) .setDisabled(nextDisabled), + new ButtonBuilder() + .setCustomId(`pdf-del:${ownerId}`) + .setLabel('🗑️ Supprimer') + .setStyle(ButtonStyle.Danger), new ButtonBuilder() .setLabel('Télécharger PDF') .setStyle(ButtonStyle.Link) @@ -305,6 +347,26 @@ class PdfHandler { logger.error('Erreur lors de la sauvegarde des sessions PDF:', e); } } + + /** + * Supprime une session et les fichiers associés + */ + async deleteSession(messageId, session) { + try { + if (session.imagePaths) { + session.imagePaths.forEach(p => { + if (p && fs.existsSync(p)) fs.unlinkSync(p); + }); + } + if (session.pdfPath && fs.existsSync(session.pdfPath)) { + fs.unlinkSync(session.pdfPath); + } + this.sessions.delete(messageId); + this.saveSessions(); + } catch (e) { + logger.error('Erreur lors de la suppression de la session PDF:', e); + } + } } module.exports = PdfHandler;