2012-11-05 31 views
2

我有一個小型的機器人與ICQ上的用戶進行通信,它使用Twisted.Words,Oscar協議。我需要查看他們的在線狀態,但這似乎只有當我把它們放在我的好友列表中時纔有可能。所以問題來了:如何添加好友列表中的twisted.words奧斯卡(icq)

如何向Twisted.Words奧斯卡中的好友列表中添加好友?

這很奇怪,但在API文檔中似乎沒有任何關於它的信息,我在oscar.py源代碼中找不到任何好的線索。 :\

回答

2

最後我想出了一個解決方案,經過數小時查看oscar.py的代碼和OSCAR協議文檔。

所以,我們走吧。轉至功能gotBuddyList(個體經營,L)在這個例子: http://twistedmatrix.com/documents/current/words/examples/oscardemo.py

你可能有自己的模擬,這是在接收到SSI時調用回調函數。它必然是這樣的:

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

所以這gotBuddyList(個體經營,L)的內部函數,你把這個:

self.groupAll = l[0][0] 

在我而言,這包含在我的好友列表中的第一個好友組(這是從常規的ICQ客戶端預先手動創建)。變量是從服務器接收到的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。

就是這樣。我希望它能幫助別人一次。如果你能添加任何東西或糾正我,我會很高興看到你的意見!