有效统计 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
函数可能更容易。
我想为我的 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
函数可能更容易。