Discord.js //过滤消息startsWith并为bulkDelete

时间:2017-12-23 12:32:45

标签: javascript node.js bots discord discord.js

这是我目前的代码。感谢@AndréDion的帮助。

  if (message.channel.type == 'text') {
    message.channel.fetchMessages().then(messages => {
        const botMessages = messages.filter(msg => msg.author.bot) 
        message.channel.bulkDelete(botMessages);
        messagesDeleted = botMessages.array().length; // number of messages deleted

        // Logging the number of messages deleted on both the channel and console
        message.channel.send("Deletion of messages successful. Total messages deleted: " + messagesDeleted);
        console.log('Deletion of messages successful. Total messages deleted: ' + messagesDeleted)
    }).catch(err => {
        console.log('Error while doing Bulk Delete');
        console.log(err);
    });
}

当用户输入“!clearMessages”时,它会运行此代码并仅删除来自机器人的消息。我想添加一个功能,它还会删除以!/./& gt;开头的用户发送的消息。 (这些消息可能来自用户不仅是机器人),所以我尝试使用const botMessages编辑这行:const botMessages = messages.filter(msg => msg.author.bot && msg.content.startsWith("!" || "." || ">"));但这不起作用。你能指出我出错的地方以及如何解决这个问题吗?

我注意到的另一个问题是,当只有1个机器人消息时,机器人不会删除该消息并提出DiscordAPIError,说您必须提供至少2-100条消息才能删除。有没有解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:1)

const botMessages = messages.filter(msg => msg.author.bot && msg.content.startsWith("!" || "." || ">"));有两个问题:

  1. msg.content.startsWith("!" || "." || ">")仅针对第一个真实陈述进行评估:"!"String#startsWith只采用一种模式,因此您必须将该调用拆分为三次调用。为方便起见,我们将这些检查的结果分配到单个变量中:

    const isCommand = msg.content.startsWith("!") || msg.content.startsWith(".") || msg.content.startsWith(">");
    
  2. 您希望过滤掉由bot用户发出的消息或看起来像命令的消息。目前编写的逻辑是为了使机器人发出的消息看起来像一个命令被过滤,这是错误的(机器人不会发出任何命令)。使用上述添加项进行的正确检查将是:

    const botMessages = messages.filterArray(msg => {
        const isCommand = msg.content.startsWith("!") || msg.content.startsWith(".") || msg.content.startsWith(">");
    
        return msg.author.bot || isCommand;
    });
    
  3. 更正过滤器逻辑应该修复DiscordAPIError异常,但为了确保没有发出错误调用,您应该保护bulkDelete调用:

    if (botMessages.length > 1) {
        message.channel.bulkDelete(botMessages);
    } else if (botMessages.length) {
        botMessages[0].delete();
    } else {
        // nothing to delete
    }