在Twisted,Oscar中从外部事件处理程序发送ICQ消息

问题描述 投票:2回答:2

我正在为一项服务制作一个ICQ(和潜在的XMPP)机器人,它应该发送和接收来自用户的消息。

我正在使用Python和Twisted。我从官方文档的例子开始(这一个:http://twistedmatrix.com/documents/current/words/examples/oscardemo.py

到目前为止,我成功接收并处理来自ICQ联系人的消息。现在我需要发送消息,但不是回复他们的消息或某些事件。我需要使用事件处理程序从课外向Oscar发送消息(用于ICQ消息传递的Twisted)。我怎么做?

我很感激任何帮助,因为我没有谷歌任何有用的东西,没有那么多关于使用奥斯卡在那里。

python twisted oscar-protocol
2个回答
1
投票

当你连接

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

添加一个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)

1
投票

没有“内部”或“外部”。编程中的遏制隐喻是一个主要是破坏性的隐喻。你最好忘掉它。

考虑这个课程:

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

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

给定一个名为FooaFoo实例,请考虑以下两种使用方法:

aFoo.baz()
print aFoo.bar()

这两种用途的行为有何不同?没有一个,但有一个叫“内部”栏,一个叫“外面”栏。遏制隐喻在这里毫无用处且无关紧要,没有根据调用函数的“where”而改变。

© www.soinside.com 2019 - 2024. All rights reserved.