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

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

我有一个小型机器人在ICQ上与用户沟通,它使用的是Twisted.Words,Oscar协议。我需要看到他们的在线状态,但这似乎只有在我的好友列表中才有可能。所以这里有一个问题:

如何在Twisted.Words Oscar中为好友列表添加好友?

这很奇怪,但在API文档中似乎没有任何关于它的东西,我在oscar.py源代码中找不到任何好的线索。 :\

twisted icq twisted.words
1个回答
2
投票

最后,我想出了一个解决方案,看了几个小时的oscar.py代码和OSCAR协议文档。

所以我们走了。在这个例子中转到函数gotBuddyList(self,l):http://twistedmatrix.com/documents/current/words/examples/oscardemo.py

你可能有自己的模拟,这是收到SSI时调用的回调函数。它的约束如下:

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开始,每次从组中的最高位增加1。

这就是我的全部。我希望它可以帮助一次。如果您可以添加任何内容或更正我,我将很高兴看到您的意见!

热门问题
推荐问题
最新问题