繁体   English   中英

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

[英]Discord.js Guild Member Count in Status will not be updated if someone leaves

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

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`);
});

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

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 个服务器后,意图需要将其列入白名单,但很容易被列入白名单 + 看起来这是一个个人机器人,所以它应该')。 .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .不是问题)。 我只是建议它,因为现在为我执行提取函数需要很长时间,而缓存函数在几毫秒内完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM