我在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
我已经看过反应堆模式,观察者模式,并试图实现一百种不同的事件系统设计,但无济于事。我完全迷失了。
请提供解决方案或指出正确的方向。必须有一个简单的方法来做到这一点。
所以我所做的就是从bot的who方法中使用来自我的生成器(bot方法)的抓取消息。生成器看起来像这样:
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)))
现在机器人的方法看起来像这样:
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)
因此,当bot的who方法使用生成器接收消息时,我的SpaghettiHandler将处理的任何消息都不会被处理。
它正在工作..并且工作得足够快,很难丢失信息。但是如果我的机器人同时接受许多命令,这可能会成为一个问题。我很确定我会找到这个方向的解决方案,但我没有把它作为答案,因为我不确定它是一个好方法,即使我已经设置放弃不属于的消息听众。