我用这个erlang代码发送消息确认。使用这个时我收到错误,错误日志在下面给出
-module(mod_ack).
-behaviour(gen_mod).
%% public methods for this module
-export([start/2, stop/1]).
-export([on_user_send_packet/3]).
-include("logger.hrl").
-include("ejabberd.hrl").
-include("jlib.hrl").
%%add and remove hook module on startup and close
start(Host, _Opts) ->
?INFO_MSG("mod_echo_msg starting", []),
ejabberd_hooks:add(user_send_packet, Host, ?MODULE, on_user_send_packet, 0),
ok.
stop(Host) ->
?INFO_MSG("mod_echo_msg stopping", []),
ejabberd_hooks:delete(user_send_packet, Host, ?MODULE, on_user_send_packet, 0),
ok.
on_user_send_packet(From, To, Packet) ->
return_message_reciept_to_sender(From, To, Packet),
Packet.
return_message_reciept_to_sender(From, _To, Packet) ->
IDS = xml:get_tag_attr_s("id", Packet),
ReturnRecieptType = "serverreceipt",
%% ?INFO_MSG("mod_echo_msg - MsgID: ~p To: ~p From: ~p", [IDS, _To, From]),
send_message(From, From, ReturnRecieptType, IDS, "").
send_message(From, To, TypeStr, IDS, BodyStr) ->
XmlBody = {xmlelement, "message",
[{"type", TypeStr},
{"from", jlib:jid_to_string(From)},
{"to", jlib:jid_to_string(To)},
{"id", IDS},
[{xmlelement, "body", [],
[{xmlcdata, BodyStr}]}]},
ejabberd_router:route(From, To, XmlBody).
我已经删除了使用on_user_send钩子的模块,但仍然得到错误也更新了错误日志。
2015-10-06 07:13:45.796 [错误]< 0.437.0> @ejabberd_hooks:run_fold1:371 {function_clause,[{xml,get_tag_attr_s,[<<“id”>>, {JID,<< “XXXXXX” >>,<< “XXXXXX” >>,<<>>,<< “XXXXXX” >>中 << “XXXXXX” >>,<<>>}],[{文件, “SRC / xml.erl”},{线,210}]},{mod_ack,return_message_reciept_to_sender,3- , [{文件, “SRC / mod_ack.erl”},{线,36}]},{mod_ack,on_user_send_packet,4,[{文件, “SRC / mod_ack.erl”},{线,30}]},{ ejabberd_hooks,safe_apply,3,[{文件, “SRC / ejabberd_hooks.erl”},{线,385}]},{ejabberd_hooks,run_fold1,4,[{文件, “SRC / ejabberd_hooks.erl”},{线, 368}]},{ejabberd_c2s,session_established2,2,[{文件, “SRC / ejabberd_c2s.erl”},{线,1296}]},{p1_fsm,HANDLE_MSG,10,[{文件,“SRC / p1_fsm.erl “},{线,582}]},{proc_lib,init_p_do_apply,3,[{文件,” proc_lib.erl“},{线,237}]}]}
答案 0 :(得分:0)
您似乎有一个模块干扰(mod_send_receipt
)或者您有更多代码注册要挂钩。您的模块名为mod_ack
,而不是生成崩溃的模块。发生崩溃的原因是你注册了一个钩子来运行函数mod_send_receipt:on_user_send_packet
,这是一个' undef':这意味着它不存在或者没有被导出。
答案 1 :(得分:0)
ejabberd docs将user_send_packet挂钩定义为arity-4函数:
user_send_packet(Packet, C2SState, From, To) -> Packet
您正在注册arity-3函数,因此当ejabberd尝试调用您的on_user_send_packet
函数时,它会传递4个参数并获取undef函数异常。
为了实际调用您的回调函数,您需要将其参数列表与ejabberd将要发送的内容进行匹配,即:
on_user_send_packet(Packet, _C2SState, From, To)