Estoy trabajando en un comando de imagen discord que envía una imagen aleatoria cada 10 segundos. Cuando inicio el comando, funciona. Comienza a enviar imágenes cada 10 segundos, pero cuando trato de detenerlo, simplemente no lo hace.
¿Qué salió mal? ¿Cómo puedo arreglar esto?
Image.js :
var Scraper = require('images-scraper'); const google = new Scraper({ puppeteer: { headless: true, }, }); var myinterval; module.exports = { name: 'image', description: 'Sends profile pics)', async execute(kaoru, message, args, Discord) { //prefix "?" const image_query = args.join(' '); const image_results = await google.scrape(image_query, 100); if (!image_query) return message.channel.send('**Please enter name of the image!**'); if (image_query) { message.delete(); myinterval = setInterval(function () { message.channel.send( image_results[Math.floor(Math.random() * (100 - 1)) + 1].url, ); }, 10000); } else if (message.content === '?stopp') { clearInterval(myinterval); message.reply('pinging successfully stopped!'); } } };No puede simplemente verificar el contenido del message.content dentro del método de execute . Nunca será ?stopp como execute solo cuando envíe el comando de image (es decir ?image search term ).
En cambio, lo que puede hacer es configurar un nuevo recopilador de mensajes en el mismo canal y verificar si el mensaje entrante es su comando stop . En mi ejemplo a continuación, utilicé createMessageCollector . También he añadido un montón de comentarios.
const google = new Scraper({ puppeteer: { headless: true, }, }); module.exports = { name: 'image', description: 'Sends profile pics', async execute(kaoru, message, args, Discord) { const query = args.join(' '); if (!query) return message.channel.send('**Please enter name of the image!**'); const results = await google.scrape(query, 100); // also send error message if there are no results if (!results?.length) return message.channel.send('**No image found!**'); // you probably want to send the first image right away // and not after 10 seconds const image = results[Math.floor(Math.random() * results.length)]; message.channel.send(image.url); let intervalID = setInterval(() => { // you don't need to add +1 and take away 1, it's unnecessary // also, use results.length instead of the hardcoded 100 // as if there are no 100 results, it will throw an error const image = results[Math.floor(Math.random() * results.length)]; message.channel.send(image.url); }, 10000); // use this filter to only collect message if... const filter = (m) => // the author is the same as the user who executed the command m.author.id === message.author.id && // and the message content is ?stopp m.content.toLowerCase() === '?stopp'; // set up a message collector const collector = message.channel.createMessageCollector({ // use the filter above filter, // you only need to collect a single message max: 1, }); // it fires when a message is collected collector.on('collect', (collected) => { clearInterval(intervalID); // message.reply won't work as message is no longer available message.channel.send('Pinging successfully stopped!'); }); message.delete(); } };