【问题标题】:Discord bot - Purge command not working discord.js-commandoDiscord bot - 清除命令不起作用 discord.js-commando
【发布时间】:2018-09-17 15:03:58
【问题描述】:

我最近使用节点 js 创建了一个不和谐机器人,当我执行 !purge 时,会以 Unknown command, do !help to view a list of command 响应,但在说出它之后,它正在清除消息。也就是说,它运行良好,但发布了该错误消息。不知道是什么问题,请帮帮我

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');

【问题讨论】:

    标签: javascript bots discord discord.js


    【解决方案1】:

    你可能想用这个。此清除命令适用于 discord.js v11.5.1,我尚未测试它是否适用于 v12,但我认为这可能对您有用。我应该说这会删除频道内的所有内容(嵌套命令)

    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);
      });
    };
    

    【讨论】:

    • 感谢您的帮助,但您知道,我提出这个问题已经 2 年零 9 个月了,现在我已经进步了很多,所以这对我来说是一些简单的事情,我不知道不再使用 discord.js-commando。顺便说一句,此代码仅删除最后 100 条消息,而不是频道中的所有消息另外,不要真正使用 discord.js v11,当 Discord 停止使用 discord.js 使用的 API 版本时,它会很快中断大约在 10 月 - 11 月完成,但他们还没有这样做,所以你必须尽快转换到 v12
    • tbh,我将 v11 用于我的 selfbot,我现在已经习惯了 v11.. 我讨厌语法更改,我不想仅仅为了 discord.py 而学习 python,让你把你的自己的令牌
    • 我知道,我希望即使在支持被取消后它仍然稳定:(
    【解决方案2】:

    现在您正在使用discord.js-commando 库。您决定使用该库的任何原因?看起来您只是在使用标准的 discord.js 函数,例如 bot.onmessage.channel.sendmessage.channel.fetchMessagesmessage.channel.bulkDelete...

    只要使用标准的discord.js 库就可以了,用以下代码开始你的代码:

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

    您可以在Discord.js的“欢迎”主页面上找到此代码

    编辑: 我仍然不确定你为什么使用discord.js-commando,但这并不重要。这是我使用discord.js-commando 库提出的示例命令:

    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
    

    我还建议使用新的 type 而不是 integer,这样您就可以验证用户的响应并确保他们输入的数字大于 0。

    如果您在设置初始 discord.js-commando 脚本时需要帮助,我会看看 Discord 团队提供的这个 repo:https://github.com/discordjs/Commando/tree/master/test

    【讨论】:

    • 我将 discord-js.commmando 用于我可以执行的其他命令 !roll 但更改为您所说的发送错误消息
    • 另外,当我执行!purge 时,有时会显示错误:DiscordAPIError: Unknown Message 我会将错误发送为image
    • 那我现在该怎么办
    • @RaviKiran - 查看我的新答案,一个使用 discord.js-commando 的示例命令。如果您有任何问题,请告诉我
    • 所以我只需要添加删除我的命令吗?如果我这样做了,它不是在清除告诉没有这样的命令
    猜你喜欢
    • 2021-01-16
    • 2020-08-16
    • 2020-10-30
    • 2021-07-25
    • 2021-11-19
    • 2018-07-28
    • 2021-01-05
    • 2020-08-07
    • 2020-12-31
    相关资源
    最近更新 更多