我正在做一個bot來將IRC和DC(直接連接)連接在一起。我一直在使用C++中的一個現有實現,但它沒有包含我們之後的所有功能。python中的回調函數和事件
我正在使用一個IRC庫python這是真正好編碼。我可以爲各種IRC事件(特別是接收公共消息)註冊一些回調處理程序。這個回調函數能夠從IRC庫中的線程引用在主python執行中創建的對象。
這裏是我的回調:
def on_connect(connection, event):
connection.join(ircSettings['channel'])
def on_disconnect(connection, event):
sys.exit()
def on_pubmsg(connection, event):
hubClient.sendMessage(event.source.split('!')[0] + ': ' + event.arguments[0])
這裏就是我如何設置它們:
# Create the IRC client
ircClient = irc.client.IRC()
try:
ircConnection = ircClient.server().connect(ircSettings['server'], ircSettin$
except irc.client.ServerConnectionError, x:
print x
sys.exit()
# Set the IRC event handlers
ircConnection.add_global_handler("welcome", on_connect)
ircConnection.add_global_handler("pubmsg", on_pubmsg)
ircConnection.add_global_handler("disconnect", on_disconnect)
我真的很喜歡這個解決方案,因爲它使一個非常整潔的代碼(尤其是在這個例子中) 。但是,我不知道如何修改我的DC庫來生成這些事件。
感興趣的主要點是回調的引用hubClient,這是在主要的Python程序創建的,像這樣的能力:
# Create the DC client
hubClient = DC.DirectConnect(dcSettings)
hubClient.connect(dcSettings['hub'])
最初,我通過一個函數指針,以我的DC庫運行時收到一條消息:
def messageHandler(nick, msg):
if nick is not ircSettings['nick']:
ircConnection.privmsg(ircSettings['channel'], nick + ': ' + msg)
dcSettings = {
'nick': 'dans_bot',
'sharesize': 10*1024**3, # 10GB
'ip': '0.0.0.0', # XXX: This might not matter, but needed for library
'hub': ('192.168.1.129', 411),
'handler': messageHandler
}
但我得到的錯誤:
NameError: global name 'ircConnection' is not defined
如何設置我的DC客戶端以我仍然可以引用這些本地(到主執行)對象的方式創建回調?
編輯:我添加了'ircConnection'聲明。
我編輯了我的帖子以顯示如何聲明ircConnection。 – dantheman