2011-07-12 45 views
6

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

+1

欺骗http://stackoverflow.com/questions/5305050/how-to-use-twisted-to-get-an-irc-channels-user-list –

+0

这不是一个骗局,我甚至提到了你关联的问题,因为这不是我想要做的,也没有帮助。 – paul

+0

这实际上是另一个问题的一个重复;我很好奇你为什么认为它不是。 – Glyph

回答

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)