Ejabberd — перенаправить сообщение пользователям в offline_message_hook

Я хочу создать приложение для чата поддержки клиентов. Есть users и admin. Ниже администратора есть multiple sub-admins. Первоначально чат инициируется только с администратором, но если администратор не в сети, мне нужно направить сообщение суб-админам.

Крюк offline_message_hook служит этой цели. Я проверю, является ли To администратором, затем мне нужно направить Packet одному из субадминистраторов. Как мне направить/отправить пакет другому пользователю в пределах offline_message_hook. Вкратце, как мне изменить To из пакета, чтобы пакет был перенаправлен новому субадмину?

Вот что я пробовал: -

offline_message_hook({_Action, #message{from = Peer, to = To} = Pkt} = Acc) ->
    ?INFO_MSG("Inside offline", []),
    ejabberd_router:route(From, To, Packet),
    ok.

Я использую ejabberd 17.04.105.

Обновить

Следуя совету user2610053, я сделал следующее:

-spec offline_message_hook({any(), message()}) -> {any(), message()}.
offline_message_hook({_Action, Msg} = Acc) ->
    ejabberd_router:route(xmpp:set_to(Msg, 'praful@localhost')),
    {routed, Msg}.

Ниже приведена ошибка: -

15:13:12.291 [error] failed to route packet:
#message{id = <<"purple187f6502">>,type = chat,lang = <<"en">>,
         from = {jid,<<"praful2">>,<<"localhost">>,<<"Prafuls-MacBook-Pro">>,
                     <<"praful2">>,<<"localhost">>,<<"Prafuls-MacBook-Pro">>},
         to = praful@localhost,subject = [],
         body = [#text{lang = <<>>,data = <<"co=umon">>}],
         thread = undefined,
         sub_els = [{xmlel,<<"active">>,
                           [{<<"xmlns">>,
                             <<"http://jabber.org/protocol/chatstates">>}],
                           []}],
         meta = #{ip => {0,0,0,0,0,0,0,1}}}
Reason = {error,{{badrecord,jid},[{ejabberd_router,do_route,1,[{file,"src/ejabberd_router.erl"},{line,343}]},{ejabberd_router,route,1,[{file,"src/ejabberd_router.erl"},{line,87}]},{mod_sunshine,offline_message_hook,1,[{file,"src/mod_sunshine.erl"},{line,24}]},{ejabberd_hooks,safe_apply,4,[{file,"src/ejabberd_hooks.erl"},{line,380}]},{ejabberd_hooks,run_fold1,4,[{file,"src/ejabberd_hooks.erl"},{line,364}]},{ejabberd_sm,route,1,[{file,"src/ejabberd_sm.erl"},{line,138}]},{ejabberd_local,route,1,[{file,"src/ejabberd_local.erl"},{line,116}]},{ejabberd_router,do_route,1,[{file,"src/ejabberd_router.erl"},{line,348}]}]}}

Пользователь praful@localhost существует. Посоветуйте, что именно не так?

Update2 – `Перехватчик UserReceivePacket

В перехватчике пакетов user_receive_packet при использовании той же функции ejabberd_router:route(xmpp:set_to(Packet, jid:decode("praful@localhost"))), выдает ошибку: -

Hook user_receive_packet crashed when running mod_sunshine:user_receive_packet/1:
** Reason = {error,function_clause,[{jid,decode,[{file,"src/jid.erl"},{line,132}],["praful@localhost"]},{mod_sunshine,user_receive_packet,[{file,"src/mod_sunshine.erl"},{line,29}],1},{ejabberd_hooks,safe_apply,[{file,"src/ejabberd_hooks.erl"},{line,380}],4},{ejabberd_hooks,run_fold1,[{file,"src/ejabberd_hooks.erl"},{line,364}],4},{ejabberd_c2s,process_info,[{file,"src/ejabberd_c2s.erl"},{line,231}],2},{ejabberd_hooks,safe_apply,[{file,"src/ejabberd_hooks.erl"},{line,380}],4},{ejabberd_hooks,run_fold1,[{file,"src/ejabberd_hooks.erl"},{line,364}],4},{xmpp_stream_in,handle_info,[{file,"src/xmpp_stream_in.erl"},{line,373}],2}]}

Итак, я читал о function_clause, но не мог понять того же. Что именно здесь не так?


person PythonEnthusiast    schedule 26.05.2017    source источник


Ответы (1)


Я думаю, вы спрашиваете о xmpp:set_to/2. Вот пример:

offline_message_hook({_Action, Msg} = Acc) ->
  SubAdmins = get_sub_admins(Msg#message.to),
  lists:foreach(
    fun(Admin) ->
      ejabberd_router:route(xmpp:set_to(Msg, Admin))
    end, Admins),
  {routed, Msg}.
person user2610053    schedule 26.05.2017
comment
Я последовал вашему подходу и сделал то же самое, но я получаю сообщение об ошибке failed to route packet. Пожалуйста, посмотрите обновленный вопрос и дайте ценный совет. - person PythonEnthusiast; 26.05.2017
comment
Использовал jid:decode, и это сработало как шарм. Большое спасибо :) - person PythonEnthusiast; 26.05.2017
comment
Эй, я получаю другую ошибку function_clause при пересылке сообщения аналогичным образом. Не могли бы вы взглянуть на обновленный вопрос. Спасибо :) - person PythonEnthusiast; 13.06.2017
comment
Вы должны использовать тип binary() в качестве входных данных для jid:decode/1, а не string(). - person user2610053; 14.06.2017
comment
Ух ты. Спасибо. :) - person PythonEnthusiast; 14.06.2017
comment
Можете ли вы также дать свой ценный совет к этому сообщению. stackoverflow.com/ вопросов/44543033/ Будет очень полезно!!! Спасибо - person PythonEnthusiast; 14.06.2017