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

时间:2011-07-12 21:50:30

标签: python twisted irc

我正在尝试编写一个函数,它将使用Twisted Python将IRC通道中的缺刻列表打印到通道。我该怎么做呢?我已经阅读了API文档,我在本网站上只看到过与我类似的一个问题,但它并没有真正回答我的问题。如果我知道如何获取用户列表(或者Twisted认为它是什么),我可以简单地使用for循环迭代列表,但我不知道如何获取此列表。

1 个答案:

答案 0 :(得分:6)

您似乎认为的链接示例是相同的,使用WHO,不同的命令,不同的目的。正确的方法是使用NAMES

扩展IRCClient以支持名称命令。

from twisted.words.protocols import irc
from twisted.internet import defer

class NamesIRCClient(irc.IRCClient):
    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]

示例:

def got_names(nicklist):
    log.msg(nicklist)
self.names("#some channel").addCallback(got_names)