我正在制作机器人将IRC和DC(直接连接)连接在一起。我一直在使用C ++中的现有实现,但它没有我们追求的所有功能。
我正在使用一个非常好的编码的python的IRC库。我可以为各种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的能力,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'的声明。
答案 0 :(得分:1)
我认为ircConnection
是第三方模块。简单导入该模块可以解决global name
ircConnection is not defined
的错误。在主模块中尝试import ircConnection
答案 1 :(得分: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)