Awesome Stickz
Awesome Stickz

Reputation: 205

Discord bot - Purge command not working discord.js-commando

I have created a discord bot recently using node js which when I do !purge, responds with Unknown command, do !help to view a list of command but after saying it, it is purging the messages. That is, it works well but posting that error message. I don't know what's the problem please help me

const commando = require('discord.js-commando');
const bot = new commando.Client();
const prefix = '!';

bot.on('message', message => {

    let msg = message.content.toUpperCase();
    let sender = message.author; 
    let cont = message.content.slice(prefix.length).split(" "); 
    let args = cont.slice(1); 

    if (msg.startsWith(prefix + 'PURGE')) {        
        async function purge() {
            message.delete();

            if (isNaN(args[0])) {
                message.channel.send('Please input a number of messages to be deleted \n Syntax: ' + prefix + 'purge <amount>'); 
                return;
            }

            const fetched = await message.channel.fetchMessages({limit: args[0]}); 
            console.log(fetched.size + ' messages found, deleting...'); 

            // Deleting the messages
            message.channel.bulkDelete(fetched)
                .catch(error => message.channel.send(`Error: ${error}`));

        } 
        purge(); 
    }
});

bot.login('MY BOT TOKEN HERE');

Upvotes: 2

Views: 3322

Answers (2)

jscs
jscs

Reputation: 15

You might wanna use this. This purge command is intended for discord.js v11.5.1 and I haven't tested to see if it works on v12, but I think this might work for you. I should say that THIS DELETES ALL THE CONTENT INSIDE THE CHANNEL (Nested command)

exports.run = (bot, message, args) => {
  let filter = m => message.author.id === message.author.id;
    
  message.channel.send("Are you sure you wanna delete all messages? (y/n)").then(() => {
      message.channel.awaitMessages(filter, {
        max: 1,
        time: 30000,
        errors: ['time']
      })
        .then(message => {
          message = message.first();
        
          if (message.content.toUpperCase() == "YES" || message.content.toUpperCase() == "Y") {
            message.channel.bulkDelete(100);
          } else if (message.content.toUpperCase() == "NO" || message.content.toUpperCase() == "N") {
            message.channel.send("Terminated").then(() => {message.delete(2000)});
          } else {
            message.delete();
          }
        })
        .catch(collected => {
        message.channel.send("Timeout").then(() => {message.delete(2000)});
      });
    }).catch(error => {
    message.channel.send(error);
  });
};

Upvotes: 0

Blundering Philosopher
Blundering Philosopher

Reputation: 6805

Right now you're using the discord.js-commando library. Any reason you decided to use that library? It looks like you're just using standard discord.js functions like bot.on, message.channel.send, message.channel.fetchMessages, message.channel.bulkDelete...

You should be good just useing the standard discord.js library, starting your code with this:

const Discord = require('discord.js');
const bot = new Discord.Client();

You can find this code on the main "Welcome" page of Discord.js

Edit: I'm still not sure why you're using discord.js-commando, but that doesn't matter. Here's an example command I came up with using the discord.js-commando library:

const commando = require('discord.js-commando');

class PurgeCommand extends commando.Command {
    constructor(client) {
        super(client, {
            name: 'purge',
            group: 'random', // like your !roll command
            memberName: 'purge',
            description: 'Purge some messages from a Text Channel.',
            examples: ['purge 5'],

            args: [
                {
                    key: 'numToPurge',
                    label: 'number',
                    prompt: 'Please input a number ( > 0) of messages to be deleted.',
                    type: 'integer'
                }
            ]
        });
    }

    run(msg, { numToPurge }) {
        let channel = msg.channel;

        // fail if number of messages to purge is invalid
        if (numToPurge <= 0) {
            return msg.reply('Purge number must be greater than 0');
        }

        // channel type must be text for .bulkDelete to be available
        else if (channel.type === 'text') {
            return channel.fetchMessages({limit: numToPurge})
                .then(msgs => channel.bulkDelete(msgs))
                .then(msgs => msg.reply(`Purge deleted ${msgs.size} message(s)`))
                .catch(console.error);
        }
        else {
            return msg.reply('Purge command only available in Text Channels');
        }
    }
};

module.exports = PurgeCommand

I'd also recommend using a new type instead of integer so you can validate the user's response and make sure they enter a number greater than 0.

If you need help setting up an initial discord.js-commando script, I'd take a look at this repo provided by the Discord team: https://github.com/discordjs/Commando/tree/master/test

Upvotes: 1

Related Questions