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,考虑以下两种使用方式:

aFoo.baz()
print aFoo.bar()

这两种用途的行为有什么区别?没有一个,但有一个来自“内部”的呼叫栏和一个来自“外部”的呼叫栏。包含隐喻在这里是无用且不相关的,不会根据调用函数的“位置”而改变。

于 2012-09-03T11:17:19.123 回答
1

当你连接

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

添加 a Deferred,将在连接完成时调用:

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 回答