首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >offline_message_hook中给用户的路由消息

offline_message_hook中给用户的路由消息
EN

Stack Overflow用户
提问于 2017-05-26 08:09:52
回答 1查看 514关注 0票数 0

我想建立一个客户支持聊天应用程序。有usersadmin。在管理员下面有multiple sub-admins。最初,聊天只使用admin启动,但是如果管理员离线,我需要将消息路由到子管理员。

offline_message_hook钩子起作用。我将检查To是否是管理员,然后我需要将Packet路由到一个子管理员。如何将数据包路由/发送到offline_message_hook中的其他用户。简而言之,我如何从包中更改To,以便将数据包重新定向到新的子管理员?

以下是我尝试过的:-

代码语言:javascript
复制
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的建议后,我做了这样的事情:-

代码语言:javascript
复制
-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}.

以下是错误:

代码语言:javascript
复制
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 -‘

user_receive_packet数据包钩子中,在使用相同的ejabberd_router:route(xmpp:set_to(Packet, jid:decode("praful@localhost"))),函数时,它会抛出一个错误:-

代码语言:javascript
复制
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的文章,但是我也不明白。这里到底出了什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-26 08:24:19

我想你是在问至/2的事。下面是一个示例:

代码语言:javascript
复制
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}.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44196683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档