2015-10-31 2 views
0

Я пишу бот IRC-чата, который отвечает на команды. У меня проблема с кулдауном по командам.Использование setTimout() правильно в Nodejs с ботом чата

Моя идея заключается в следующем:

setTimeout(function() { 
    client.on('chat', function (channel,user, message, self) { 
    if (message === 'command') { 
     // do stuff 
    } 
    }); 
}, 5000); 

бот реагирует каждый раз, когда пользователь вводит в чат. то он проверяет, набрал ли пользователь команду, а затем, очевидно, делает вещи.

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

Я попробовал его с таймером и date.now и прочее, но я думаю, что если я определить переменную как

var timer = 100000000000000 

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

http://www.tmijs.org/docs/ Есть библиотека, я использую для моего бота

Edit:

function doStuff(channel, user, message, self) { 
     // do stuff 
}; 


client.on('chat', function(channel, user, message, self) { 
    if (message === 'command') { 
    setTimeout(function() { 
     client.on('chat', doStuff(channel, user, message,self)); 
    }, 5000); 
    doStuff(channel, user, message, self); 
    } 
}); 

ответ

1

Это потому, что ваш setTimeout обработчик только создание обработчика для chat события; на самом деле это не вызов обработчика. Когда вызван обработчик? Каждый раз отправляется сообщение chat. Поэтому вместо этого установите таймаут, когда вы получите событие chat. Что-то вроде:

var handleMsg = function(channel, user, message, self) { 
    if (message === 'command') { 
    setTimeout(function() { 
     client.once('chat', handleMsg); 
    }, 5000); 
    // do stuff 
    } 
}; 

client.once('chat', handleMsg); 
+0

У меня вопрос. почему вы используете client.once? мой бот как-то работает только на моем личном канале, а не на других. При использовании client.on он каким-то образом распечатывал слишком много вещей и сам был запрещен – gempir

+0

'client.once()' является просто ярлыком для выражения «обрабатывать это событие при следующем запуске» вместо «обрабатывать это событие каждый раз» он стреляет ». Это в основном ярлык для 'client.on', с логикой для отсоединения обработчика события после первого вызова. См. Https://nodejs.org/api/events.html#events_emitter_once_event_listener. Здесь вы можете использовать 'client.on', но если это так, вам нужно поместить некоторую логику в обработчик' click', чтобы игнорировать сообщения, которые произошли до дроссель 5000MS поднят, так как теперь он будет вызываться повторно. – hacksalot

+0

в порядке, но тогда мне не имеет смысла, почему команда не будет работать с другими каналами. Как мне сделать это с помощью обработчика кликов? – gempir

Смежные вопросы