¿Hay alguna forma de detener un intervalo en función del contenido de un mensaje específico? ¿O hacer que los usuarios detengan el intervalo primero antes de comenzar un nuevo intervalo?
Aquí está el código para iniciar un intervalo:
const ms = require('ms') let interval; function isNumeric(str) { return !isNaN(str) && !isNaN(parseFloat(str)); } module.exports = { name: 'interval', aliases: ['int'], run: async (client, message, args) => { let time = args[0]; if(!time) return message.reply('Please enter the duration of message interval!').then(msg => { setTimeout(() => { msg.delete() }, 5000) }) .catch() let reason = args.slice(1).join(' '); if(!reason) return message.reply('Please enter a message!').then(msg => { setTimeout(() => { msg.delete() }, 5000) }) .catch() interval = setInterval(function() { message.channel.send(reason) .catch(console.error); }, ms(time)); }, stopInterval() { if(interval) { clearInterval(interval); } } }El contenido del mensaje especificado sería el
let reason = args.slice(1).join(' ');En cuanto al código para detener el intervalo:
const stopInt = require('./interval'); module.exports = { name: 'stopinterval', aliases: 'stopint', run: async (client, message, args) => { message.channel.send("Message reminder has been stopped."); stopInt.stopInterval(); } }También tengo un problema que si uso el intervalo dos veces, solo puedo detener el último intervalo que creé y no pude detener el primero.
Podría usar un Set o una matriz para realizar un seguimiento de una lista de intervalos:
const ms = require("ms"); const intervals = new Set() function isNumeric(str) { return !isNaN(str) && !isNaN(parseFloat(str)); } module.exports = { name: "interval", aliases: ["int"], run: async (client, message, args) => { let time = args[0]; if (!time) return message .reply("Please enter the duration of message interval!") .then((msg) => { setTimeout(() => { msg.delete(); }, 5000); }) .catch(); let reason = args.slice(1).join(" "); if (!reason) return message .reply("Please enter a message!") .then((msg) => { setTimeout(() => { msg.delete(); }, 5000); }) .catch(); intervals.add(setInterval(function () { message.channel.send(reason).catch(console.error); }, ms(time))); }, stopInterval() { for (const interval of intervals) { intervals.delete(interval); clearInterval(interval); } }, };(Me tomé la libertad de formatear tu código usando más bonito)
No relacionado con su pregunta, pero noté:
async / await con .then / .catch.catch() vacías deben eliminarse