Ejabberd模块发送确认消息

时间:2015-10-05 09:42:27

标签: module erlang xmpp ejabberd sendmessage

我用这个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}]}]}

2 个答案:

答案 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)