Раздор бот интервал путаница

Я пытаюсь сделать что-то вроде таймера обратного отсчета на моем боте Discord. Вот что я использую рН.

        //Command base
    client.on("message", async message => {

      var sender = message.author;

      const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
      const command = args.shift().toLowerCase();

      //timetestvars
      var starttimer = 0;
      var counter = 10;

        //countdown timer
          if (command === 'testcount'){
              while(starttimer <= 9){
                setTimeout(function(){message.channel.send(counter), starttimer++, counter--},1*1)
              }

          };
});

но когда я набираю команду, ничего не происходит, как... ничего. Бот просто падает, я знаю, что делаю что-то не так, но я не знаю что.

Может ли кто-нибудь сказать мне, что я делаю неправильно, как я могу это исправить и как этот код действительно работает, и почему происходит конфликт?

Большое спасибо за помощь!

1 ответ

args.shift() возвращает число, поэтому при запуске args.shift().toLowerCase(), TypeError брошен

Попробуйте использовать args.slice(1) чтобы получить новый массив каждого элемента, кроме первого.

К тому же, args.slice(1) возвращает массив, который не совместим с методом.toLowerCase().

Попробуйте заменить

const command = args.shift().toLowerCase();

С

const command = args.slice(1)[0].toLowerCase();

---- или же ----

const command = args[0].toLowerCase();

Причина вашего сбоя в том, что у бота закончилась память для попытки повторить одно и то же столько раз раньше starttimer даже достиг 9.

while (starttimer <= 9) {
    setTimeout(function(){message.channel.send(counter), starttimer++, counter--},1*1) // Note that setTimeout waits in milliseconds, not seconds (also 1*1=1) so the correct number to put here would be 1000
}

Правильный способ сделать это так:

var starttimer = 10; // set this to your desired start time
for (let i=0; i <= starttimer; i++) {
    setTimeout(function(){
        message.channel.send(i);
    }, 1000*(starttimer-i));
}

Вы даже можете узнать время начала, выполнив var starttimer = args[0] поэтому вы бы использовали команду !testcount 10 (при условии, что вы установили свой префикс на !), например, для запуска 10-секундного таймера. Обратите внимание, что если есть задержка, это из-за перезарядки Discord API, и нет большого обходного пути, кроме установки более медленного таймера (путем изменения1000*(starttimer-i) к 2000*(starttimer-i) например).

PS Я только что заметил, что этот вопрос был задан более года назад, но я надеюсь, что это кому-то поможет:P

Другие вопросы по тегам