如何在没有重新启动的情况下更新bot状态中的'bot.users.size'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在没有重新启动的情况下更新bot状态中的'bot.users.size'相关的知识,希望对你有一定的参考价值。

所以基本上我希望我的机器人具有每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);
});

我觉得这不是一个库问题,因为我对创建检查更改的代码的能力不是很有信心。理想情况下,它会根据用户加入/离开服务器所在的服务器显示准确的数字,以及公会从公会中邀请/删除僵尸程序。我不确定我是否应该使用这个事件,即使我去了,我也不知道怎么做。

答案

但是,当用户离开时,它不会从计数中减去一个,而是将它留在先前的计数中。

这是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());
  });
});
另一答案

你有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);
});

以上是关于如何在没有重新启动的情况下更新bot状态中的'bot.users.size'的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不重新启动 JSF 中的服务器的情况下更新应用程序?

如何在没有root访问权限的情况下部署NodeJS应用程序,以便在服务器重新启动后保持在线状态?

有没有办法在不重新启动 Solr 服务器的情况下动态更新同义词文件?

Apache Flink-在不使用广播状态的情况下更新操作员中的配置

如何在没有变异的情况下更新状态数组中的现有值?

如何在不重新启动活动的情况下更新 recyclerview(来自 sqlite 的数据)