0

我已经使用此处的信息作为指导线编写了一些代码,

使用 Twisted Python IRC 框架列出 IRC 频道中的用户

我可以成功地将 NAMES 列表记录到控制台,但是到目前为止我无法检索它以进一步使用它。以下是与此问题相关的代码摘录:

class Alfred(irc.IRCClient):
    """ An IRC bot """

    # Voodoo magic for names
    def __init__(self, *args, **kwargs):
        self._namescallback = {}


    def names(self, channel):
        channel = channel.lower()
        d = defer.Deferred()
        if channel not in self._namescallback:
           self. _namescallback[channel] = ([], [])

        self._namescallback[channel][0].append(d)
        self.sendLine("NAMES %s" % channel)
        return d


    def irc_RPL_NAMREPLY(self, prefix, params):
        channel = params[2].lower()
        nicklist = params[3].split(' ')

        if channel not in self._namescallback:
            return

        n = self._namescallback[channel][1]
        n += nicklist


    def irc_RPL_ENDOFNAMES(self, prefix, params):
        channel = params[1].lower()
        if channel not in self._namescallback:
            return

        callbacks, namelist = self._namescallback[channel]

        for cb in callbacks:
            cb.callback(namelist)

        del self._namescallback[channel]

    # End of voodoo magic

    def get_names(self, nicklist):
        # Log the output to the log
        log.msg(nicklist)


    def has_op(self, channel, user):
        self.names('#' + channel).addCallback(self.get_names)


    def change_mode(self, channel, user, msg):
        target = msg[5:-3]
        params = [channel, '+o']

        self.has_op(channel, user)
        self.mode(channel, True, '+o', user=target)

我想要实现的是在 has_op 函数中获取所谓的昵称列表。到目前为止,我一直无法使用试错法来做到这一点,我尝试在合理的地方使用 print 和 return 语句,但这并没有产生任何输出或实例/属性错误。显然,我很茫然,我真的需要一些指导。

4

1 回答 1

1

在“内部”执行此操作的想法has_op可能会阻止您取得进展。

让它发挥作用然后考虑如何改进实现的分解。

请注意,它get_names已经包含您感兴趣的数据。你想用这些信息做什么?检查它是否包含某个名称?为此,您需要知道您正在考虑使用哪个名称。为此,您可以使用该功能Deferred.addCallback,让您将额外的参数传递给回调:

def get_names(self, nicklist, user):
    if user in nicklist:
        log.msg("%r has op!" % (user,))

def has_op(self, channel, user):
    self.names('#' + channel).addCallback(self.get_names, user)

现在,也许您真正想要的不是记录这些信息,而是根据它做出决定change_mode(当然,我只是猜测)。

如果是这样,那么您想利用另一个Deferred功能 - 每个附加到 a 的回调Deferred处理和更改Deferred.

您可以进行更改has_op,以便它还返回 a Deferred-而不是记录信息,但如果给定用户在给定频道中有操作并且他们没有结果,这Deferred可能会产生结果。TrueFalse

def get_names(self, nicklist, user):
    return user in nicklist

def has_op(self, channel, user):
    return self.names('#' + channel).addCallback(self.get_names, user)

现在您可以在以下位置使用此功能change_mode

def change_mode(self, channel, user, msg):
    target = msg[5:-3]

    checking = self.has_op(channel, user)
    checking.addCallback(self._ofIfNotOp, channel, target)

def _opIfNotOp(self, isOp, channel, user):
    if not isOp:
        self.mode(channel, True, '+o', user=user)
于 2013-10-12T10:21:23.880 回答