我遇到的问题是我定义的钩子没有在事件“user_send_packet”上被调用。我确实假设正在发送的任何节(包括消息)都会触发此事件。
我通过将钩子设置为'0'来考虑钩子的优先级。在日志中,我已经验证模块已启动(“mod_stanza_ack starting”)。 erl文件确实编译了,它只得到警告“gen_mod”未定义,但我在ejabberd邮件列表上读到这是无害的,并且变量“Host”在第12行未被使用。也许这有事情要做有了它,但我不知道是否是这种情况。
-module(mod_stanza_ack).
-behaviour(gen_mod).
-include("ejabberd.hrl").
-export([start/2,
stop/1]).
-export([on_user_send_packet/3]).
start(Host, _Opts) ->
?INFO_MSG("mod_stanza_ack starting", []),
ejabberd_hooks:add(user_send_packet, global, ?MODULE, on_user_send_packet, 0),
ok.
stop(Host) ->
?INFO_MSG("mod_stanza_ack stopping", []),
ejabberd_hooks:delete(user_send_packet, global, ?MODULE, on_user_send_packet, 0),
ok.
on_user_send_packet(From, To, Packet) ->
?INFO_MSG("mod_stanza_ack a package has been sent coming from: ~p", [From]),
?INFO_MSG("mod_stanza_ack a package has been sent to: ~p", [To]),
?INFO_MSG("mod_stanza_ack a package has been sent with the following packet: ~p", [Packet]),
Packet.
答案 0 :(得分:0)
语法看起来没问题,您对钩子和编译警告有正确的假设。您使用的是哪个版本的ejabberd?
“全球”处理似乎存在漏洞/混乱。
运行user_send_packet的ejabberd_c2s,以Host作为范围运行它。 范围的实现非常幼稚,并且在Host hook下没有连接“全局”回调。
在我的2.1.6中仍然存在'buggy'行为,我可以重现你的情况。 要修复它,请在主机上添加挂钩,而不是“全局”关键字。