Как восстановить потерянные <message>события в Ejabberd / MongooseIM, связанные с XEP-0022 - PullRequest
0 голосов
/ 16 ноября 2018

Я использую MongooseIM с событиями XEP-0022, такими как <офлайн>, <доставлено>, <отображается>, <составление> для подтверждения доставки сообщения и т. Д. Я доволен работой <офлайн> и <сочинять>, но испытывают некоторые трудности с двумя другими.

Если оба пользователя (в чате) подключены к сети, все работает отлично.Но если рассмотреть приведенный ниже вариант использования:

  1. Предположим, что второй пользователь находится в автономном режиме, а 1-й пользователь в сети и отправляет <сообщение> со всеми 4 событиями, а затем переходит в автономный режим.
  2. Затем 2-й пользовательподключитесь (помните, 1-й пользователь сейчас не в сети), и этот пользователь получил , а взамен он отправляет события и , и теперь 2-й пользователь переходит в автономный режим.
  3. Через некоторое времякогда 1-й пользователь снова подключается к сети, он не получает ни одного из событий и .

Короче говоря, оба должны быть в сети одновременно, чтобы это работало.Итак, меня беспокоит:

  1. Как я могу гарантировать, что сообщение будет доставлено и отображено второму пользователю без головной боли при одновременном подключении обоих к сети.
  2. Могу ли ячто-то пропущено или это может быть решено с некоторыми изменениями конфигурации?
  3. Нужно ли мне использовать FCM здесь?

1 Ответ

0 голосов
/ 16 ноября 2018

Прежде всего, XEP-0022 устарел. Лучше всего следовать совету XSF - это фундамент, который стандартизирует XMPP - и использовать более современные XEP для решения этой проблемы. При этом я бы использовал XEP-0085: уведомления о состоянии чата для <composing/> подобных уведомлений и XEP-0333: маркеры чата для <received/> или <displayed/> квитанций.

Как я могу гарантировать, что сообщение будет доставлено и отображено второму пользователю без головной боли при одновременном подключении обоих к сети?

Вы должны использовать XEP-313: Управление архивом сообщений , реализованное MongooseIM (или ejabberd) mod_mam . Он хранит историю чата в базе данных сервера, что позволяет в любое время извлекать прошлые разговоры, при этом партнеры по чату больше не находятся в сети.

По умолчанию mod_mam не хранит сообщения, которые не несут текст (точнее, не содержат или не содержат подэлемента <body/>), но его можно настроить, и для хранения маркеров чата XEP-333 вам придется его перенастроить , Возможно, нет смысла хранить уведомления XEP-85, поскольку они имеют смысл только тогда, когда оба пользователя находятся в сети.

Как только вы сможете получить маркеры чата, клиентское приложение должно будет запросить архив сообщений, обработать результаты и найти любые маркеры чата, которые соответствуют сообщениям пользователей, которые сейчас не в сети. Пожалуйста, имейте в виду, что хотя обычный маркер, отправленный онлайн-пользователем, будет выглядеть следующим образом (пример 4 из XEP-333):

<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, будет выглядеть следующим образом - он будет заключен в конверт, помечающий, что это результат запроса архива:

<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 в данный момент отключен.

...