如何恢复 Ejabberd/MongooseIM 中与 XEP-0022 相关的丢失的 <message> 事件

How to recover the lost <message> events in Ejabberd/MongooseIM related to XEP-0022

我正在使用 MongooseIM 和 XEP-0022 <消息> 事件,例如 <离线>、<已发送>、<显示>、<撰写> 以确认消息传送等。我对 <离线> 的工作感到满意和 < composing > 但其他两个有点困难。

如果两个用户(聊天)都在线,那么一切都很好。但如果考虑以下用例:

  1. 假设第 2 个用户离线,第 1 个用户在线,发送 和所有 4 个事件,然后离线。
  2. 然后第二个用户上线(请记住,第一个用户现在处于离线状态)并且该用户收到了 <消息> 并且在 return 他发送了 <交付> 和 <显示> 事件,现在第二个用户离开了进入线下阶段。
  3. 一段时间后,当第一个用户再次上线时,他没有收到任何 事件。

简而言之,两者需要同时在线才能运行。所以,我担心的是:

  1. 我怎样才能确保将消息传递给第二个用户并显示给第二个用户,而不用担心让他们同时在线。
  2. 我是不是遗漏了什么或者可以通过一些配置更改来解决?
  3. 我需要在这里使用 FCM 吗?

首先,XEP-0022 已经过时了。最好遵循 XSF 建议——它是标准化 XMPP 的基础——并使用更现代的 XEP 来解决这个问题。也就是说,我会使用 XEP-0085: Chat State Notifications for <composing/> like notifications and XEP-0333: Chat Markers 作为 <received/><displayed/> 收据。

How can I ensure that the message is delivered and displayed to the 2nd user without the headache of making both online at the same time.

你应该使用 XEP-313: Message Archive Management implemented by MongooseIM's (or ejabberd's) mod_mam。它将聊天记录保存在服务器的数据库中,允许您随时获取过去的对话,而无需聊天伙伴在线。

默认情况下,mod_mam 不存储不带文本的消息(准确地说,没有或为空 <body/> 子元素),但它是可配置的,以便存储 XEP-333 聊天标记,您将不得不重新配置它。存储 XEP-85 通知可能没有意义,因为它们只有在两个用户都在线时才有意义。

一旦您能够获取聊天标记,客户端应用程序就必须查询消息存档、处理结果并找到与来自现在离线的用户的消息相对应的任何聊天标记。请记住,虽然从在线用户发送的常规标记看起来像这样(来自 XEP-333 的示例 4):

<message from='kingrichard@royalty.england.lit/throne'
         id='message-2'
         to='northumberland@shakespeare.lit/westminster'>
  <thread>sleeping</thread>
  <received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
</message>

从存档中为用户 northumberland@shakespeare.lit 返回的聊天标记看起来像这样 - 它会被包装在 "envelope" 中,标记它是一个存档查询结果:

<message id='aeb213'
    from='northumberland@shakespeare.lit'
    to='northumberland@shakespeare.lit/westminster'>
    <result xmlns='urn:xmpp:mam:2' queryid='f27' id='28482-98726-73623'>
        <forwarded xmlns='urn:xmpp:forward:0'>
            <delay xmlns='urn:xmpp:delay' stamp='2010-07-10T23:08:25Z'/>
            <message from='kingrichard@royalty.england.lit/throne'
                id='message-2'
                to='northumberland@shakespeare.lit/westminster'>
                <thread>sleeping</thread>
                <received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
            </message>
        </forwarded>
    </result>
</message>

这样 northumberland@shakespeare.lit 就知道 kingrichard@royalty.england.lit 已经收到 <message id='message-1'/>,即使 kingrichard@royalty.england.lit 当前处于离线状态。