2013-10-11 4 views
0

내가 가이드 라인으로 여기에 정보를 사용하여 몇 가지 코드를 작성했습니다에서 목록에 액세스 할파이썬 : 트위스트 : 콜백

List users in IRC channel using Twisted Python IRC framework

내가 성공적으로 콘솔에 이름 목록을 로그인 할 수있는 방법 그러나 지금까지는 더 이상 작동하지 않기 위해 을 검색 할 수 없었습니다.

class Alfred(irc.IRCClient): 
    """ An IRC bot """ 

    # Voodoo magic for names 
    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] 

    # End of voodoo magic 

    def get_names(self, nicklist): 
     # Log the output to the log 
     log.msg(nicklist) 


    def has_op(self, channel, user): 
     self.names('#' + channel).addCallback(self.get_names) 


    def change_mode(self, channel, user, msg): 
     target = msg[5:-3] 
     params = [channel, '+o'] 

     self.has_op(channel, user) 
     self.mode(channel, True, '+o', user=target) 

내가 달성하고자하는 소위 nicklist의 보류를 얻을 has_op 함수 내이다 : 다음은이 문제와 관련된 코드의 발췌 한 것입니다. 지금까지 나는 시행 착오 접근법을 사용하여이를 수행 할 수 없었습니다. 합리적인 장소에서 print 및 return 문을 사용하려고 시도했지만 어디에서 이렇게 또는 인스턴스/속성 오류가 출력되지 않았습니까? 분명히, 나는 잃어 버렸고, 나는 약간의 지침이 정말로 필요하다.

답변

1

"within"has_op을 수행하면 작업이 진행되지 않을 가능성이 있습니다.

에 모두을 적용한 다음 구현 팩토리링을 개선 할 수있는 방법을 고려해보십시오.

get_names에는 이미 관심이있는 데이터가 있습니다. 그 정보로 무엇을하고 싶니? 특정 이름이 포함되어 있는지 확인하십시오. 이를 위해서는 어떤 이름을 고려해야하는지 알아야합니다. 그것을 기반으로 결정을 내려야하지만,이 정보를 기록 할

def get_names(self, nicklist, user): 
    if user in nicklist: 
     log.msg("%r has op!" % (user,)) 

def has_op(self, channel, user): 
    self.names('#' + channel).addCallback(self.get_names, user) 

지금 당신이 정말로 원하는 아마도 무엇되지 않은 :이 작업을 수행하려면, 당신은 당신이 콜백에 추가 인수를 전달할 수 있습니다 Deferred.addCallback의 기능을 사용할 수 있습니다 change_mode (나는 단지 추측하고있다).

Deferred 기능을 사용하려면 Deferred에 연결된 각 콜백의 기능을 처리하고 Deferred의 결과를 변경하는 기능이 필요합니다.

당신은 그 대신도 Deferred을 반환 로깅 정보를 너무 has_op을 변경할 수 있습니다 -하지만 주어진 사용자가 주어진 채널에서 연산을 가지고 있으며, 그들의 False 결과가없는 경우이 DeferredTrue 결과를 가질 수있다.

def get_names(self, nicklist, user): 
    return user in nicklist 

def has_op(self, channel, user): 
    return self.names('#' + channel).addCallback(self.get_names, user) 

이제 change_mode에서이 기능을 사용할 수 있습니다

def change_mode(self, channel, user, msg): 
    target = msg[5:-3] 

    checking = self.has_op(channel, user) 
    checking.addCallback(self._ofIfNotOp, channel, target) 

def _opIfNotOp(self, isOp, channel, user): 
    if not isOp: 
     self.mode(channel, True, '+o', user=user) 
+0

덕분에,이 정말로 도움이되었다. 이것에서 나는 기초를 놓을 수있다 나는 앞으로 일하기를 계속할 필요가있다 그래서 건배! 나의 의도를 밝혀내는 명성, 즉 내 의도는 무엇인지. –