[英]Python: Twisted: How to access a list from a callback
我已經使用此處的信息作為指導編寫了一些代碼,
使用Twisted Python IRC框架列出IRC頻道中的用戶
我可以成功地將NAMES列表登錄到控制台,但是到目前為止,我仍然無法檢索該列表以進一步使用它。 這是與此事件相關的代碼的摘錄:
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)
我要實現的是在has_op函數中保留所謂的昵稱列表。 到目前為止,我一直無法使用試錯法來執行此操作,在該方法中,我嘗試在合理的位置使用print和return語句,但這並沒有產生任何輸出或實例/屬性錯誤。 顯然,我很茫然,我確實需要一些指導。
在has_op
之內執行此操作的想法可能會阻止您取得進展。
使它完全起作用,然后考慮如何改善實施因素。
請注意, get_names
已經具有您感興趣的數據。 您想如何處理這些信息? 檢查是否包含特定名稱? 為此,您需要知道要考慮的名稱。 為此,您可以使用Deferred.addCallback
功能,該功能可以將額外的參數傳遞給回調:
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)
現在,也許您真正想要的不是記錄此信息,而是在change_mode
基於該信息做出決定(當然,我只是在猜測)。
如果是這樣,那么您想利用另一個Deferred
功能-附加到Deferred
的每個回調處理和更改Deferred
結果的能力。
您可以更改has_op
以便除了記錄信息外,它還返回Deferred
但是,如果給定用戶在給定通道中具有op,則此Deferred
可以具有True
結果,而沒有給他們提供False
結果。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.