Erlang 在ejabberd中未调用Hook

Erlang 在ejabberd中未调用Hook,erlang,ejabberd,Erlang,Ejabberd,我的问题是,我定义的钩子没有在事件“user\u send\u packet”上被调用。我确实假设正在发送的任何节(包括消息)都会触发此事件 通过将钩子设置为“0”,我已经考虑了如何调用钩子的优先级。在日志中,我已验证模块已启动(“mod_stanza_ack starting”)。erl文件确实编译过,它只得到警告“gen_mod”未定义,但我在ejabberd邮件列表上读到,这是无害的,而且变量“Host”在第12行中未使用。也许这与此有关,但我不知道是否如此 -module(mod_sta

我的问题是,我定义的钩子没有在事件“user\u send\u 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.

语法看起来不错,并且您对钩子和编译警告有正确的假设。您使用的是哪个版本的ejabberd

“全局”处理中似乎存在错误/混乱

ejabberd_c2s运行user_send_数据包,以主机作为作用域运行它。 作用域的实现非常简单,“全局”回调没有连接到主机钩子下

在我的2.1.6中,仍然存在“错误”行为,我可以复制您的案例。
要修复它,请添加hook和Host,而不是'global'关键字。

你说得对。从中吸取的教训是,系统并不总是正确的。更改为“主机”确实触发了hool,这也适用于偶数的“on_user_receive”。同时,作为一种解决方法,我使用了事件/钩子“filter_packet”,它是通过将其设置为全局来触发的。在这种情况下,我必须检查消息包是否由某人发送或接收。