如何在不重新启动的情况下以bot状态更新'bot.users.size'

时间:2019-04-14 05:36:44

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

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

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