diff --git a/commands/trad/trad.js b/commands/trad/trad.js index b529fb3..7e71cea 100644 --- a/commands/trad/trad.js +++ b/commands/trad/trad.js @@ -5,85 +5,94 @@ module.exports = { .setName('trad') .setDescription('Traduit le message indiqué en français') .addStringOption(option => - option.setName('lien') - .setDescription('Lien du message à traduire') + option.setName('liens') + .setDescription('Lien(s) du/des message(s) à traduire (séparés par des espaces)') .setRequired(false) ), async execute(interaction, translator) { - let messageToTranslate = null; - const messageLien = interaction.options.getString('lien'); + let messagesToTranslate = []; + const messageLiens = interaction.options.getString('liens'); - if (messageLien) { - // Extraire les IDs du lien Discord - const linkPattern = /https:\/\/discord\.com\/channels\/(\d+)\/(\d+)\/(\d+)/; - const match = messageLien.match(linkPattern); + if (messageLiens) { + // Extraire les IDs des liens Discord multiples + const linkPattern = /https:\/\/discord\.com\/channels\/(\d+)\/(\d+)\/(\d+)/g; + const matches = [...messageLiens.matchAll(linkPattern)]; - if (!match) { - await interaction.reply({ content: '❌ Lien de message invalide. Utilisez un lien Discord valide.', ephemeral: true }); + if (matches.length === 0) { + await interaction.reply({ content: '❌ Aucun lien de message valide trouvé. Utilisez des liens Discord valides.', ephemeral: true }); return; } - const [, guildId, channelId, messageId] = match; - - try { - const channel = await interaction.client.channels.fetch(channelId); - messageToTranslate = await channel.messages.fetch(messageId); - } catch (error) { - await interaction.reply({ content: '❌ Impossible de récupérer le message depuis ce lien.', ephemeral: true }); - return; + for (const match of matches) { + const [, guildId, channelId, messageId] = match; + + try { + const channel = await interaction.client.channels.fetch(channelId); + const message = await channel.messages.fetch(messageId); + messagesToTranslate.push(message); + } catch (error) { + console.error(`Impossible de récupérer le message ${messageId}:`, error); + } } } else { - // Si pas de message en réponse, chercher le message référencé + // Si pas de lien, chercher le message précédent if (interaction.channel && interaction.channel.lastMessage) { - // Récupérer le dernier message avant cette interaction const messages = await interaction.channel.messages.fetch({ limit: 2 }); const messagesArray = Array.from(messages.values()); - messageToTranslate = messagesArray[1]; // Le message avant l'interaction + const messageToTranslate = messagesArray[1]; + if (messageToTranslate) { + messagesToTranslate.push(messageToTranslate); + } } } - if (!messageToTranslate || !messageToTranslate.content || messageToTranslate.content.trim() === '') { - await interaction.reply({ content: '❌ Aucun message à traduire trouvé. Utilisez cette commande en répondant à un message ou après un message contenant du texte.', ephemeral: true }); + if (messagesToTranslate.length === 0) { + await interaction.reply({ content: '❌ Aucun message à traduire trouvé.', ephemeral: true }); return; } - try { - await interaction.deferReply(); + // Supprimer le message de commande + await interaction.deferReply({ ephemeral: true }); + await interaction.deleteReply(); - // Traduire le message en français - const result = await translator.translateText(messageToTranslate.content, null, 'fr'); - - // Créer la réponse avec la traduction - const footer = `\n\n*Message original de ${messageToTranslate.author.username} dans ${messageToTranslate.channel.name}*`; - const translatedText = result.text; - - // Vérifier la longueur et diviser si nécessaire - if ((translatedText + footer).length > 2000) { - const maxContentLength = 2000 - footer.length; - const chunks = []; - - // Diviser le texte en chunks - for (let i = 0; i < translatedText.length; i += maxContentLength) { - chunks.push(translatedText.substring(i, i + maxContentLength)); - } - - // Envoyer le premier chunk avec editReply - await interaction.editReply(chunks[0] + (chunks.length > 1 ? ' *(suite...)*' : footer)); - - // Envoyer les chunks suivants avec followUp - for (let i = 1; i < chunks.length; i++) { - const isLast = i === chunks.length - 1; - const chunkMessage = chunks[i] + (isLast ? footer : ' *(suite...)*'); - await interaction.followUp(chunkMessage); - } - } else { - await interaction.editReply(translatedText + footer); + // Traiter chaque message + for (const messageToTranslate of messagesToTranslate) { + if (!messageToTranslate.content || messageToTranslate.content.trim() === '') { + continue; + } + + try { + // Traduire le message en français + const result = await translator.translateText(messageToTranslate.content, null, 'fr'); + + const footer = `\n\n*Message original de ${messageToTranslate.author.username} dans ${messageToTranslate.channel.name}*`; + const translatedText = result.text; + + // Vérifier la longueur et diviser si nécessaire + if ((translatedText + footer).length > 2000) { + const maxContentLength = 2000 - footer.length - 15; // -15 pour " *(suite...)*" + const chunks = []; + + // Diviser le texte en chunks + for (let i = 0; i < translatedText.length; i += maxContentLength) { + chunks.push(translatedText.substring(i, i + maxContentLength)); + } + + // Envoyer tous les chunks + for (let i = 0; i < chunks.length; i++) { + const isLast = i === chunks.length - 1; + const chunkMessage = chunks[i] + (isLast ? footer : ' *(suite...)*'); + await interaction.channel.send(chunkMessage); + } + } else { + await interaction.channel.send(translatedText + footer); + } + + } catch (error) { + console.error('Erreur lors de la traduction:', error); + await interaction.channel.send('❌ Erreur lors de la traduction du message.'); } - - } catch (error) { - console.error('Erreur lors de la traduction:', error); - await interaction.editReply('❌ Erreur lors de la traduction du message.'); } }, };