1. 程式人生 > >openfire--好友管理各種狀態糾結

openfire--好友管理各種狀態糾結

好友花名冊官方解析:

ofRoster (buddy rosters or lists)Column Name Type Length Description

rosterID NUMBER n/a ID of roster (Primary Key)
username VARCHAR 32 User Name
jid
TEXT
n/a
The address of the roster entry
sub
NUMBER
n/a
The subscription status of the entry
ask
NUMBER
n/a
The ask status of the entry
recv
NUMBER
n/a
Flag indicating the entry is a roster request that was received
nick
VARCHAR
255

The nickname assigned to this roster entry


欄位的具體分析:

askstatus

-1—  沒有掛起的新增好友請求。

     The roster item has no pending subscription requests.

 0— 有掛起的新增好友請求。

     The roster item has been asked for permission to subscribe to its presence but no response has been received.

1— 估計是有沒有回覆的刪除請求吧

      The roster owner has asked the roster item to be unsubscribed from its presence notifications but hasn't yet received confi rmation.

recvstatus

-1— 已經回覆新增好友請求

       There are no subscriptions that have been received but not presented to the user.

1— 接收到好友請求但是沒有給好友回覆

       The server has received a subscribe request, but has not forwarded it to the user.

2— 估計是沒有回覆刪除請求吧

      The server has received an unsubscribe request, but has not forwarded it to the user.

substatus

-1—  應該刪除這個好友

         Indicates that the roster item should be removed.

0—  沒有建立好友關係

        No subscription is established.

1—  使用者已經發出好友請求

        The roster owner has a subscription to the roster item’s presence.

2—  收到好友請求並且加對方好友

       The roster item has a subscription to the roster owner’s presence.

3—  好友已經相互新增

       The roster item and the owner have a mutual subscription.

程式碼操作:

PacketListener myListener = new PacketListener() {      
             public void processPacket(Packet packet) {  
              if(packet instanceof Message) {
               Message message = (Message) packet;
               String type = message.getType().toString();
               if(type.equals("chat")) {
                //接收訊息
                if(message.getBody()!=null){
                 //儲存資訊到客戶端資料庫
                                     }
                }  
               }
              } else if(packet instanceof Presence) {
               Presence presence = (Presence) packet;
               String type = presence.getType().toString();
               boolean b= TalkService.this.roster.contains(packet.getFrom());
               Log.i(tag, b+"");
      
               Roster roster = connection.getRoster();
            RosterEntry rosterEntry = roster.getEntry(presence.getFrom());    
             
            String itemType="";
            
            if(rosterEntry!=null){
             Log.e(tag, "PacketListener Presence: rosterEntry.getName()= "+rosterEntry.getName()+
               " - rosterEntry.getUser()="+rosterEntry.getUser()+
               " - rosterEntry.getStatus()="+rosterEntry.getStatus()+
               "  -rosterEntry.getType()= "+rosterEntry.getType());
             itemType=rosterEntry.getType().toString();
            }
            Log.e(tag, "itemType=="+itemType);
               if(type.equals("subscribe")) {//我收到對方的加好友的請求
                //新增好友請求
                FriendRelationParam param = new FriendRelationParam();
                TalkCallback callback = new TalkCallback();
                callback.from = getUId(presence.getFrom());
                callback.to = getUId(presence.getTo());
                try {
        param.callbackStr = callback.toJsonObject().toString();
       } catch (Exception e) {
        e.printStackTrace();
       }
                param.userId = Long.parseLong(callback.to);
                param.friendUid = Long.parseLong(callback.from);
                
                startFriendRelation(param);
                
                if("none".equals(itemType)){//收到對方的加好友的請求
                 Log.i(tag, "type="+type+"  我收到對方的加好友的請求");
                }
                
                if("to".equals(itemType)){//我加對方好友後,對方同意,給我發回的交友請求
                 Log.i(tag, "type="+type+"  我加對方好友後,對方同意,給我發回的交友請求");
                }
                
                
               }else if("subscribed".equals(type)){//對方同意加我為好友 
                
                
                if("both".equals(itemType)){//雙方互為好友關係建立
                 Log.i(tag, "type="+type+"  雙方互為好友關係建立!");
                }
                
                
                Log.e("TalkService"+Thread.currentThread().getName(), presence.getFrom()+"同意了我["+packet.getTo()+"]的加好友請求 ");
               }else if(type.equals("unsubscribe")) {//對方發起了把我刪除了||或者拒絕    //拒絕的時候只會走這A
                
                if("none".equals(itemType)){//拒絕
                 Log.i(tag, "type="+type+"  我被拒絕!!!");
                }
                if("to".equals(itemType)){//我收到被對方刪除
                 Log.i(tag, "type="+type+"  我收到被對方刪除");
                }
                
                
               }else if(type.equals("unsubscribed")) {//對方把我刪除了   //刪除的時候 會走A,同時再走一次這
                
                if("none".equals(itemType)){// 我被刪除  ,雙方關係解除**************************
                 Log.i(tag, "type="+type+"  我被刪除的!!!");
                }
                
                
               }else if(type.equals("available")) {//對方告訴我他線上
//                presence = new Presence(Presence.Type.available);
//                presence.setTo(presence.getFrom());
//                connection.sendPacket(presence);
               }
               
               
              }else if(packet instanceof AuthMechanism) {
               
               
              }
              
             }      
         };