我正在使用discord.js创建一个Discord bot,我想创建一个可以清除消息的命令。现在,我有这个代码(只有有趣的部分),我无法弄清楚它为什么不起作用:
// 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 :(得分:0)
我看到两个问题:
messages
数组始终为空;没有代码可以将项添加到数组中,因此对bot.deleteMessages
的调用将始终为空数组; deleteMessages
; sweepMessages
不是可用方法
醇>
根据文档,我认为你想要的是bot.sweepMessages(1);
。对该状态的描述:
扫描所有基于文字的频道'消息并删除早于最大消息生存期的消息。如果邮件已被编辑,则使用编辑时间而不是原始邮件的时间。
尝试更改代码,而不是调用isnan = NaN;
notnan = "hello";
if (typeof(notnan) === "number" && isNaN(notnan)){
console.log('yes');
}
else {
console.log('typeof(notnan) is :',typeof(notnan), '\n isNaN(notnan) :', isNaN(notnan),'\n this is,',typeof(notnan)=== "number",'-',isNaN(notnan), 'so this condition became false...')
}
,我认为这会告诉客户清除所有超过一秒的邮件。
答案 1 :(得分: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
运行,您可以设置删除的数量,而不指定数量。
答案 2 :(得分:0)
你可以交换
$json['url']
为:
bot.deleteMessages()
答案 3 :(得分: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。
答案 4 :(得分:0)
不是那样的。您应该先获取消息,然后使用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);