我的建议是重组你的代码以使用模块化的MessageHandler 类,每个类都可以处理特定类型的消息(即有一个single responsibility),机器人的整体行为由这些类型和顺序决定chain of responsibility 中的消息处理程序:
除了其他几个好处之外,这可以轻松实现命令调用之间的冷却时间(在下面的实现中,您可以为不同类型的消息自定义不同的持续时间冷却时间)。
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...