twisted - 如何将好友添加到twisted.words oscar (icq) 中的好友列表

标签 twisted icq twisted.words

我有一个小型机器人在 ICQ 上与用户通信,它使用 Twisted.Words、Oscar 协议(protocol)。我需要查看他们的在线状态,但这似乎只有当我将他们列入我的好友列表时才有可能。那么问题来了:

如何将好友添加到 Twisted.Words Oscar 中的好友列表?

这很奇怪,但 API 文档中似乎没有任何相关内容,而且我在 oscar.py 源代码中找不到任何好的线索。 :\

最佳答案

经过几个小时的查看 oscar.py 代码和 OSCAR 协议(protocol)文档后,我终于想出了一个解决方案。

所以我们开始吧。转到本例中的函数 gotBuddyList(self, l): http://twistedmatrix.com/documents/current/words/examples/oscardemo.py

您可能有自己的类似物,即收到 SSI 时调用的回调函数。它的绑定(bind)如下:

self.requestSSI().addCallback(self.gotBuddyList)

因此,在这个gotBuddyList(self, l)函数中,您可以输入以下内容:

self.groupAll = l[0][0]

就我而言,这包含我的好友列表中的第一个好友组(它是从常规 ICQ 客户端提前手动创建的)。 l 变量是从服务器接收到的 SSI,它包含您的好友组、这些组中的好友以及其他内容(例如设置等)。这是根据 OSCAR 文档得出的。

我要将我的好友添加到列表中的第一组中。如果您有自己的案例或想要创建更灵活的解决方案,则必须对此进行更多调查。

接下来,当您想要将新好友添加到好友列表时,您可以执行以下操作(假设这仍在 BOSConnection 的实现类方法之一内):

buddy = oscar.SSIBuddy(the_uin_to_add)  # put the UIN of the buddy to add in the argument
try:
    buddyID = max(self.groupAll.usersToID.itervalues()) + 1    # incrementing the buddyID
except ValueError:       # if the group is empty yet
    buddyID = 1
self.groupAll.addUser(buddyID, buddy)   # adding it to the group
self.addItemSSI(buddy)      # actually sending the stuff to the server

现在,好友已在您的列表中了。如果他在线,您将立即收到 updateBuddy 事件,其中包含有关他的在线状态等信息。

这里我不太明白buddyID是什么。没有任何信息可以解释它。但我最终认为它只是好友所在组内的一个内部 ID。它的限制为 32767。我决定从 1 开始,每次从组中最高的 ID 开始加 1。

这就是我所拥有的一切。我希望它可以帮助别人一次。如果您可以添加任何内容或纠正我,我将很高兴看到您的评论!

关于twisted - 如何将好友添加到twisted.words oscar (icq) 中的好友列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13228452/

相关文章:

python - 如何编写一个用 @defer.inlineCallbacks 装饰的方法,该方法可能会产生也可能不会产生?

twisted - 用twisted 连接两次——如何正确地做到这一点?

c++ - 当出现 icq 桌面错误时如何编辑 makefile (make : *** [all] Error 2) Ubuntu 18. 04 64 bit

c# - ICQ UIN 的正则表达式

python - 扭曲连接丢失事件

python - 在 WSGI 容器中使用扭曲的词

python - Windows 上的扭曲 stdio.StandardIO

python - 检查使用 twistd 启动的 Twisted Server 是否成功启动