【问题标题】:Discord.js - counter of sent messages, DM to all members of guildDiscord.js - 发送消息的计数器,DM给公会的所有成员
【发布时间】:2020-11-28 11:17:13
【问题描述】:

所以,我有一个代码的工作示例,它向公会的所有成员发送 DM。 但是,我希望整个事情以一条消息结束,类似于:“成功发送 XX 条消息”。

        const sentMessages = 0;
        if (!message.member.hasPermission(`ADMINISTRATOR`)) {
            message.channel.send(`You don't have permission to use this command!`);
            message.client.channels.cache.get(logchannel).send(`${message.author} tried using DMALL! ` + dato.toLocaleTimeString() + dato.toLocaleDateString());
            return;
        } else {
            const delay = (msec) => new Promise((resolve) => setTimeout(resolve, msec));
            const sendMessage = args.join(" ");
            message.channel.send(`Sending messages, please wait...`);
            await delay(1000);
            let interval = 500; // how much time should the delay between two iterations be (in milliseconds)?
            let promise = Promise.resolve();
            message.guild.members.cache.forEach(function (user) {
                promise = promise.then(function () {
                    if (user.id != message.client.user.id) {
                        user.send(sendMessage);
                        sentMessages++;
                        return new Promise(function (resolve) {
                            setTimeout(resolve, interval);
                        });
                    }
                });
                message.channel.send(`Successfully sent ${sentMessages} messages!`);
            });

无论何时何地,最后的消息(Successfully...)都会返回 0。 如果我在 sentMessages++; 下方添加如下一行:message.channel.send(`Sent: ${sentMessages});,我会得到一个预期的递增数字。 p>

我在哪里做错了什么?

【问题讨论】:

    标签: node.js foreach promise discord.js increment


    【解决方案1】:

    如果您不想被 Discord 封禁,请不要这样做,禁止向公会的所有成员发送私信。

    【讨论】:

      【解决方案2】:

      最后求助于一个比我更擅长编码的朋友。 他想出了一种完全不同的方式:

              if (!message.member.hasPermission(`ADMINISTRATOR`)) {
                  message.channel.send(`You don't have permission to use this command!`);
                  message.client.channels.cache.get(logchannel).send(`${message.author} tried using DMALL in **${message.guild.name}**!` + dato.toLocaleTimeString() + dato.toLocaleDateString());
                  return;
              } else {
                  const delay = (msec) => new Promise((resolve) => setTimeout(resolve, msec));
                  const sendMessage = args.join(" ");
                  message.channel.send(`Sending messages, please wait...`);
                  await delay(1000);
                  const interval = 500;
                  let array;
                  try {
                      const all = await message.guild.members.fetch();
                      array = all.array();
                  } catch {
                      array = message.guild.members.cache.array();
                  }
                  let sentMessages = 0;
                  for (var i = 0; i < array.length; i++) {
                      const user = array[i];
                      if (!user.bot) {
                          try {
                              await user.send(sendMessage);
                              sentMessages++;
                              await delay(interval);
                          } catch { }
                      }
                  }
                  message.client.channels.cache.get(logchannel).send(`${message.author} sent a DM to all members of: **${message.guild.name}**!` + dato.toLocaleTimeString() + dato.toLocaleDateString());
                  message.channel.send(`Finished sending messages to all users, ${sentMessages} messages sent!`);
              }
      

      此代码经过测试,发现运行良好

      【讨论】:

        【解决方案3】:

        使用let sentMessages = 0 而不是const sentMessages = 0

        常量无法更新或重新分配,因此sentMessages++ 不会做任何事情

        【讨论】:

        • 我改为让,但没有变化。仍然说 0 条消息。我还移动了 sentMessages++;到 if() 语句之外,无济于事。 ``` if (user.id != message.client.user.id) { user.send(sendMessage); return new Promise(function (resolve) { setTimeout(resolve, interval); }); } 发送消息++; }); }); ``` 还是一样的结果...
        • @Gier 也许将let 更改为var?我被难住了?
        • 是的,我有同样的想法,但同样的结果......我就是想不通这个:/
        • 你知道它是否也成功发送了私信吗?
        • 是的,DM 正在向所有用户发送..?我屈服并联系了一位经验丰富的 Discord.js 朋友,他提出了一个远优于我的代码。一会儿我会贴出来。测试并发现工作;)
        猜你喜欢
        • 2021-11-09
        • 1970-01-01
        • 2020-10-08
        • 2020-12-10
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        相关资源
        最近更新 更多