2015-08-27 3 views
1

Мне удалось использовать Strophe MAM для получения архивных сообщений в RAWInput и отображения последнего сообщения (но только последнего). Как отображать все сообщения из RAWInput? Но не только последний?Strophe MAM как отображать сообщения?

И как извлечь из сообщения сообщение?

Я ограничил сообщения до последнего 5.

connection.mam.query("[email protected]", { 
    "with": "[email protected]","before": '',"max":"5", 
    onMessage: function(message) { 


      console.log($(message).text()); 




    }, 
    onComplete: function(response) { 
      console.log("Got all the messages"); 

    } 
    }); 

ответ

4

Вы можете получить все сообщения, используя `strophe.mam.js плагин

Вот мой рабочий код:

// Retrives the messages between two particular users. 

var archive = []; 

var q = { 
    onMessage: function(message) { 
     try { 
      var id = message.querySelector('result').getAttribute('id'); 
      var fwd = message.querySelector('forwarded'); 
      var d = fwd.querySelector('delay').getAttribute('stamp'); 
      var msg = fwd.querySelector('message'); 
      var msg_data = { 
       id:id, 
       with: Strophe.getBareJidFromJid(msg.getAttribute('to')), 
       timestamp: (new Date(d)), 
       timestamp_orig: d, 
       from: Strophe.getBareJidFromJid(msg.getAttribute('from')), 
       to: Strophe.getBareJidFromJid(msg.getAttribute('to')), 
       type: msg.getAttribute('type'), 
       body: msg.getAttribute('body'), 
       message: Strophe.getText(msg.getElementsByTagName('body')[0]) 
      }; 
      archive.val(archive.val() + msg_data.from + ":" + msg_data.message + "\n" + msg_data.to + ":" + msg_data.message + "\n"); 
      archive.scrollTop(archive[0].scrollHeight - archive.height()); 
      console.log('xmpp.history.message',msg_data.message); 
     } catch(err){ 
      if(typeof(err) == 'TypeError'){ 
       try { 
        console.log(err.stack) 
       } catch(err2){ 
        console.log(err,err2); 
       } 
      } 
     } 
     return true; 
    }, 
    onComplete: function(response) { 
     console.log('xmpp.history.end',{query:q, response:response}); 
    } 
}; 

$(document).ready(function)(){ 
archive = $("#archive-messages"); 
archive.val(""); 
$("#to-jid").change(function() { 
      $("#archive-messages").val(""); 
      var to = {"with": $(this).val()}; 
      $.extend(q, to, before, max); 
      // It takes around 800ms to auto login. So after this timeout we have to retrieve the messages of particular User. 
      setTimeout(function(){ 
      connection.mam.query(Strophe.getBareJidFromJid(connection.jid), q); 
     }, 1000); 
     }); 
}); 
+0

Спасибо! Это работает, мне просто интересно, что у Openfire Archive есть небольшая задержка? Любая работа вокруг, чтобы уменьшить это время задержки? – John

+0

@John Приятно слышать, что он работает. Если он работает, вы можете принять ответ, чтобы другие пользователи могли легко решить эту проблему. И я еще не работал с Openfire. Сейчас я использую ejabberd для архивации. У него нет никаких задержек. Ejabberd очень приятен, когда по сравнению с другими серверами XMPP – Yashwanth

+0

yup принял ответ, как вы думаете, его намного сложнее использовать Ejabbered ?? Если его трудно настроить, автономные сообщения, архив, пинг с Ejabbered? Поскольку я все еще склонен переключиться на Ejabberd, просто не уверен, насколько это лучше, чем Openfire. – John

0

Самый простой способ получить все сообщения - включить эту строку в конец функции onMessage():

return true;

Я думаю, что причина в том, что если обработчик не возвращает true, он будет уничтожен после того, как в первый раз она называется.

1
connection.mam.query("Your_Id", { 
    "with": "partner_id","before": '',"max":'', 
    onMessage: function(message) { 

console.log("Message from ", $(message).find("forwarded message").attr("from"), 
       ": ", $(message).find("forwarded message body").text()); 

return true; 

    }, 
    onComplete: function(response) { 
      console.log("Got all the messages"); 

    } 
    }); 

This will fetch all History for a user. If you want to limit, then provide max value. 

Don't download strophe.mam.js(https://github.com/metajack/strophejs-plugins/tree/master/mam) from github. Its not working. Please copy below strophe.mam.js file. 

**strophe.mam.js** 
/* XEP-0313: Message Archive Management 
* Copyright (C) 2012 Kim Alvefur 
* 
* This file is MIT/X11 licensed. Please see the 
* LICENSE.txt file in the source package for more information. 
* 
* TODO: 
* Get RSM from the reply 
* Clean remove onMessage handler afterwards 
* queryid? 
* 
*/ 

Strophe.addConnectionPlugin('mam', { 
    _c: null, 
    _p: [ "with", "start", "end" ], 
    init: function (conn) { 
     this._c = conn; 
     Strophe.addNamespace('MAM', 'urn:xmpp:mam:0'); 
    }, 
    query: function (jid, options) { 
     var _p = this._p; 
     var attr = { 
      type:"set", 
      id:jid 
     }; 
     var mamAttr = {xmlns: Strophe.NS.MAM}; 
     var iq = $iq(attr).c("query", mamAttr).c('x',{xmlns:'jabber:x:data'}); 

     iq.c('field',{var:"FORM_TYPE"}).c('value').t("urn:xmpp:mam:0").up().up(); 
     for (i = 0; i < this._p.length; i++) { 
      var pn = _p[i]; 
      var p = options[pn]; 
      delete options[pn]; 
      if (!!p) { 
       var f 
       iq.c('field',{var:pn}).c('value').t(p).up().up(); 
      } 
     } 
     iq.up(); 

     var onMessage = options["onMessage"]; 
     delete options['onMessage']; 
     var onComplete = options["onComplete"]; 
     delete options['onComplete']; 
     iq.cnode(new Strophe.RSM(options).toXML()); 

     this._c.addHandler(onMessage, Strophe.NS.MAM, "message", null); 
     return this._c.sendIQ(iq, onComplete); 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^