最後に、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 の実装クラス メソッドの 1 つにあると仮定します)。
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 ずつ増加させることにしました。
私が持っているのはそれだけです。一度誰かの役に立てば幸いです。何か追加したり、私を修正したりできる場合は、コメントをお待ちしております。