如何在discord.js v12.5.3 USING ARGS[]中编写clear命令

时间:2021-04-26 04:19:49

标签: javascript discord.js

我正在尝试为我的自定义 discord bot 制定一个明确的命令,并且我已经编写了一些代码并且它运行良好!问题是该命令删除的消息比它说的少 1 条消息,例如:>clear 5 删除 4 条消息,我知道这是因为编写用于启动批量删除的命令本身是一条消息,但我没有不希望发生这种情况,args[0] + 1 似乎不起作用!

这是我当前的代码:

module.exports = {
    name: 'clear',
    description: "Delete/Clear messages with a simple command",
    async execute(message, args) {
        if (message.member.permissions.has("KICK_MEMBERS")) {
            if (!args[0]) return message.reply("Please enter the amount of messages to clear!");

            if (isNaN(args[0])) return message.reply("Please type a real number!");

            if (args[0] > 100) return message.reply("You can't remove more than 100 messages at once!");

            if (args[0] < 1) return message.reply("You have to delete at least one message!");

            await message.channel.messages.fetch({ limit: args[0] }).then(messages => {
                message.channel.bulkDelete(messages);
                message.channel.send("<a:ces_Tick:774694116042342411> **Successfully deleted " + "`" + args[0] + " messages`**")
                    .then(msg => {
                        msg.delete({ timeout: 3000 })
                    })
            });
        } else {
            message.channel.send("You don't have sufficient permissions to use this command!");
        }
    }
}

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

在您的情况下,您正在删除包含您的命令的消息。例如:如果是 >clear 3,则清除包含您的命令消息的消息。所以为了删除命令消息之外的消息有3种情况。

第一个是像您说的那样删除 +1 消息。如果您不想在消息数量上增加 +1,那么您可以按照 second 在发送命令消息后立即删除消息。 例如:

if(args[0]==='clear'){
    message.delete(); //deletes the message that has been sent by user.
    message.channel.bulkDelete(messages);
}

第三是您可以使用 before 参数,以便在特定消息之前删除消息。

例如:

if(args[0]==='clear'){
message.channel.messages.fetch({ limit: args[0],before:message.id }).then(messages => {
                message.channel.bulkDelete(messages);
        })
}

第三种方法是唯一不删除命令而在其他两种方法中删除命令的方法。 此外,如果您使用 await 来解决 promise,则不需要使用 then()。了解有关 promise 的更多信息。并且 timeout 参数 将在即将发布的版本中弃用。所以最好使用 setTimeout() 方法。

编辑:就像 Lioness100 所说的,除非您打算在 fetch 中使用 before 选项,否则您不需要提取消息,因为 bulkDelelte() 已经提取了消息。