在Twisted,Oscar中从外部事件处理程序发送ICQ消息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Twisted,Oscar中从外部事件处理程序发送ICQ消息相关的知识,希望对你有一定的参考价值。
我正在为一项服务制作一个ICQ(和潜在的XMPP)机器人,它应该发送和接收来自用户的消息。
我正在使用Python和Twisted。我从官方文档的例子开始(这一个:http://twistedmatrix.com/documents/current/words/examples/oscardemo.py)
到目前为止,我成功接收并处理来自ICQ联系人的消息。现在我需要发送消息,但不是回复他们的消息或某些事件。我需要使用事件处理程序从课外向Oscar发送消息(用于ICQ消息传递的Twisted)。我怎么做?
我很感激任何帮助,因为我没有谷歌任何有用的东西,没有那么多关于使用奥斯卡在那里。
答案
当你连接
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)
另一答案
没有“内部”或“外部”。编程中的遏制隐喻是一个主要是破坏性的隐喻。你最好忘掉它。
考虑这个课程:
class Foo(object):
def bar(self):
return "Foo.bar says hello"
def baz(self):
print self.bar()
给定一个名为Foo
的aFoo
实例,请考虑以下两种使用方法:
aFoo.baz()
print aFoo.bar()
这两种用途的行为有何不同?没有一个,但有一个叫“内部”栏,一个叫“外面”栏。遏制隐喻在这里毫无用处且无关紧要,没有根据调用函数的“where”而改变。
以上是关于在Twisted,Oscar中从外部事件处理程序发送ICQ消息的主要内容,如果未能解决你的问题,请参考以下文章