首页 > 解决方案 > 计算通过了多少 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)。

标签: javascriptnode.jsdiscorddiscord.js

解决方案


您可以设置一个计数器来跟踪成功和不成功的消息。与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`,
);

在此处输入图像描述


推荐阅读