From 6cd2dc5258121cf5af74da1cd5cdc4db19bd02a7 Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Wed, 4 Feb 2026 20:18:45 +0100 Subject: [PATCH] test --- commands/utility/panel.js | 231 ++++++++++++++++++++++---------------- 1 file changed, 135 insertions(+), 96 deletions(-) diff --git a/commands/utility/panel.js b/commands/utility/panel.js index c32aa8d..16c342a 100644 --- a/commands/utility/panel.js +++ b/commands/utility/panel.js @@ -21,12 +21,16 @@ module.exports = { } }; -async function showPanel(interaction) { +function hasPanelRole(member) { + return Boolean(member?.roles?.cache?.has('1444684935632912394')); +} + +async function buildPanelPayload() { const config = await getAllConfig(); const monitoringStatus = getMonitoringStatus(); const autoRebootEnabled = config.auto_reboot_enabled === 'true'; - const ramThreshold = parseInt(config.ram_threshold_gb); + const ramThreshold = Number.parseInt(config.ram_threshold_gb, 10); const consoleMonitorEnabled = config.console_monitor_enabled === 'true'; const embed = new EmbedBuilder() @@ -127,98 +131,14 @@ async function showPanel(interaction) { .setEmoji('📊') ); - if (interaction.replied || interaction.deferred) { - await interaction.editReply({ embeds: [embed], components: [row1, row2, row3] }); - } else { - await interaction.reply({ embeds: [embed], components: [row1, row2, row3] }); - } - - // CrĂ©er un collector pour les interactions - const collector = interaction.channel.createMessageComponentCollector({ - time: 300000 // 5 minutes - }); - - collector.on('collect', async i => { - if (!i.member.roles.cache.has('1444684935632912394')) { - await i.reply({ - content: '❌ Vous n\'avez pas la permission d\'utiliser ce panneau.', - flags: 64 - }); - return; - } - - try { - if (i.customId === 'toggle_auto_reboot') { - const currentState = (await getConfig('auto_reboot_enabled')) === 'true'; - const newState = !currentState; - await updateConfig('auto_reboot_enabled', newState.toString()); - - await i.deferUpdate(); - await i.editReply({ - content: `✅ RedĂ©marrage automatique ${newState ? 'activĂ©' : 'dĂ©sactivĂ©'}`, - }); - - // Refresh panel - setTimeout(async () => { - await showPanel(i); - }, 1000); - } - else if (i.customId === 'toggle_console_monitor') { - const currentState = (await getConfig('console_monitor_enabled')) === 'true'; - const newState = !currentState; - await updateConfig('console_monitor_enabled', newState.toString()); - - await i.deferUpdate(); - await i.editReply({ - content: `✅ Surveillance console ${newState ? 'activĂ©e' : 'dĂ©sactivĂ©e'}`, - }); - - // Refresh panel - setTimeout(async () => { - await showPanel(i); - }, 1000); - } - else if (i.customId === 'change_ram_threshold') { - const newThreshold = i.values[0]; - await updateConfig('ram_threshold_gb', newThreshold); - - await i.deferUpdate(); - await i.editReply({ - content: `✅ Seuil RAM changĂ© Ă  ${newThreshold} Go`, - }); - - // Refresh panel - setTimeout(async () => { - await showPanel(i); - }, 1000); - } - else if (i.customId === 'refresh_panel') { - await i.deferUpdate(); - await showPanel(i); - } - else if (i.customId === 'view_stats') { - await showDetailedStats(i); - } - } catch (error) { - console.error('Erreur lors de l\'interaction avec le panel:', error); - if (i.deferred || i.replied) { - await i.editReply({ content: '❌ Une erreur est survenue', components: [] }); - } else { - await i.reply({ content: '❌ Une erreur est survenue', flags: 64 }); - } - } - }); - - collector.on('end', () => { - console.log('⏰ [Panel] Collector expirĂ©'); - }); + return { embeds: [embed], components: [row1, row2, row3], content: null }; } -async function showDetailedStats(interaction) { +async function buildStatsPayload() { const config = await getAllConfig(); const monitoringStatus = getMonitoringStatus(); const { checkRAMUsage } = require('../../ramMonitor'); - + const ramData = await checkRAMUsage(); const embed = new EmbedBuilder() @@ -254,17 +174,136 @@ async function showDetailedStats(interaction) { .setEmoji('◀') ); - await interaction.update({ embeds: [embed], components: [row] }); + return { embeds: [embed], components: [row], content: null }; +} - // Attendre le clic sur le bouton retour - const collector = interaction.channel.createMessageComponentCollector({ - time: 60000 +function isIgnorableDiscordRestError(error) { + const code = error?.code ?? error?.rawError?.code; + return code === 10062 || code === 40060; +} + +async function safeDeferUpdate(interaction) { + if (interaction?.deferred || interaction?.replied) return; + try { + await interaction.deferUpdate(); + } catch (e) { + if (!isIgnorableDiscordRestError(e)) throw e; + } +} + +async function renderPanel(interaction) { + const payload = await buildPanelPayload(); + + // Premier affichage via la commande slash + if (interaction.isChatInputCommand?.()) { + if (interaction.replied || interaction.deferred) { + await interaction.editReply(payload); + return interaction.fetchReply(); + } + return interaction.reply({ ...payload, fetchReply: true }); + } + + // Refresh via composants: on Ă©dite directement le message + await safeDeferUpdate(interaction); + return interaction.message.edit(payload); +} + +async function renderDetailedStats(interaction) { + // IMPORTANT: defer immĂ©diatement pour Ă©viter 10062 si les appels rĂ©seau sont lents + await safeDeferUpdate(interaction); + + const payload = await buildStatsPayload(); + + if (interaction.isChatInputCommand?.()) { + if (interaction.replied || interaction.deferred) { + await interaction.editReply(payload); + return interaction.fetchReply(); + } + return interaction.reply({ ...payload, fetchReply: true }); + } + + return interaction.message.edit(payload); +} + +// Point d'entrĂ©e: affiche le panel et attache un collector AU message +async function showPanel(interaction) { + const message = await renderPanel(interaction); + + const collector = message.createMessageComponentCollector({ + time: 300000 // 5 minutes }); collector.on('collect', async i => { - if (i.customId === 'back_to_panel') { - await i.deferUpdate(); - await showPanel(i); + if (!hasPanelRole(i.member)) { + try { + await i.reply({ + content: '❌ Vous n\'avez pas la permission d\'utiliser ce panneau.', + flags: 64 + }); + } catch { + // ignore + } + return; + } + + try { + switch (i.customId) { + case 'toggle_auto_reboot': { + await safeDeferUpdate(i); + const currentState = (await getConfig('auto_reboot_enabled')) === 'true'; + await updateConfig('auto_reboot_enabled', (!currentState).toString()); + await renderPanel(i); + break; + } + case 'toggle_console_monitor': { + await safeDeferUpdate(i); + const currentState = (await getConfig('console_monitor_enabled')) === 'true'; + await updateConfig('console_monitor_enabled', (!currentState).toString()); + await renderPanel(i); + break; + } + case 'change_ram_threshold': { + await safeDeferUpdate(i); + const newThreshold = i.values?.[0]; + if (newThreshold) { + await updateConfig('ram_threshold_gb', newThreshold); + } + await renderPanel(i); + break; + } + case 'refresh_panel': { + await safeDeferUpdate(i); + await renderPanel(i); + break; + } + case 'view_stats': { + await renderDetailedStats(i); + break; + } + case 'back_to_panel': { + await safeDeferUpdate(i); + await renderPanel(i); + break; + } + default: { + await safeDeferUpdate(i); + break; + } + } + } catch (error) { + console.error('Erreur lors de l\'interaction avec le panel:', error); + if (isIgnorableDiscordRestError(error)) return; + + // Ne pas crash le process si une rĂ©ponse Ă©choue + try { + await i.followUp?.({ content: '❌ Une erreur est survenue', flags: 64 }); + } catch { + // ignore + } } }); + + collector.on('end', () => { + console.log('⏰ [Panel] Collector expirĂ©'); + }); }