Discord.js // 过滤消息startsWith 并解决bulkDelete 的DiscordAPIError

Posted

技术标签:

【中文标题】Discord.js // 过滤消息startsWith 并解决bulkDelete 的DiscordAPIError【英文标题】:Discord.js // Filtering message startsWith and work around DiscordAPIError for bulkDelete 【发布时间】:2018-06-05 18:11:10 【问题描述】:

这是我当前的代码。感谢@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”时,它会运行此代码并仅删除来自机器人的消息。我想添加一个功能,该功能还可以删除以 !/./> 开头的用户消息(这些消息不仅可以来自用户,也可以来自机器人),所以我尝试使用 const botMessages 将行编辑为:const botMessages = messages.filter(msg => msg.author.bot && msg.content.startsWith("!" || "." || ">"));但这没有用。你能指出我哪里出错了,我该如何解决这个问题?

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

谢谢。

【问题讨论】:

我想到的一种绕过错误的方法是一起删除 2 条消息。因此,当用户输入“.kick @User”时,机器人会说“被踢用户”。然后你输入“!clearMessages”,然后机器人批量删除以 . 开头的消息。 (“.kick @User”)以及来自机器人的消息“被踢用户”。这应该可以工作,因为它现在批量删除 2 条消息而不是 1 条? 【参考方案1】:

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

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

    const isCommand = msg.content.startsWith("!") || msg.content.startsWith(".") || msg.content.startsWith(">");
    

    您想要过滤掉机器人用户发出的或看起来像命令的消息。当前,您的逻辑已编写,因此机器人发出的消息 看起来像命令被过滤,这是错误的(机器人不会发出任何命令)。上述添加的正确检查是:

    const botMessages = messages.filterArray(msg => 
        const isCommand = msg.content.startsWith("!") || msg.content.startsWith(".") || msg.content.startsWith(">");
    
        return msg.author.bot || isCommand;
    );
    

更正您的过滤器逻辑应该会修复您的 DiscordAPIError 异常,但要确保没有发出错误调用,您应该保护 bulkDelete 调用:

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

【讨论】:

嗨..再次感谢。我已经尝试过像so - click here please, 这样的代码,但它似乎不起作用,我在控制台中得到this 只是为了清楚起见。我希望命令“!clearMessages”删除以!/>/开头的用户的消息。而且我希望它从机器人中删除消息。你能告诉我我做错了什么吗? 我尝试this 测试discord api 错误绕过是否有效,它控制台记录并发送一条消息说1 条机器人消息已被删除。但是,它不会在 discord 服务器中删除,也不会删除超过 2 条消息。所以我将botMessages.length 更改为botMessages.array().length,这适用于超过 2 条消息,但对于 1 条,我在控制台中收到 this 错误 我已经 updated the solution 解释了 Collection/Array 的行为。否则,您需要澄清“不起作用”的含义。您收到的消息是弃用通知,而不是错误。

以上是关于Discord.js // 过滤消息startsWith 并解决bulkDelete 的DiscordAPIError的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js V12 粗鲁的话过滤器不起作用

Discord js v12 如果有人对嵌入做出反应,则发送消息

Discord.js Quick.db 过滤器

模糊过滤器不适用于 discord.js [重复]

Discord.js - 过滤在对象中具有特定角色的人

过滤来自特定用户的反应 discord.js