2013-06-24 64 views
0

我正在做一個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'聲明。

回答

1

我想ircConnection是第三方模塊。並且該模塊的簡單導入可以解決此錯誤:global name ircConnection is not defined。在你的主模塊中試試import ircConnection

+0

我編輯了我的帖子以顯示如何聲明ircConnection。 – dantheman

0

你的代碼中唯一的問題是ircConnection的引用是第一次出現在try-except塊內,如果失敗,那麼這個var將是None。在嘗試之前只寫ircConnection = None

# Create the IRC client 
ircClient = irc.client.IRC() 
ircConnection = None 
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)