如何在不重启的情况下更新机器人状态 'bot.users.size'

How to update 'bot.users.size' in bot status without restarting

所以基本上我希望我的机器人有一个动态状态,每 5 秒更改一次,并显示我的机器人当前正在帮助多少用户。改变状态部分不是问题,问题是在不重新启动我的机器人的情况下,用户帮助计数不会改变,考虑到它是托管的并且在许多服务器上,这并不理想,没有必要一直重新启动只是为了用户计数准确的。

我尝试的方法是包含一个间隔计时器,该计时器将更新 userCount 变量,以使其准确显示它正在帮助的用户数量。似乎正在发生的事情是,当用户加入服务器时,变量将相应更新并显示与之前帮助的用户数相关的 +1。但是,当用户离开时,它不会从计数中减去一个,而是将其保留在之前的计数中。我包含 console.log(userCount) 只是为了更容易在控制台中每 10 秒查看一次数字,而不必等待机器人的状态更改为正确的状态。

bot.on('ready', function() {
    let userCount = bot.users.size
        setInterval(() => {
            userCount = bot.users.size
            console.log(userCount)
        }, 10000);
    setInterval(async () => {
    let statuslist = [
        'blah',
        "blah'",
        'blah ' + ` ${userCount} Users` 
    ];      
  const random = Math.floor(Math.random() * statuslist.length);

  try {
    await bot.user.setPresence({
      game: {
        name: `${statuslist[random]}`,
        type: "Playing"
      },
      status: "online"
    });
  } catch (error) {
    console.error(error);
  }
}, 5000);
console.log("Logged in as " + bot.user.username);
});

我觉得这不是库问题,因为我对自己创建检查更改的代码的能力不太自信。理想情况下,它将根据机器人所在的用户 joining/leaving 以及公会 inviting/removing 来自公会的机器人显示准确的数字。我不确定我是否应该为此使用事件,即使我是,我也不知道该怎么做。

你有2个setIntervals,把它们组合起来! 那应该可以解决您的问题。

您也可以使用 guildMemberAdd / guildMemberRemove 事件。

bot.on('ready', function() {
    setInterval(async () => {
        const statuslist = [
            'blah',
            'blah_1',
            ` ${bot.users.size} Users`,
        ];
        console.log(statuslist);
        const random = Math.floor(Math.random() * statuslist.length);

        try {
            await bot.user.setPresence({
                game: {
                    name: `${statuslist[random]}`,
                    type: 'Playing',
                },
                status: 'online',
            });
        }
        catch (error) {
            console.error(error);
        }
    }, 15000);
    console.log('Logged in as ' + bot.user.username);
});

But, when a user leaves, it does not subtract one from the count, instead, it just leaves it at the previous count.

这是 client.users 的预期。它是客户端在某个时刻缓存的所有用户的集合,因此不应删除任何用户。我想你要找的是这个...

bot.on('ready', () => {
  setInterval(async () => {
    let users = 0;
    for (let g of bot.guilds.array()) users += (g.members.size - 1));

    await bot.user.setActivity(`${users} user${users !== 1 ? 's' : ''}`, {type: 'WATCHING'})
    .catch(err => console.error());
  }, 15000);
});

请注意,如果他们在 2 个公会中,这将重新计算用户数。如果你想要一个精确的计数,以内存为代价,你可以使用...

bot.on('ready', () => {
  setInterval(() => {
    let guilds = bot.guilds.array();
    let users = [];

    for (var i = 0; i < guilds.length; i++) {
      let members = guilds[i].members.array();

      for (var i = 0; i < members.length; i++) {
        if (members[i].user.id !== bot.user.id && users.indexOf(members[i].user.id) === -1) users.push(members[i].user.id);
      }
    }

    bot.user.setActivity(`${users.length} user${users.length !== 1 ? 's' : ''}`, {type: 'WATCHING'})
    .catch(err => console.error());
  });
});