有效统计 discord.js 上的人数

Effectively getting count of whos here on discord.js

我想为我的 discord 机器人发出一个命令,允许人们在一个时间范围内签到并计算这里的人数,而不管在场人数的上限。目前我有这个:

case "report":

    const filter = m => m.content.startsWith('here');

    message.channel.sendMessage("Report your accountability!");
    message.channel.awaitMessages(filter, { 
        max: 200,
        time: 30000,
        errors: ['time'] 
    })
    .then(collected => {
        message.channel.sendMessage(`Accountability is ${collected.size} of ${message.guild.members.size}, present or accounted for.`);
    });
    break;
}

我不太确定问题出在哪里,因为代码到达第一个 sendMessage 并且似乎正在通过我的测试通道运行。非常感谢您对概念的任何澄清!

您正在处理的问题是,您希望 .then 在时间结束后被调用。实际上,达到时间限制被认为是 "error" - 如 .awaitMessages Example:

所示
...
// Errors: ['time'] treats ending because of the time limit as an error
channel.awaitMessages(filter, { max: 4, time: 60000, errors: ['time'] })
    .then(collected => console.log(collected.size))
    .catch(collected => console.log(`After a minute, only ${collected.size} out of 4 voted.`));

因此,为了让您的代码按照您的意愿工作,您只需要在 channel.awaitMessages 调用之后使用 .catch 语句,如下所示:

message.channel.awaitMessages(filter, { 
    max: 200,
    time: 30000,
    errors: ['time'] 
})
.then(collected => {
    message.channel.send(`Accountability is ${collected.size} of ${message.guild.members.size}, present or accounted for.`);
})
// .catch is called on error - time up is considered an error (says so in docs)
.catch(collected => {
    message.channel.send(`Accountability is ${collected.size} of ${message.guild.members.size}, present or accounted for.`);
});

注意: 正如@Splinxyy 在评论中提到的,您应该使用 .send 而不是已弃用的 .sendMessage 函数。

编辑: 在您表达的评论中,您可能只想计算在频道中发送 'here' 的唯一用户。这样做的一种方法是将用户 ID 存储在一个数组中,并通过过滤器数组检查用户 ID 是否尚未被计算在内:

let uidHolder = [];
const filter = m => {
    let id = m.author.id;
    if (uidHolder.includes(id) || !m.content.startsWith('here'))
        return false;
    else {
        uidHolder.push(id);
        return true;
    }
};

如果您不喜欢这种方法,您应该能够处理从 .then / .catch 返回的 collected 变量。但是使用 filter 函数可能更容易。