我已经用 Python 制作了一个 IRC 机器人,并且我一直在尝试找出一种方法来等待 IRC 命令并将消息返回给调用函数一段时间。出于各种原因,我拒绝使用外部库,包括我试图学习从头开始制作这些东西。另外,我一直在筛选现有文档的文档,它们太全面了。我正在尝试做一个简单的。
例如:
def who(bot, nick):
bot.send('WHO %s' % nick)
response = ResponseWaiter('352') # 352 - RPL_WHOREPLY
return response.msg
将返回我的 Message 类的一个对象,该对象将 IRC 消息解析到调用函数:
def check_host(bot, nick, host):
who_info = who(bot, nick)
if who_info.host == host:
return True
return False
我查看了反应器模式、观察者模式,并尝试为此实现一百种不同的事件系统设计,但均无济于事。我完全迷路了。
请提供解决方案或为我指明正确的方向。必须有一个简单的方法来做到这一点。
所以我所做的是使用我的生成器(一个机器人方法)从机器人的 who 方法获取消息。生成器如下所示:
def msg_generator(self):
''' Provides messages until bot dies '''
while self.alive:
for msg in self.irc.recv(self.buffer).split(('\r\n').encode()):
if len(msg) > 3:
try: yield Message(msg.decode())
except Exception as e:
self.log('%s %s\n' % (except_str, str(e)))
现在机器人的 who 方法如下所示:
def who(self, nick):
self.send('WHO %s' % nick)
for msg in self.msg_generator():
if msg.command == '352':
return msg
但是,它现在正在控制消息,因此我需要某种方式将我不用于 who 方法的消息放弃给相应的处理程序。
我的机器人通常使用以下方式处理所有消息:
def handle(self):
for msg in self.msg_generator():
self.log('◀ %s' % (msg))
SpaghettiHandler(self, msg)
因此,当机器人的 who 方法使用生成器接收消息时,我的 SpaghettiHandler 将处理的任何消息都不会被处理。
它正在工作......并且工作速度足够快,很难丢失消息。但是,如果我的机器人要同时执行许多命令,这可能会成为一个问题。我很确定我会在这个方向找到解决方案,但我没有创建这个作为答案,因为我不确定这是一个好方法,即使我将它设置为放弃不相关的消息给听众。