XMPP query archive by latest messages

后端 未结 3 660
醉酒成梦
醉酒成梦 2021-01-13 01:13

I\'m reading http://xmpp.org/extensions/xep-0313.html to query Ejabberd for messages archived with a certain user.

This is the xml that I\'m sending:



        
相关标签:
3条回答
  • 2021-01-13 01:21

    XEP-0313 Message Archive Management rely on XEP-0059 Result Set Management for pagination.

    RSM specification explains how to get the last page in a Result Set:

    The requesting entity MAY ask for the last page in a result set by including in its request an empty <before/> element, and the maximum number of items to return.

    It means you need to add an empty <before/> element in your result set query.

    Here is an example based on XEP-0313 version 0.4 on how to get the last 20 messages in a conversation with a given user. The query limit is defined by the parameter max (it defined the size of the pages).

    <iq type='set' id='q29302'>
      <query xmlns='urn:xmpp:mam:0'>
        <x xmlns='jabber:x:data' type='submit'>
          <field var='FORM_TYPE' type='hidden'>
            <value>urn:xmpp:mam:0</value>
          </field>
          <field var='with'>
            <value>juliet@capulet.lit</value>
          </field>
        </x>
        <set xmlns='http://jabber.org/protocol/rsm'>
         <max>20</max>
         <before/>
        </set>
      </query>
    </iq>
    
    0 讨论(0)
  • 2021-01-13 01:28

    People who would like to use Smack to fetch this can use below code

     public MamManager.MamQueryResult getArchivedMessages(String jid, int maxResults) {
    
            MamManager mamManager = MamManager.getInstanceFor(connection);
            try {
                DataForm form = new DataForm(DataForm.Type.submit);
                FormField field = new FormField(FormField.FORM_TYPE);
                field.setType(FormField.Type.hidden);
                field.addValue(MamElements.NAMESPACE);
                form.addField(field);
    
                FormField formField = new FormField("with");
                formField.addValue(jid);
                form.addField(formField);
    
                // "" empty string for before
                RSMSet rsmSet = new RSMSet(maxResults, "", RSMSet.PageDirection.before);
                MamManager.MamQueryResult mamQueryResult = mamManager.page(form, rsmSet);
    
                return mamQueryResult;
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
    0 讨论(0)
  • 2021-01-13 01:30

    You should add an empty <before/> element:

    <iq type='get' id='get_archive_user1'>
        <query xmlns='urn:xmpp:mam:tmp'>
            <with>user1@localhost</with>
            <set xmlns='http://jabber.org/protocol/rsm'>
                <max>20</max>
                <before/>
            </set>
        </query>
    </iq>
    

    See here.

    0 讨论(0)
提交回复
热议问题