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

6 投票
1 回答
3822 浏览
提问于 2025-04-16 21:23

我正在尝试写一个函数,用来在IRC频道中打印出昵称列表,使用的是Twisted Python。请问我该怎么做呢?我看过API文档,只在这个网站上看到过一个和我问题相似的提问,但并没有真正解答我的疑问。如果我知道怎么获取用户列表(或者Twisted把它称作别的什么),我就可以用一个for循环来遍历这个列表,但我不知道怎么获取这个列表。

1 个回答

6

你提到的那个链接示例看起来和你想的一样,但它使用的是 WHO 命令,这个命令和你要的不同,目的也不一样。正确的做法是使用 NAMES 命令。

扩展了 IRCClient,以支持 names 命令。

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)

撰写回答