2017-08-05 98 views
0

我正在用discord.js创建一个Discord bot,我想创建一个可以清除消息的命令。现在,我有这个代码(只有有趣的部分),我不明白为什么它不起作用:Discord.js deleteMessage()不起作用

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

你能帮我吗?

+0

请创建演示您的问题的尽可能最小的代码,然后张贴。你现在发布的代码甚至没有平衡大括号,所以我不能分辨是否有任何引起问题的语法错误。 – wmorrell

+0

好的,我修复了@wmorrell! – Emrio

回答

0

您应该使用<TextChannel>.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

0

我看到两个问题:

  1. messages阵列总是空的;没有将项添加到数组的代码,因此对bot.deleteMessages的调用将始终获得一个空数组;
  2. 它不会出现deleteMessagesDiscord.Client上的可用方法;

根据相关文档,我想你想要的是sweepMessages。该状态的描述:

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

尝试改变代码,而不是呼叫bot.sweepMessages(1);,我想它会告诉客户端清除所有超过一秒的消息。

+0

对不起,我已经缩小了我的代码,在我的代码中,它会在有人写邮件时追加'messages'数组。 此外,'sweepMessages()'被识别,但它似乎没有任何作用... – Emrio

0

另一种方式来做到这一点,没有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

0

您可以把

bot.deleteMessages() 

到:

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