2011-07-12 11 views
6

Estoy tratando de escribir una función que imprima las listas de nicks en un canal IRC al canal usando Twisted Python. ¿Cómo hago esto? He leído la documentación de la API y solo he visto una pregunta similar a la mía en este sitio, pero realmente no responde mi pregunta. Si supiera cómo obtener la lista de usuarios (o lo que sea que Twisted lo reconozca), podría simplemente iterar la lista usando un ciclo for, pero no sé cómo obtener esta lista.Lista de usuarios en el canal IRC usando Twisted Python IRC framework

+1

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

+0

Esto no es una tontería, incluso mencioné esa pregunta que vinculó en cuestión, porque NO ES lo que estoy tratando de hacer y NO es útil. – paul

+0

De hecho, es una dupla de esa otra pregunta; Tengo curiosidad por qué piensas que no es así. – Glyph

Respuesta

6

El ejemplo vinculado que parece pensar es el mismo, usa WHO, comando diferente, propósito diferente. La forma correcta es usar NAMES.

IRCClient extendido para admitir un comando de nombres.

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] 

Ejemplo:

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