2

ユーザーからのメッセージを送受信するサービス用の ICQ (および XMPP も検討中) ボットを作成しています。

Python と Twisted を使用しています。公式ドキュメントの例から始めました (これ: http://twistedmatrix.com/documents/current/words/examples/oscardemo.py )

これまでのところ、ICQ 連絡先からのメッセージを正常に受信して処理しています。メッセージを送信する必要がありますが、メッセージやイベントへの応答ではありません。イベント ハンドラを使用して、クラスの外部から Oscar (Twisted の ICQ メッセージング用のもの) でメッセージを送信する必要があります。それ、どうやったら出来るの?

Oscar を使用することについてはそれほど多くはありません。

4

2 に答える 2

1

「内」も「外」もありません。プログラミングにおける封じ込めの比喩は、ほとんどが有害なものです。忘れた方がいいですよ。

このクラスを考えてみましょう:

class Foo(object):
    def bar(self):
        return "Foo.bar says hello"

    def baz(self):
        print self.bar()

Foonamedのインスタンスが与えられた場合、aFoo次の 2 つの使用方法を検討してください。

aFoo.baz()
print aFoo.bar()

これら 2 つの用途の動作の違いは何ですか? 1つではありませんが、1つは「内側」からバーを呼び出し、もう1つは「外側」からバーを呼び出します。封じ込めの比喩はここでは役に立たず、無関係です。関数が呼び出された「場所」に基づいて何も変化しません。

于 2012-09-03T11:17:19.123 に答える
1

接続時

protocol.ClientCreator(reactor, OA, SN, PASS, icq=icqMode).connectTCP(*hostport)

Deferred接続が完了したときに呼び出されるa を追加します。

oscar_prot = None

def get_B_instance(b_instance):
    global oscar_prot
    oscar_prot = b_instance

d = Deferred()
d.addCallback(get_B_instance)

protocol.ClientCreator(reactor, OA, SN, PASS, deferred=d, icq=icqMode).connectTCP(*hostport)

関数ではget_B_instance、プロトコル クラスのインスタンスへの参照を保持できます。

sendMessage次に、そのインスタンスを呼び出すだけです。

oscar_prot.sendMessage(username, message)
于 2012-09-03T12:21:29.547 に答える