offline_message_hook: не вызывается при отправке сообщения в автономном режиме

Я разрабатываю приложение для чата для Android, используя ejabberd в качестве сервера XMPP. Я хочу отправить push-уведомление GCM, когда пользователь не в сети. Для этого я создаю новый модуль в ejabberd, зарегистрированный offline_message_hook, но эта функция вызывается только тогда, когда кто-то начинает печатать и заканчивает печатать. Ниже приведены единственные пакеты, переданные на этот хук. Хотя пользователь получает сообщение, когда он / она выходит в сеть.

Packet: {xmlelement,
      "message",
      [{"type",
       "chat"},
      {"id",
       "purple7d4d0773"},
      {"to",
       "xxx@rakshith"}],
      [{xmlelement,
       "paused",
       [{"xmlns",
         "http://jabber.org/protocol/chatstates"}],
       []}]}
Packet: {xmlelement,
      "message",
      [{"type",
       "chat"},
      {"id",
       "purple7d4d0773"},
      {"to",
       "xxx@rakshith"}],
      [{xmlelement,
       "composing",
       [{"xmlns",
         "http://jabber.org/protocol/chatstates"}],
       []}]}

person raxith    schedule 28.02.2013    source источник
comment
Привет, не могли бы вы поделиться своим модулем gcm?   -  person Tolgay Toklar    schedule 22.12.2014
comment
Привет @TolgayToklar, на данный момент у меня нет фактической реализации. Однако вы можете реализовать GCM push с помощью автономный хук в ejabberd. Надеюсь, это поможет!   -  person raxith    schedule 23.12.2014
comment
Где вы храните токен устройства Android?   -  person Tolgay Toklar    schedule 25.12.2014
comment
@TolgayToklar, используя модуль архивации ejabberd, можно заархивировать все сообщения, возможно, вам потребуется расширить модуль или вы можете написать свой собственный. В любом случае модуль архива дает больше информации о том, как работать с базой данных.   -  person raxith    schedule 25.12.2014


Ответы (1)


Две вещи о хуках в ejabberd: 1) Обратные вызовы всегда вызываются по порядку, порядок определяется приоритетом, который вы указываете при его регистрации. 2) Если обратный вызов возвращает «стоп», он предотвращает распространение события на остальных слушателей в цепочке.

Происходит то, что автономный модуль ejabberd прослушивает offline_message_hook, то же самое, что и ваш код. Он обрабатывает сообщение и возвращает «стоп», поэтому ваш код не выполняется.

(ваш код получает сообщение для уведомлений о состоянии чата, потому что они игнорируются автономным модулем, и поэтому в этих случаях он не останавливает цепочку).

Вероятно, вы хотите, чтобы ваш код запускался до автономного модуля хранения. Просто не забудьте не возвращать «стоп», чтобы у автономного модуля была возможность сохранить сообщение.

person ppolv    schedule 01.03.2013
comment
спасибо, на данный момент заказ 50, я изменю его на 1 и дам вам знать. Кстати, каков порядок автономного модуля по умолчанию? - person raxith; 01.03.2013
comment
mod_offline также регистрируется с 50. Если вы используете один и тот же приоритет, какой из них вызывается первым, не определено (в настоящее время учитывается имя модуля и обратный вызов функции, но лучше рассматривать ситуацию как неопределенную) - person ppolv; 04.03.2013
comment
Спасибо за предложение, да, если порядок изменился на 1, это работает как шарм. :D - person Yasitha Waduge; 11.10.2014