【问题标题】:Hook not being called in ejabberd钩子没有在 ejabberd 中被调用
【发布时间】:2013-03-31 22:07:02
【问题描述】:

我遇到的问题是我定义的钩子没有被事件“user_send_packet”调用。我确实假设正在发送的任何节(包括消息)都会触发此事件。

我已经通过将钩子设置为“0”来考虑如何调用钩子的优先级。在日志中,我已验证模块已启动(“mod_stanza_ack 启动”)。 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.

【问题讨论】:

    标签: erlang ejabberd


    【解决方案1】:

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

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

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

    在我的 2.1.6 中仍然存在“错误”行为,我可以重现您的情况。 要修复它,请添加带有 Host 的钩子,而不是“全局”关键字。

    【讨论】:

    • 你是对的。经验教训,系统并不总是正确的。更改为“主机”确实触发了 hools,这也适用于偶数“on_user_receive”。同时,作为一种解决方法,我使用了通过将其设置为全局来触发的事件/挂钩“filter_packet”。在这种情况下,我必须检查消息是否有人发送或接收了数据包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多