0

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

它正在工作......并且工作速度足够快,很难丢失消息。但是,如果我的机器人要同时执行许多命令,这可能会成为一个问题。我很确定我会在这个方向找到解决方案,但我没有创建这个作为答案,因为我不确定这是一个好方法,即使我将它设置为放弃不相关的消息给听众。

4

0 回答 0