javascript - 计算通过了多少 discord.js PM
问题描述
是否可以计算机器人发送给用户 PM 的消息数量?
我正在创建一个通知用户服务器相关公告的机器人。(我知道这可能被认为是垃圾邮件,实际上用户可以选择接收或不接收 PM)
到目前为止我有这个:
let roleCount = message.guild.roles.cache.get(Role.id).members.size;
message.guild.roles.cache.get(Role.id).members.forEach((member) =>
member.send(embed).catch(async (err) => {
console.log(err);
message.reply("I couldn't PM one or more users");
}),
);
message.channel.send(`I sent a PM to ${roleCount} users`);
如您所见,最终消息计算角色中有多少成员,而不是有多少成员收到了 PM。
我如何计算有多少成员没有收到 PM?之后我可以简单地做一个减法(roleCount - 经过的 PM)。
解决方案
您可以设置一个计数器来跟踪成功和不成功的消息。与member.send
异步一样,您需要先解决承诺。我使用 aPromise.all
等待发送每条消息,并且仅在完成后发送带有结果的消息。
如果消息发送成功,只需增加counters.success
; 如果它出错,请counters.error
改为增加。
let roleId = 'XXXXXXX';
// don't rely on cache, fetch the role instead
let role = await message.guild.roles.fetch(roleId);
let total = role.members.size;
let counters = { success: 0, error: 0 };
// don't forget to wait for every message to be sent
await Promise.all(
role.members.map(async (member) => {
try {
await member.send(embed);
counters.success += 1;
} catch (err) {
console.log(err);
counters.error += 1;
}
}),
);
message.channel.send(
`I've sent PMs to ${total} users. ${counters.success} successful, ${counters.error} unsuccessful`,
);
推荐阅读
- angular - 给占位符在Angular 6中选择
- eclipse-rcp - RCPTT - 不能像条件一样接受程序的返回
- linux - 在 bash 中运行具有依赖关系的并行函数
- google-speech-api - 谷歌语音 api:“音频主题”无法使用
- android - 如何重用一个片段
- python - 忽略正则表达式中匹配字符串之间的新行
- sql - 如何抑制变量行计算所需的 Mariadb 变量,而不是插入
- jquery - 如何使用小于字符的jquery附加html
- go - 使用 gin 包从 Postman 表单获取数据后没有显示任何值
- r - 带有交互式条形图和 textInput 的闪亮应用