2013-04-09 82 views
1

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

我已经考虑到如何通过将钩子设置为'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

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

在'全局'处理中似乎存在错误/混淆。

运行user_send_packet的ejabberd_c2s,以Host作为范围运行它。 范围的实现非常幼稚,'全局'回调没有挂在主机钩子下。

在我的2.1.6中仍然存在'错误行为',我可以重现你的情况。 要解决它添加钩子与主机,而不是'全球'关键字。

+0

你说得对。经验教训,系统并不总是正确的。更改为“主机”确实触发了这个傻瓜,这也适用于“on_user_receive”。 同时,作为一种解决方法,我使用事件/钩子“filter_packet”,它将其设置为全局触发。在这种情况下,我将不得不检查信息包是由某人发送还是接收。 – 2013-04-12 10:17:39

相关问题