Ejabberd filter_packet子句未触发

时间:2017-07-27 08:35:57

标签: erlang xmpp ejabberd

我目前正在尝试编写一个ejabberd模块,但是我遇到了第一个障碍,所以假设我错过了一些简单的事情。

完成的模块的目标是检查消息正文并查找某个术语。如果该术语存在,则模块将丢弃该消息并向发起者发送回复,通知他们由于违规而他们的消息已被丢弃。我不想只是混淆那个令人讨厌的词。

我使用' hello world'建立了一个骨架测试模块。来自main ejabberd webpages的示例,它起作用,所以我似乎把东西放在正确的位置并正确地编译它们。

mod_pottymouth等来源获取灵感以及相关的堆栈溢出问题,例如Filtering message packet's body in ejabberdHow to filter messages in Ejabberd(更不用说各种博客和其他文章)代码沿着以下应该可以告诉我:

-module(mod_helloworld).

-behaviour(gen_mod).

-include("logger.hrl").
-include("ejabberd.hrl").

-export([start/2, stop/1, on_filter_packet/1]).


start(_Host, _Opts) ->
    ?INFO_MSG("Hello there, ejabberd world!", []),
    ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 0),
        ok.

stop(_Host) ->
    ?INFO_MSG("Bye bye, ejabberd world!", []),
    ejabberd_hooks:delete(filter_packet, global, ?MODULE, on_filter_packet, 0),
        ok.

on_filter_packet(drop) ->
    ?INFO_MSG("world - Message was dropped",[]),
    drop;
on_filter_packet({_From, _To, Xml} = Packet) ->
    % this clause never fires
    ?INFO_MSG("world - message hit clause", [Xml]),
    Packet;
on_filter_packet(Msg) ->
    % catch-all clause for non-message types
    ?INFO_MSG("world - message hit default", []),
    Msg.

当模块运行时,每个数据包都会触发catch-all子句,所以我知道钩子似乎正在完成它们的工作,如果我检查主要的ejabberd日志,那么消息就可以了。如果我删除了全部,那么过滤器就会崩溃。

我尝试了各种示例(加上支持代码)中的过滤条款的多种变体,例如: :

{_From, _To, #xmlel{name = StanzaType}} = Input

{_From, _To, {xmlel, <<"message">>, _Attrs, Els} = _Packet} = _Msg

但他们似乎都没有工作。

我使用了两个不同的Centos 7设置(一个安装了ejabberd作为在物理盒上运行的包,另一个使用Vagrant,从源代码安装了ejabberd)和许多不同的XMPP客户端,但是结果是一样的。 Ejabberd版本是17.07.31。

我遗失了哪些明显的东西?

0 个答案:

没有答案