等待IRC中的特定服务器响应命令代码

时间:2013-10-14 10:40:15

标签: python events irc

我在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将处理的任何消息都不会被处理。

它正在工作..并且工作得足够快,很难丢失信息。但是如果我的机器人同时接受许多命令,这可能会成为一个问题。我很确定我会找到这个方向的解决方案,但我没有把它作为答案,因为我不确定它是一个好方法,即使我已经设置放弃不属于的消息听众。

0 个答案:

没有答案