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

Posted

技术标签:

【中文标题】如何在不重新启动的情况下更新机器人状态中的“bot.users.size”【英文标题】:How to update 'bot.users.size' in bot status without restarting 【发布时间】: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);
);

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

【问题讨论】:

【参考方案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());
  );
);

【讨论】:

谢谢,这完美!稍微调整一下,这正是我所需要的!

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

如何在不重新启动我的 Express.js 项目的情况下刷新 API 端点

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

在不重新启动节点应用程序的情况下更新节点应用程序依赖项

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

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

如何在不重新加载页面的情况下重新启动 Angular 应用程序?