【发布时间】:2020-07-07 15:22:18
【问题描述】:
我有一个函数(称为 rankCheck),它接受三个参数:
- Guild 对象(又名 Discord 服务器)
- 用户ID
- 回调函数
该函数将从提供的公会中的每个文本频道获取最后 500 条消息。然后它将只保留以“!rank”开头并由提供的 UserId 发送的任何消息。最后,它会统计剩余的消息并将整数传递给回调函数。
async function rankChecks(guild, userId = *REMOVED FOR PRIVACY*, callback){
sumOfRankChecks = 0;
guild.channels.cache.each(channel => { //for each text channel, get # of rank checks for userId in last 500 msgs.
if (channel.type === "text"){
fetchMessages(channel, 500).then(msgs => {
let filteredMsgs = msgs.filter(msg => msg.content.startsWith("!rank") && msg.member.user.id == userId);
sumOfRankChecks = sumOfRankChecks + filteredMsgs.length;
});
}
});
callback(sumOfRankChecks);
}
由于 discord 只允许一次获取 100 条消息,因此我使用此功能 (fetchMessages) 绕过此限制,发送多个请求,然后将结果合并为一个。
async function fetchMessages(channel, limit) {
const sum_messages = [];
let last_id;
while (true) {
const options = { limit: 100 };
if (last_id) {
options.before = last_id;
}
const messages = await channel.messages.fetch(options);
sum_messages.push(...messages.array());
last_id = messages.last().id;
if (messages.size != 100 || sum_messages >= limit) {
break;
}
}
return sum_messages;
}
当我调用rankCheck函数时,返回值总是0
rankChecks(msg.guild, *REMOVED FOR PRIVACY*, function(int){
console.log(int);
});
输出:
0
但是,当我将 console.log 添加到我的 rankCheck 函数中时:
async function rankChecks(guild, userId = *REMOVED FOR PRIVACY*, callback){
sumOfRankChecks = 0;
guild.channels.cache.each(channel => { //for each text channel, get # of rank checks for userId in last 500 msgs.
if (channel.type === "text"){
fetchMessages(channel, 500).then(msgs => {
let filteredMsgs = msgs.filter(msg => msg.content.startsWith("!rank") && msg.member.user.id == userId);
sumOfRankChecks = sumOfRankChecks + filteredMsgs.length;
console.log(sumOfRankChecks) //NEW CONSOLE.LOG!!!!!!!!!!!!!!!
});
}
});
callback(sumOfRankChecks);
}
输出:
3
5
这是我期待的输出。因为我的服务器中有 2 个文本通道,所以我有 2 个日志。如果您有 3 个频道,您将获得 3 条日志,依此类推。来自频道 #1 的 3 条消息,以及来自频道 #2 的 2 条消息,因此总共有 5 条消息。
5 应该是传递给回调函数的整数,但传递的是 0。这是为什么呢?
【问题讨论】:
标签: node.js discord.js