【问题标题】:Discord.js deleteMessage() doesn't workDiscord.js deleteMessage() 不起作用
【发布时间】:2018-01-13 11:49:17
【问题描述】:

我正在使用 discord.js 创建一个 Discord 机器人,我想创建一个可以清除消息的命令。现在,我有这段代码(只有有趣的部分),但我不知道为什么它不起作用:

// Importing discord.js, creating bot and setting the prefix 
const Discord = require('discord.js');
const bot = new Discord.Client();
const prefix = "/";

// Array that stores all messages sent
messages = [];

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

   // Store the new message in the messages array
   messages.push(message);

   // Split the command so that "/clear all" becames args["clear", "all"]
   var args = message.content.substring(prefix.length).split(" ");

   // If the command is "/clear all"
   if(args[0] == "clear" && args[1] == "all") {

      bot.deleteMessages(messages); // Code that doesn't work

      // Resets the array
      messages = [];

   }
}

// CONNECT !!!
bot.login('LOGING TOKEN HERE');

你能帮帮我吗?

【问题讨论】:

  • 请创建尽可能小的代码来演示您的问题,然后发布。您现在发布的代码甚至没有平衡大括号,所以我无法判断您是否有任何导致问题的语法错误。
  • 好的,我已经修好了@wmorrell!

标签: javascript bots discord discord.js


【解决方案1】:

不是这样的。您应该先获取消息,然后使用bulkDelete 删除它们 ,这里是一个简单的例子

// Normal Javascript
<Message>.channel.fetchMessages()
.then(messages => {
// Here you can use bulkDelete(101) to delete 100 messages instead of using fetchMessages and deleting only 50
<Message>.channel.bulkDelete(messages);
});
// ES6
let messages = await <Message>.channel.fetchMessages();
// Here you can use bulkDelete(101) to delete 100 messages instead of using fetchMessages and deleting only 50
await <Message>.channel.bulkDelete(messages);

【讨论】:

    【解决方案2】:

    您应该改用&lt;TextChannel&gt;.bulkDelete

    例子:

    msg.channel.bulkDelete(100).then(() => {
        msg.channel.send("Purged 100 messages.").then(m => m.delete(3000));
    });
    

    这会在每次调用此方法时删除频道中的2 - 100 消息,因此您不会经常收到429 (Too many Requests) Error,这可能会导致您的token being revoked

    【讨论】:

      【解决方案3】:

      你可以换

      bot.deleteMessages()
      

      到:

      messages.forEach(x => x.delete())
      

      【讨论】:

        【解决方案4】:

        不使用sweepMessages 的另一种方法是使用fetchMessages

        let user = message.mentions.users.first();
        let amount = !!parseInt(message.content.split(' ')[1]) ? parseInt(message.content.split(' ')[1]) : parseInt(message.content.split(' ')[2])
        var prefix = '!'
        
        
        if (message.content.startsWith(prefix + 'clear') && !amount) 
            return message.reply('Must specify an amount to clear!');
        if (message.content.startsWith(prefix + 'clear') && !amount && !user) return message.reply('Must specify a user and amount, or just an amount, of messages to clear!');
            message.channel.fetchMessages({
                limit: amount,
            }).then((messages) => {
            if (user) {
                const filterBy = user ? user.id : bot.user.id;
                messages = messages.filter(m => m.author.id === filterBy).array().slice(0, amount);
            }
            message.channel.bulkDelete(messages).catch(error => console.log(error.stack));
        });
        

        这将允许用户在发送时使用命令!clear [#] 删除该数量的消息。如果它以!clear 运行,您可以设置删除的数量,无需指定数量。

        discord.js Documentation - TextChannel#fetchMessages

        【讨论】:

          【解决方案5】:

          我看到两个问题:

          1. messages 数组始终为空;没有将项目添加到数组的代码,因此对bot.deleteMessages 的调用将始终得到一个空数组;
          2. 似乎deleteMessages 不是Discord.Client 上的可用方法;

          根据文档,我认为您想要的是sweepMessages。说明如下:

          扫描所有基于文本的频道的消息并删除超过最大消息生命周期的消息。如果消息已被编辑,则使用编辑时间而不是原始消息的时间。

          尝试更改代码以改为调用bot.sweepMessages(1);,我认为这会告诉客户端清除所有早于一秒的消息。

          【讨论】:

          • 对不起,我的代码太小了,在我的代码中,当有人写消息时,它会附加 messages 数组。此外,sweepMessages() 已被识别,但它似乎什么也没做......
          猜你喜欢
          • 2018-04-24
          • 1970-01-01
          • 2022-01-05
          • 2020-12-25
          • 2022-10-14
          • 2019-09-23
          • 2020-09-04
          • 2020-09-13
          • 2021-10-13
          相关资源
          最近更新 更多