Правя бот за свързване на IRC и DC (директно свързване) заедно. Има съществуваща реализация в C++, която следя, но тя няма всички функции, които търсим.
Използвам IRC библиотека за python, която е наистина добре кодирана. Мога да регистрирам някои манипулатори за обратно извикване за различни IRC събития (по-специално получаване на публично съобщение). Тази функция за обратно извикване може да препраща към обекти, създадени в основното изпълнение на Python от нишката в IRC библиотеката.
Ето моите обратни обаждания:
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“.