XMPP按最新消息查询归档

时间:2015-08-05 09:48:01

标签: xmpp ejabberd

我正在阅读http://xmpp.org/extensions/xep-0313.html,以便向Ejabberd查询使用特定用户存档的邮件。

这是我发送的xml:

<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>
  </set>
 </query>
</iq>

我正确收到前20条消息。要再次请求我添加标记:

<after>(id in element "Last" from last request)</after>

这也很好。我需要的是接收最后20条消息,而不是前20条消息。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:9)

XEP-0313 Message Archive Management依靠XEP-0059 Result Set Management进行分页。

RSM规范解释了how to get the last page in a Result Set

  

请求实体可以通过在其请求中包含空<before/>元素以及要返回的最大项目数来请求结果集中的最后一页。

这意味着您需要在结果集查询中添加空<before/>元素。

以下是基于XEP-0313版本0.4的示例,介绍如何在与给定用户的对话中获取最后20条消息。查询限制由参数max定义(它定义了页面的大小)。

<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>

答案 1 :(得分:5)

您应该添加一个空的<before/>元素:

<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>

请参阅here

答案 2 :(得分:4)

想要使用Smack获取此功能的用户可以使用以下代码

 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;
    }