Как обновить «bot.users.size» в статусе бота без перезагрузки - PullRequest
0 голосов
/ 14 апреля 2019

Поэтому я хочу, чтобы у моего бота был динамический статус, который меняется каждые 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 голосов
/ 14 апреля 2019

Но когда пользователь уходит, он не вычитает его из подсчета, а просто оставляет его при предыдущем подсчете.

Ожидается, что 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());
  });
});
0 голосов
/ 14 апреля 2019

У вас есть 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);
});
...