在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()

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

aFoo.baz()
print aFoo.bar()

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

以上是关于在Twisted,Oscar中从外部事件处理程序发送ICQ消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在twisted.words oscar(icq)中将伙伴添加到好友列表

如何在 xcode 中从控制器外部更新视图

在 Windows 服务中从事件处理程序启动计时器

STM32外部中断

8.Twisted 多线程

C#里事件和委托有啥区别啊??