Tengo este comando 'borrar' para mi bot de discordia y debería funcionar así: -el usuario escribe !mute
module.exports = { name: 'clear', description: "clears messages", async execute(message, args) { if(!args[0]) return message.reply("Please specify how many messages you want to clear!"); if(isNaN(args[0])) return message.reply("Please enter a number of messages you want to clear!"); if(args[0] > 100) return message.reply("You can't delete more than 100 messages!"); if(args[0] < 1) return message.reply("You can't delete less than 1 message!"); await message.channel.messages.fetch({limit: args[0]}).then(messages =>{ message.channel.bulkDelete(messages).then(() => { message.channel.send("Deleted " + args[0] + " messages") .then(msg => { let id = msg.id; setTimeout(function(){ if(message.channel.messages.fetch(id)) { try { msg.delete() } catch (error) { console.log(error) return } } }, 5000); }) }); }) } }El error que estoy recibiendo es:
C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\rest\RequestHandler.js:350 throw new DiscordAPIError(data, res.status, request); ^ DiscordAPIError: Unknown Message at RequestHandler.execute (C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\rest\RequestHandler.js:350:13) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async RequestHandler.push (C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\rest\RequestHandler.js:51:14) at async MessageManager._fetchId (C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\managers\MessageManager.js:219:18) { method: 'get', path: '/channels/943105549795471443/messages/946096412922368100', code: 10008, httpStatus: 404, requestData: { json: undefined, files: [] } }Como puede ver, he intentado usar try...catch() pero no solucionó el problema. ¿Alguna idea sobre lo que debe hacer? ¿O tal vez hay un error en mi código como una importación faltante o algo así?
En primer lugar, echemos un vistazo a este código:
try { msg.delete(); } catch (error) { return console.log(error); } Este código no hará lo que esperas. msg.delete(); es una función que devuelve una Promise . Una estructura try/catch no hará nada si la promesa falla. Entonces, en cambio, para detectar el error, debe usar el método catch en Promise, tal como usó .then() anteriormente, tendrá que usar .catch() .
Así que tu nuevo código será así:
msg.delete().catch(error => console.error(error); // Or, even better: msg.delete().catch(console.error);Eso es exactamente lo mismo aquí:
if (message.channel.messages.fetch(id)) Eso siempre será true porque la función fetch() devolverá una Promise y ya que no es un 0 , '' (cadena vacía), NaN , false , undefined o null . Consulte aquí los valores falsos.
En cambio, lo que está tratando de hacer es verificar si los mensajes contienen su identificación:
message.channel.messages.fetch(id).then(msg => { // Do what you want with the fetched msg }).catch(error => { // Console error why it failed to fetch the id (probably because it doesn't exist or got deleted) message.reply('Failed to fetch the id'); });Por último, este código también tiene algunos problemas:
message.channel.bulkDelete(messages).then(() => { messages es una Collection , no un número, bulkDelete() espera un número, así que haz esto:
message.channel.bulkDelete(messages.size).then(() => {Personalmente, no veo por qué tienes que buscar el mensaje, simplemente puedes hacer esto:
message.channel.messages.fetch({ limit: args[0] }).then(messages => { message.channel.bulkDelete(messages.size).then(() => { message.channel.send(`Deleted ${args[0]} messages`).then(msg => { setTimeout(() => msg.delete(), 5000); }); }); });Todo lo que necesita hacer es await msg.delete() dentro de su bloque de try . Una promesa debe ser liquidada antes de que pueda ser probada por cualquier error.
try { // Add 'await' await msg.delete(); } catch (error) { return console.log(error); }Si desea anular el error para que la función falle en silencio:
msg.delete() .catch(() => null); También puede marcar Message#deletable antes de que su cliente intente eliminarlo:
if (msg.deletable) { // I'd still recommend adding your preferred error handling msg.delete(); }return message.reply({ content: "Done" }) .then(m => setTimeout(() => message.delete().catch(() => null), 2500))úselo así, resolverá el problema para d.js v13.6