2017-01-27 4 views
0

私はPthonを使ってTwitch Botを作っています。私はコマンドにクールダウンを作成して、コマンドを毎(x)秒だけ呼び出すことができます。 例:Python Twitch Botのコマンドクール

Rustie: test 
Bot: Testing command 
*Imediately after* 
Rustie: test 
*5 seconds later* 
Rustie: test 
Bot: Testing command 

(また、私は、私は他のコマンドを使用することはできませんその時にようtime.sleepを取り除きたい)私はこのコードを試してみましたが、それは動作しません:

used = [] 
if "test" in message: 
    if "test" in used: 
     time.sleep(5) 
     del(used[:]) 
    else: 
     sendMessage(s, "Testing command") 
     used.append("test") 

    break 

答えて

0

各コマンドの最後の呼び出し以降に経過した時間を記録する必要があります。これはtimeモジュールで行うことができます。私のアドバイスは、ボットの全体的な動作は、これらの種類や順序によって決定されると、各メッセージの特定のタイプを扱うことができるモジュラーMessageHandlerクラス(すなわちsingle responsibilityを持っている)を使用するようにコードを再構築することです

import time 

min_call_freq = 5 
used = {} 

def call_command(command): 
    print('Calling command `%s`.' % command) 
    # do whatever 

def cooldown(command): 
    print('You have used command `%s` in the last %u seconds.' % (command, min_call_freq)) 

def process_command(command): 
    if (
     command not in used or 
     time.time() - used[command] > min_call_freq 
    ): 
     used[command] = time.time() 
     call_command(command) 
    else: 
     cooldown(command) 
1

chain of responsibility内のメッセージハンドラ:いくつかの他の利点の中で

、このは実装ベロにコマンド呼び出し(間cooldownsを実装することが容易になりますw、メッセージの種類ごとに異なる継続時間のカスタマイズをカスタマイズできます)。

from abc import ABC, abstractmethod 

from datetime import datetime, timedelta 
from time import sleep 


class MessageHandler(ABC): 
    def __init__(self, command_cooldown): 
     self._command_cooldown = command_cooldown 
     self._last_command_usage = datetime.min 

    def try_handle_message(self, message): 
     if self._can_handle_message(message) and not self.__on_cooldown: 
      self._last_command_usage = datetime.now() 
      return self._handle_message(message) 
     else: 
      return None 

    @property 
    def __on_cooldown(self): 
     return datetime.now() - self._last_command_usage <= self._command_cooldown 

    @abstractmethod 
    def _can_handle_message(self, s): 
     pass 

    @abstractmethod 
    def _handle_message(self, s): 
     pass 


class TestMessageHandler(MessageHandler): 
    def __init__(self): 
     super().__init__(timedelta(seconds=5)) 

    def _can_handle_message(self, s): 
     return 'test' in s 

    def _handle_message(self, s): 
     return 'Testing command' 


class Bot(object): 
    def __init__(self): 
     self._message_handlers = [TestMessageHandler()] 

    def receive_message(self, message): 
     print('Received:', message) 
     for message_handler in self._message_handlers: 
      response = message_handler.try_handle_message(message) 
      if response: 
       self.send_response(response) 

    def send_response(self, response): 
     print('Responding:', response) 


if __name__ == '__main__': 
    bot = Bot() 
    bot.receive_message('test') 

    for i in range(6): 
     bot.receive_message('test') 
     print('Sleep 1 second...') 
     sleep(1) 

出力

Received: test 
Responding: Testing command 
Received: test 
Sleep 1 second... 
Received: test 
Sleep 1 second... 
Received: test 
Sleep 1 second... 
Received: test 
Sleep 1 second... 
Received: test 
Sleep 1 second... 
Received: test 
Responding: Testing command 
Sleep 1 second... 
関連する問題