Я создаю статус, который показывает, во скольких гильдиях состоит мой бот, но он не обновляется

#javascript #node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

Я пытаюсь создать статус для моего бота Discord, который показывает, на скольких серверах находится мой бот. Я хочу, чтобы он обновлял статус каждый раз, когда мой бот добавляется на новый сервер. Вот мой текущий код:

 bot.on('ready', () => {
  console.log(`${bot.user.username} is now ready!`);
  status_list = ["stuff", `${bot.guilds.cache.size} servers`]
  setInterval(() => {
    var index = Math.floor(Math.random() * (status_list.length - 1)   1);
    bot.user.setActivity(status_list[index], { type: "LISTENING" });
  }, 15000)
});
  

Любая помощь будет оценена, спасибо!

Комментарии:

1. Вместо setInterval() вы могли бы использовать guildCreate() событие, которое выдается каждый раз, когда бот присоединяется к новому серверу.

2. Если ему не удается настроить его, и он выдает ошибку, это может привести к тому, что статус будет временно неисправен. Было бы лучше и более рекомендуется использовать .setInterval() вместо этого, поскольку он будет обновлять статус каждый интервал, независимо от того, изменилось число или нет.

Ответ №1:

Вместо того, чтобы полагаться на интервал, лучше использовать события guildCreate и guildDelete . Они запускаются каждый раз, когда бот присоединяется к гильдии или удаляется из гильдии соответственно. Взгляните на пример кода ниже.

 client.on("ready", () => {
    client.user.setActivity("Serving "   client.guilds.cache.size   " servers");
});

client.on("guildCreate", () => {
    // Fired every time the bot is added to a new server
    client.user.setActivity("Serving "  client.guilds.cache.size  " servers");
});

client.on("guildDelete", () => {
    // Fired every time the bot is removed from a server
    client.user.setActivity("Serving "  client.guilds.cache.size  " servers");
});
  

Теперь, если вы хотите связать это с выбором случайного статуса, вы также можете сделать следующее:

 const statusMessages = ['First status messages', 'Serving {guildSize} servers', 'Third possible message'];

let chosenMessageIndex = 0;

client.on("ready", () => {
    setInterval(() => {
        setRandomStatus();
    }, 15000);

    setRandomStatus();
});

client.on("guildCreate", () => {
    // Fired every time the bot is added to a new server
    updateStatus();
});

client.on("guildDelete", () => {
    // Fired every time the bot is removed from a server
    updateStatus();
});

function setRandomStatus() {
    chosenMessageIndex = Math.floor(Math.random() * statusMessages.length);

    // Set the random status message. If "guildSize" is in the status,
    // replace it with the actual number of servers the bot is in
    let statusMessage = statusMessages[chosenMessageIndex].replaceAll('{guildSize}', client.guilds.cache.size);

    client.user.setActivity(statusMessage);
}

function updateStatus() {
    // Check if the displayed status contains the number of servers joined.
    // If so, the status needs to be updated.
    if (statusMessages[chosenMessageIndex].includes('{guildSize}') {
        let statusMessage = statusMessages[chosenMessageIndex].replaceAll('{guildSize}', client.guilds.cache.size);

        client.user.setActivity(statusMessage);
    }
}
  

Комментарии:

1. Если это нужно только для отображения количества гильдий, но если в нем также указано количество участников, возможно, было бы лучше использовать .setInterval() , поскольку он срабатывает через определенное время, например, после перезарядки. если у бота так много гильдий и / или пользователей, то этот метод может фактически спамить API, хотя я согласен, что для этой цели это лучше.

Ответ №2:

Ваша проблема здесь:

 var index = Math.floor(Math.random() * (status_list.length - 1)   1);
  

Каждый раз будет объявляться один и тот же статус, и именно поэтому он не обновляется

Я хочу, чтобы он обновлял статус каждый раз, когда мой бот добавляется на новый сервер.

Это то, что вы пропустили (непреднамеренно). Что вы хотите сделать, так это, как вы уже делали, обновлять его через интервал с помощью setInterval() . Это будет обновлять статус каждый интервал, независимо от того, изменилось число или нет. Вам не нужно проверять, что он изменился, так как это небольшая нагрузка на ваш экземпляр.
Теперь попробуйте следовать приведенному ниже коду:

 bot.on('ready', async () => { // async is recommended as discord.js generally uses async/await.

  // Logs in the console that the bot is ready.
  console.log(`${bot.user.username} is now ready!`);

  // Rather than using an array, which is generally harder to use, manually set the variables instead.
  const status = `stuff on ${bot.guilds.cache.size} servers.`

  // Set the Interval of Refresh.
  setInterval(async () => { // Again, async is recommended, though does not do anything for our current purpose.

    // Set the activity inside of `setInterval()`.
    bot.user.setActivity(status, { type: "LISTENING" });

  }, 15000) // Refreshes every 15000 miliseconds, or 15 seconds.
});
  

Это должно сделать то, что вам нужно, но, как я вижу из вашего кода, вы пытались создать случайный статус? Если да, то вместо этого следуйте приведенному ниже:

 bot.on('ready', async () => {
  console.log(`${bot.user.username} is now ready!`);

  // In this one, you will need to make an array. Add as many as you want.
  const status_list = [`stuff on ${bot.guilds.cache.size} servers.`, `stuff on ${bot.channels.cache.size} channels.`];

  // Now randomize a single status from the status_list. With this, you have singled out a random status.
  const status = Math.floor(Math.random() * status_list.length);

  setInterval(async () => {
    bot.user.setActivity(status, { type: "LISTENING" });
  }, 15000)
});
  

Теперь, если вы хотите вместо этого иметь постоянно меняющийся (не случайный) статус, вы можете использовать следующий код:

 bot.on('ready', async () => {
  console.log(`${bot.user.username} is now ready!`);
  const status_list = [`stuff on ${bot.guilds.cache.size} servers.`, `stuff on ${bot.channels.cache.size} channels.`];

  // Create a new `let` variable, which can be assigned to, say, `count`.
  // We start from 0 so that it doesn't mess up.
  let count = 0;

  setInterval(async () => {

    // Check if the count is already the length of the status_list, if it is, then return to 0 again. This has to be done before the `status` variable has been set.
    if (count === status_list.length   1) count = 0;

    // Define Status by using the counter
    const status = status_list[count];
   
    // Add the counter by 1 every time the interval passed, which indicates that the status should be changed.
    count = count   1;

    bot.user.setActivity(status, { type: "LISTENING" });
  }, 15000)
});
  

Комментарии:

1. Сработает ли это, если кто-то удалит его со своего сервера?

2. Да, он будет работать постоянно, так как он будет работать независимо от того, изменилось число или нет, увеличилось или уменьшилось.

Ответ №3:

Я думаю, что это должно быть что-то вроде этого:

 bot.on('ready', () => {
  console.log(`${bot.user.username} is now ready!`);
  setInterval({
    bot.user.setPresence({
      activity: {
        name: `Running in ${bot.guilds.cache.size} servers.`,
        type: "LISTENING"
      }
    });
  }, 15000);
});
  

Это должно показывать, на скольких серверах находится бот в каждом интервале.

Комментарии:

1. Есть ли какой-либо способ, которым я могу также изменить статус?

2. На самом деле, вам не хватает setInterval() того, что требуется для его обновления. И будьте осторожны, так как его <client> идентификатор bot .

3. о, да. Извините.