Estoy haciendo un comando para traducir todos los mensajes que tienen una determinada reacción al idioma del emoji de la bandera (con el que reaccionó el usuario).
Pero quiero que el bot solo traduzca una vez para un idioma (si hay dos usuarios que reaccionan con la bandera de EE. UU., traducirá el mensaje al inglés solo una vez).
Puedo usar el filtro de reacción, pero en mi caso, para un mejor código, estoy usando una declaración de cambio, por lo que si uso la propiedad max en el filtro de reacción, no podría traducir varias veces un mensaje (solo una vez).
Aquí está mi código:
bot.on('message', async (msg) => { const reactionFilter = (reaction, user) => { return msg.author.id !== '724682218454253588'; }; collector = msg.createReactionCollector(reactionFilter); collector.on('collect', async (reaction, user) => { switch (reaction.emoji.name) { case '🇫🇷': TranslateMessage(msg, 'fr'); break; case '🇺🇸': TranslateMessage(msg, 'en'); break; case '🇩🇪': TranslateMessage(msg, 'de'); break; case '🇪🇸': TranslateMessage(msg, 'es'); break; case '🇯🇵': TranslateMessage(msg, 'ja'); break; } }); });
(Tengo muchos más idiomas que eso en esta declaración de cambio, pero para la pregunta es más fácil de leer)
Y aquí está la función TranslateMessage:
async function TranslateMessage(msg, lang) { try { const traduction = await traduire(msg.content, lang); const MessEmbed = new MessageEmbed() .setAuthor(msg.author.username, msg.author.avatarURL) .setDescription(traduction); return msg.channel.send(MessEmbed); } catch (error) { return msg.channel.send("There's an error, try again !"); } }
Puedes comprobar el recuento de reaction.count
que devuelve el número de personas que han dado la misma reacción. Si es mayor que 1
, no necesita traducir el mensaje a ese idioma.
collector.on('collect', async (reaction, user) => { if (reaction.count > 1) return; // there is already a translation for this reaction switch (reaction.emoji.name) { case '🇫🇷': TranslateMessage(msg, 'fr'); break; case '🇺🇸': TranslateMessage(msg, 'en'); break; case '🇩🇪': TranslateMessage(msg, 'de'); break; case '🇪🇸': TranslateMessage(msg, 'es'); break; case '🇯🇵': TranslateMessage(msg, 'ja'); break; } });
Si desea evitar enviar una nueva traducción cuando un usuario elimine la última reacción (lo que significa que el recuento de reaction.count
volverá a ser cero) y luego la agrega nuevamente, puede usar el evento messageReactionRemove
. Se emite cada vez que se elimina una reacción, por lo que puede verificar si el recuento de reaction.count
se redujo a cero y reaccionar como un bot con el mismo emoji. Por supuesto, también desencadenaría una traducción, por lo que deberá filtrar la reacción del bot:
bot.on('message', async (msg) => { const reactionFilter = () => { return msg.author.id !== '724682218454253588'; }; const collector = msg.createReactionCollector(reactionFilter); collector.on('collect', (reaction, user) => { if (reaction.count > 1 || user.bot) return; switch (reaction.emoji.name) { case '🇫🇷': TranslateMessage(msg, 'fr'); break; case '🇺🇸': TranslateMessage(msg, 'en'); break; case '🇩🇪': TranslateMessage(msg, 'de'); break; case '🇪🇸': TranslateMessage(msg, 'es'); break; case '🇯🇵': TranslateMessage(msg, 'ja'); break; } }); }); bot.on('messageReactionRemove', (reaction) => { if (reaction.count === 0) reaction.message.react(reaction.emoji); });