2011-07-12 38 views
6

Tôi đang cố gắng viết một hàm sẽ in danh sách các nút trong kênh IRC tới kênh bằng cách sử dụng Twisted Python. Làm thế nào để tôi làm điều này? Tôi đã đọc tài liệu API và tôi chỉ thấy một câu hỏi tương tự với câu hỏi của tôi trên trang web này, nhưng nó không thực sự trả lời câu hỏi của tôi. Nếu tôi biết làm thế nào để có được danh sách người dùng (hoặc bất cứ điều gì nó được Twisted nhận ra nó như), tôi chỉ đơn giản có thể lặp lại danh sách bằng cách sử dụng một vòng lặp for, nhưng tôi không biết làm thế nào để có được danh sách này.Liệt kê người dùng trong kênh IRC bằng cách sử dụng khung IRC Xoắn Python

+1

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

+0

Đây không phải là một sự lừa dối, tôi thậm chí đã đề cập đến câu hỏi mà bạn đã liên kết được đề cập, bởi vì nó KHÔNG phải là điều tôi đang cố gắng làm và KHÔNG hữu ích. – paul

+0

Đó là trong thực tế là một dup của câu hỏi khác; Tôi tò mò tại sao bạn nghĩ rằng nó không phải là. – Glyph

Trả lời

6

Ví dụ được liên kết mà bạn cho là giống nhau, sử dụng WHO, lệnh khác nhau, mục đích khác nhau. Cách chính xác là sử dụng NAMES.

Mở rộng IRCClient để hỗ trợ lệnh tên.

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] 

Ví dụ:

def got_names(nicklist): 
    log.msg(nicklist) 
self.names("#some channel").addCallback(got_names) 
Các vấn đề liên quan