【问题标题】:Count how many discord.js PMs went through计算通过了多少 discord.js PM
【发布时间】:2021-06-25 08:56:38
【问题描述】:

是否可以统计机器人发送给用户 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)。

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    您可以设置一个计数器来跟踪成功和不成功的消息。由于member.send 是异步的,您需要先解决promise。我使用Promise.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`,
    );
    

    【讨论】:

    • SyntaxError: await 仅在异步函数中有效
    • 是的,您需要确保父函数是async functionclient.on('message', async (message) => { ...module.exports = async (client, Discord) => { ... 之类的东西。但我不确定你当前的代码在哪里。
    • 我应该把它放在哪里? pastebin.com/Bvv3r9Gc
    • 这里 => async execute (message) {
    【解决方案2】:
    let roleCount = message.guild.roles.cache.get(Role.id).members.size;
    let errorCounter = 0;    
        message.guild.roles.cache.get(Role.id).members.forEach(member => member.send(embed).catch(async err => {
            console.log(err);
            errorCounter++;
            message.reply("I couldn't PM one or more users");
        }));
        message.channel.send(`I sent a PM to ${roleCount} users`)
        console.log('times the error callback was called;',errorCounter);
    

    【讨论】:

    • 计数保持为 0
    • 我禁用了我的 DM 来测试代码。控制台输出错误但计数保持不变
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2018-02-03
    相关资源
    最近更新 更多