在查看 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。
这就是我的全部。我希望它可以帮助某人一次。如果您可以添加任何内容或纠正我,我会很高兴看到您的 cmets!