Список пользователей в канале IRC с использованием инфраструктуры Twisted Python IRC - PullRequest
6 голосов
/ 13 июля 2011

Я пытаюсь написать функцию, которая будет печатать списки ников в канале IRC на канал, используя Twisted Python. Как мне это сделать? Я прочитал документацию по API и видел только один вопрос, похожий на мой, на этом сайте, но на самом деле он не отвечает на мой вопрос. Если бы я знал, как получить список пользователей (или что-то еще, что Twisted распознает как), я мог бы просто повторить список, используя цикл for, но я не знаю, как получить этот список.

1 Ответ

6 голосов
/ 15 июля 2011

Связанный пример, который вам кажется похожим, использует 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)
...