在ejabberd中没有被称为钩子

时间:2013-04-09 12:58:28

标签: erlang ejabberd

我遇到的问题是我定义的钩子没有在事件“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.

1 个答案:

答案 0 :(得分:0)

语法看起来没问题,您对钩子和编译警告有正确的假设。您使用的是哪个版本的ejabberd?

“全球”处理似乎存在漏洞/混乱。

运行user_send_packet的ejabberd_c2s,以Host作为范围运行它。 范围的实现非常幼稚,并且在Host hook下没有连接“全局”回调。

在我的2.1.6中仍然存在'buggy'行为,我可以重现你的情况。 要修复它,请在主机上添加挂钩,而不是“全局”关键字。