如果有人离开,Discord.js 公会成员数量将不会更新

时间:2021-07-19 18:48:05

标签: javascript discord discord.js

我有一个统计服务器成员的状态。只要有人进来,机器人就会更新。但如果有人离开,则不会发生更新。

client.on('ready', () => {
    // Auto Change Status

    function picksStatus() {
        let status = [`mit ${client.users.cache.filter(u => !u.bot).size} User`, `${prefix}help für Hilfe`];

        let statusRotate = Math.floor(Math.random() * status.length);

        client.user.setActivity(status[statusRotate], {
            type: 'PLAYING'
        })
    }

    client.user.setStatus('dnd')

    setInterval(picksStatus, 5000)

    console.log(`Logged in as ${client.user.tag} ${client.users.cache.filter(u => !u.bot).size} Member auf ceqoX`);
});

1 个答案:

答案 0 :(得分:0)

我认为这是由于用户缓存(当新用户加入并且机器人没有缓存它们时,它会缓存它们=> 增加缓存大小,但据我所知,用户离开所有服务器机器人所在的位置不会导致机器人将其从缓存中删除)。此外,您的代码似乎显示了机器人缓存的所有用户,因此在机器人所在的所有服务器中(如果机器人是仅用于一台服务器的个人机器人,则可能没有问题)。
但是假设您想显示一个特定服务器的成员数量(这就是阅读您的问题的方式),您可以使用以下内容:

client.on('ready', async() => {
  const timer = (ms) => new Promise((res) => setTimeout(res, ms));
  // Auto Change Status

  async function statusChanging() {
    let guild = await client.guilds.fetch("your_guild_id");
    let members = (await guild.members.fetch()).filter(m => !m.user.bot);
    let membersAmount = members.size;

    let status = [`mit ${membersAmount} User`, `${prefix}help für Hilfe`];

    let statusRotate = Math.floor(Math.random() * status.length);

    client.user.setActivity(status[statusRotate], {
      type: 'PLAYING'
    });
  };

  client.user.setStatus('dnd');

  console.log(`Logged in as ${client.user.tag} ${client.users.cache.filter(u => !u.bot).size} Member auf ceqoX`);

  //Someone may have a better way of doing this, but basically this should basically run the function 5 seconds after it finishes (so if it takes 6 seconds to execute, it won't be started in the meantime, but it will be restarted 5 seconds after it finishes executing
  while(true) {
      await statusChanging();
      await timer(5000);
  };
});

这应该可以解决问题。
另外,如果你在开发者页面开启了服务器成员的意图,你可以使用这个功能:

function statusChanging() {
  const guild = client.guilds.cache.get("845590775450304512");
  const members = guild.members.cache.filter(m => !m.user.bot);
  const membersAmount = members.size;

  let status = [`mit ${membersAmount} User`, `${prefix}help für Hilfe`];

  let statusRotate = Math.floor(Math.random() * status.length);

  client.user.setActivity(status[statusRotate], {
    type: 'PLAYING'
  });
};

它直接扫描缓存,机器人应该缓存所有成员(意图需要在你的机器人在 100 个服务器后加入白名单,但很容易被列入白名单 + 看起来这是一个个人机器人,所以这应该不是问题)。我只是建议它,因为现在对我来说,获取函数需要很长时间才能执行,而缓存函数在几毫秒内完成。