0

IRCとDC(ダイレクトコネクト)を連携させるボットを作っています。私がフォローしているC++の既存の実装がありますが、私たちが求めているすべての機能を備えているわけではありません。

私は非常によくコーディングされたPython用のIRCライブラリを使用しています。さまざまな 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 ライブラリを変更してこれらのイベントを生成する方法がわかりません。

主な関心点は、ハブクライアントを参照するコールバックの機能です。これは、メインの 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」の宣言を追加しました。

4

2 に答える 2

1

ircConnectionサードパーティのモジュールだと思います。global nameそして、そのモジュールを単純にインポートすると、 ircConnectionのこのエラーが解決される場合がありますis not definedimport ircConnectionメインモジュールで試してください

于 2013-06-24T11:41:56.707 に答える
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)
于 2016-07-03T16:42:04.460 に答える