【问题标题】:How to update 'bot.users.size' in bot status without restarting如何在不重新启动的情况下更新机器人状态中的“bot.users.size”
【发布时间】:2019-09-04 10:30:05
【问题描述】:

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

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

【问题讨论】:

    标签: javascript node.js visual-studio-code discord discord.js


    【解决方案1】:

    您有 2 个 setInterval,将它们组合起来! 这应该可以解决您的问题。

    您也可以使用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);
    });
    

    【讨论】:

      【解决方案2】:

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

      这是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());
        });
      });
      

      【讨论】:

      • 谢谢,这完美!稍微调整一下,这正是我所需要的!
      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多