Erlang Ejabberd-将消息路由到脱机消息钩子中的用户
我想建立一个客户支持聊天应用程序。有Erlang Ejabberd-将消息路由到脱机消息钩子中的用户,erlang,ejabberd,ejabberd-module,ejabberd-hooks,Erlang,Ejabberd,Ejabberd Module,Ejabberd Hooks,我想建立一个客户支持聊天应用程序。有用户和管理员。在管理员下方有多个子管理员。最初,聊天仅由管理员启动,但如果管理员处于脱机状态,我需要将消息路由到子管理员 offline\u message\u hookhook用于此目的。我将检查To是否为admin,然后我需要将数据包路由到其中一个子管理员。如何在离线消息\u hook内将数据包路由/发送给其他用户。简而言之,如何将数据包中的更改为,以便将数据包重新定向到新的子管理员 以下是我尝试过的:- offline_message_hook({_Ac
用户
和管理员
。在管理员下方有多个子管理员。最初,聊天仅由管理员启动,但如果管理员处于脱机状态,我需要将消息路由到子管理员
offline\u message\u hook
hook用于此目的。我将检查To
是否为admin,然后我需要将数据包
路由到其中一个子管理员。如何在离线消息\u hook
内将数据包路由/发送给其他用户。简而言之,如何将数据包中的更改为,以便将数据包重新定向到新的子管理员
以下是我尝试过的:-
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}]}]}}
所以,我读到了关于function\u子句,但不理解相同的内容。这里到底出了什么问题 我想你是在问。以下是一个例子:
我遵循了您的方法,并且做了完全相同的操作,但是我收到一个错误消息说,未能路由数据包
。请查看更新后的问题并提供您宝贵的建议。在to
字段中应该有记录#jid{}
,您正在将一个原子放在那里。详细信息请阅读:Usedjid:decode
,它就像一个符咒。非常感谢:)嘿,我收到另一个错误function\u子句
,同时以类似的方式发送消息。你能看一下最新的问题吗。谢谢:)您应该使用binary()
类型作为jid:decode/1
的输入,而不是string()
。
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}]}
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}.