2014-08-29 68 views
2

我必須從Google Talk中爲我與之交談的特定客戶端(朋友/ XMPP客戶端)檢索離線消息。從Java Google Talk中檢索離線消息和聊天記錄

此外,我想檢索聊天記錄。

現在,我正在使用哈希映射來跟蹤對話並且無法獲得離線消息。

我已經與「talk.google.com」建立了XMPP連接。我目前能夠通過我的控制檯向客戶端發送消息。我已經實現了消息監聽器接口,因此可以在我的控制檯本身中接收消息。

我有另一個實現(使用OfflineMessageManager),我試圖提取離線消息標題作爲開始,不幸的是,它與空異常失敗。

我已經使用了smack-tcp版本4.0.3和smackx 3.1.0。

請在下面找到我曾嘗試到現在......

工作實現:

公共類StartChatImpl實現爲startChat,消息監聽{

static XMPPConnection myXMPPConnection; 
static ArrayList<String> myFriends = new ArrayList<String>(); 
ArrayList<Msg> messages; 
HashMap<String,ArrayList> conversation = new HashMap<String, ArrayList>(); 

OfflineMessageManager offlineMessages; 


@Override 
public void engageChat(ChatRequest chatRequest) throws XMPPException { 


    ConnectionConfiguration config = new ConnectionConfiguration("talk.google.com", 5222, "gmail.com"); 
    //config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
    config.setSendPresence(true); 
    myXMPPConnection = new XMPPTCPConnection(config); 


    try{ 

     System.out.println("Connecting to talk.google.com"); 
     myXMPPConnection.connect(); 

     System.out.println("Logging you in..."); 
     myXMPPConnection.login(chatRequest.getUsername(),chatRequest.getPassword()); 

     Presence pres = new Presence(Presence.Type.unavailable); 

     myXMPPConnection.sendPacket(pres); 

     offlineMessages = new OfflineMessageManager(myXMPPConnection); 

     System.out.println("You have been successfully connected."); 

    } catch (SmackException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


} 

public void send (String message, String to) throws XMPPException 
{ 
    Chat chat = ChatManager.getInstanceFor(myXMPPConnection).createChat(to, this); 
    //System.out.println("********************************************"); 
    //System.out.println("CHAT ID: "+ chat.getThreadID()); 
    //System.out.println("Participant: "+chat.getParticipant()); 
    //System.out.println("********************************************"); 

    try { 
     chat.sendMessage(message); 

     String friendName = myXMPPConnection.getRoster().getEntry(chat.getParticipant()).getName(); 

     if(conversation.containsKey(friendName)) 
     { 

      messages = conversation.get(friendName); 
      Calendar calendar = Calendar.getInstance(); 
      java.util.Date now = calendar.getTime(); 
      java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime()); 
      message = "bot says: "+message; 
      Msg actualMsg = new Msg(currentTimestamp,message,"bot"); 
      messages.add(actualMsg); 
      //messages.add("bot says: "+message); 

     } 
     else 
     { 
      messages = new ArrayList<Msg>(); 
      //messages.add("Bot initiated the conversation on: "+new Date()); 
      //messages.add("bot says: "+message); 
      Calendar calendar = Calendar.getInstance(); 
      java.util.Date now = calendar.getTime(); 
      java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime()); 
      message = "bot says: "+message; 
      Msg actualMsg = new Msg(currentTimestamp,message,"bot"); 
      messages.add(actualMsg); 
      conversation.put(friendName,messages); 
     } 
    } catch (SmackException.NotConnectedException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("You said "+"'"+message+"'"+" to "+myXMPPConnection.getRoster().getEntry(chat.getParticipant()).getName()); 

} 

PacketListener myPacketListener = new PacketListener() { 
    @Override 
    public void processPacket(Packet p) { 
     if (p instanceof Message) { 
      Message msg = (Message) p; 
     } 
    } 


}; 

public void displayMyFriends() 
{ 
    Roster roster = myXMPPConnection.getRoster(); 
    Collection entries = roster.getEntries(); 
    System.out.println("You currently have: "+entries.size()+" friends available to chat."); 

    int counter = 0; 
    Iterator i = entries.iterator(); 

    while(i.hasNext()) 
    { 
     RosterEntry r = (RosterEntry) i.next(); 
     Presence.Type entryPresence; 
     entryPresence = roster.getPresence(r.getUser()).getType(); 
     System.out.println((counter+1)+" . "+r.getName() +" is "+entryPresence); 
     //System.out.println("id:..."+r.getUser()); 
     myFriends.add(r.getUser()); 
     counter++; 
    } 
} 

public void disconnectMe() 
{ 
    try { 
     System.out.println("Disconnection in progress..."); 
     myXMPPConnection.disconnect(); 
     System.out.println("You have been successfully disconnected."); 
    } catch (SmackException.NotConnectedException e) { 
     e.printStackTrace(); 
    } 
} 


@Override 
public void processMessage(Chat chat, Message message) 
{ 
    if((message.getType() == Message.Type.chat) && (message.getBody()!= null)) { 


     System.out.println(myXMPPConnection.getRoster().getEntry(chat.getParticipant()).getName() + " says: " + message.getBody()); 

     String myMsg = myXMPPConnection.getRoster().getEntry(chat.getParticipant()).getName() + " says: " + message.getBody(); 

     Calendar calendar = Calendar.getInstance(); 
     java.util.Date now = calendar.getTime(); 
     java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime()); 

     Msg actualMsg = new Msg(currentTimestamp,myMsg,"customer"); 

     conversation.get(myXMPPConnection.getRoster().getEntry(chat.getParticipant()).getName()). 
       add(actualMsg); 

    } 

} 

public void receiveMessage(){ 

    myXMPPConnection.addPacketListener(myPacketListener, null); 
} 

public void retrieveUnservicedMessagesForSpecificPerson(String clientName) 
{ 
    ArrayList<Msg> myMessages = conversation.get(clientName); 
    Calendar calendar = Calendar.getInstance(); 
    java.util.Date now = calendar.getTime(); 
    java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime()); 

    System.out.println("Unserviced messages from: "+ clientName); 
    if(!myMessages.isEmpty()) 
    { 

     int counter = myMessages.size()-1; 
     System.out.println("Size of array list: "+counter); 
     boolean found = false; 
     java.sql.Timestamp lastBotTimestamp = null; 


     while (counter != 0 && found == false){ 

      if(myMessages.get(counter).getOwner()=="bot") 
      { 
       lastBotTimestamp = myMessages.get(counter).getTimestamp(); 
       found = true; 
      } 
      else 
      { 
       counter = counter-1; 
      } 

     } 

     for(Msg msg:myMessages) 
     { 
      if(msg.getTimestamp().before(currentTimestamp) && 
        msg.getTimestamp().after(lastBotTimestamp)){ 

        System.out.println("---------------------------"); 
        System.out.println("-"+msg.getActualMessage()); 
        System.out.println("-"+msg.getTimestamp()); 
        System.out.println("---------------------------"); 
      } 

     } 
    } 
} 


public void returnConversation(String name) { 

    System.out.println("Name of participant entered: "+ name); 
    System.out.println("Conversation history is: "); 
    ArrayList<Msg> m = conversation.get(name); 

    for(Msg msg:m){ 

     System.out.println(msg.getActualMessage()); 
     System.out.println("on: "+msg.getTimestamp()); 

    } 

} 

public void returnAllUnservicedMessagesHistory() 
{ 

    for(String name: conversation.keySet()) 
    { 
     System.out.println("History of unserviced messages for: "+ name); 
     retrieveUnservicedMessagesForSpecificPerson(name); 
    } 

} 


public void getOfflineMessagesCount(){ 

    try { 
     System.out.println("Number of offline messages: "+ offlineMessages.getMessageCount()); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 

} 

}

我的主類實施:

pu BLIC類MainGoogleChatApp {

public static void main(String[] args) 
{ 

    //Step 1: need to make a chat request with your username and password. 

    Scanner input = new Scanner(System.in); 

    System.out.println("Please enter your username to start: "); 
    String myUsername = input.next(); 

    System.out.println("Please enter your password to continue: "); 
    String myPassword = input.next(); 

    ChatRequest myChatRequest = new ChatRequest(); 

    myChatRequest.setUsername(myUsername); 
    myChatRequest.setPassword(myPassword); 

    //Step 2: Need to initiate a connection to talk.google.com 

    StartChatImpl convo = new StartChatImpl(); 

    try { 
     convo.engageChat(myChatRequest); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String myMessage; 

    System.out.println("Friend list."); 

    convo.displayMyFriends(); 



    convo.receiveMessage(); 

    try { 
     while(true) 
     { 
      System.out.println("Input Which friend you want to chat with '0 to sign out' : "); 
      int num = input.nextInt() -1; 
      if (num == -1){ 
       break; 
      } 
      String chatWith = StartChatImpl.myFriends.get(num); 

      System.out.print("Type your message: "); 

      myMessage=br.readLine(); 


      try { 
       convo.send(myMessage,chatWith); 



      } catch (XMPPException e) { 
       e.printStackTrace(); 
      } 
      convo.displayMyFriends(); 

     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("Enter participant name to get specific chat..."); 
    String yourName = null; 
    try { 
     yourName = br.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("/./././././././././././././..//."); 
    if(yourName!=null){ 
     System.out.println("Your name is not null...ok"); 
     convo.returnConversation(yourName); 
    } 

    System.out.println("Enter another participant's name to get specific chat..."); 
    String yourName1 = null; 
    try { 
     yourName1 = br.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("/./././././././././././././..//."); 
    if(yourName1!=null){ 
     System.out.println("Your name is not null...ok"); 
     convo.returnConversation(yourName1); 
    } 

    System.out.println("Select a client name for whom you want to view unserviced messages: "); 
    String yourClientName = null; 
    try { 
     yourClientName = br.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    if(yourClientName!=null){ 
     System.out.println("..........................................."); 
     convo.retrieveUnservicedMessagesForSpecificPerson(yourClientName); 
    } 

    System.out.println("..........................................."); 

    convo.returnAllUnservicedMessagesHistory(); 



    System.out.println("You have chosen to disconnect yourself from talk.google.com"); 
    convo.disconnectMe(); 
    System.exit(0); 
} 

}

嘗試檢索離線消息標題:

公共類TestOfflineService {

XMPPConnection xmppConnection = null; 
//OfflineMessageManager offlineMessageManager = null; 

public void makeConnection() 
{ 
    ConnectionConfiguration config = new ConnectionConfiguration("talk.google.com", 5222, "gmail.com"); 
    //config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
    config.setSendPresence(true); 
    xmppConnection = new XMPPTCPConnection(config); 


    try{ 

     System.out.println("Connecting to talk.google.com"); 
     xmppConnection.connect(); 

     System.out.println("Logging you in..."); 
     xmppConnection.login("*******.*@***.com", "*****"); 

     System.out.println("You have been successfully connected."); 

    } catch (SmackException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 

} 

public void makeMeUnavailable() 
{ 
    try { 
     xmppConnection.sendPacket(new Presence(Presence.Type.unavailable)); 
    } catch (SmackException.NotConnectedException e) { 
     e.printStackTrace(); 
    } 
} 

public void getOfflineMessages() 
{ 
    OfflineMessageManager offlineMessageManager1 = new OfflineMessageManager(xmppConnection); 
    try { 
     Iterator<OfflineMessageHeader> headers = offlineMessageManager1.getHeaders(); 

     if(headers.hasNext()) 
     { 
      System.out.println("Messages found"); 
     } 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 

} 

public static void main(String[] args) 
{ 
    TestOfflineService test = new TestOfflineService(); 
    test.makeConnection(); 
    test.makeMeUnavailable(); 
    System.out.println("Enter messages"); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Getting offline messages....."); 
    test.getOfflineMessages(); 

} 

}

回答

2

OfflineMessageManager嘗試使用XEP-0013檢索離線mes先賢。這個XEP不是由GTalk實現的。另外請注意,環聊始終都不會收到離線消息,因爲環聊實例永遠不會離線。

GTalk也沒有檢索聊天記錄的XMPP API,如XEP-0136XEP-0313