Erlang Ejabberd filter_数据包子句未触发

Erlang Ejabberd filter_数据包子句未触发,erlang,xmpp,ejabberd,Erlang,Xmpp,Ejabberd,我目前正试图编写一个ejabberd模块,但在第一个关口就失败了,所以假设我错过了一些简单的东西 完成模块的目的是检查消息体并查找某个术语。如果存在该术语,则模块将删除该消息,并向发端人发送回复,通知发端人其消息因违规而被删除。我不想把这个令人讨厌的词弄糊涂 我使用来自的“hello world”示例构建了一个框架测试模块,它可以正常工作,因此我似乎把东西放在了正确的位置,并正确地编译了它们 从诸如和(更不用说各种博客和其他文章)等相关堆栈溢出问题的源代码中获得灵感,按照以下思路编写的代码应该可

我目前正试图编写一个ejabberd模块,但在第一个关口就失败了,所以假设我错过了一些简单的东西

完成模块的目的是检查消息体并查找某个术语。如果存在该术语,则模块将删除该消息,并向发端人发送回复,通知发端人其消息因违规而被删除。我不想把这个令人讨厌的词弄糊涂

我使用来自的“hello world”示例构建了一个框架测试模块,它可以正常工作,因此我似乎把东西放在了正确的位置,并正确地编译了它们

从诸如和(更不用说各种博客和其他文章)等相关堆栈溢出问题的源代码中获得灵感,按照以下思路编写的代码应该可以发挥作用:

-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日志,那么消息就会正常通过。如果我删除了catch all,那么过滤器就会崩溃

我尝试了从各种示例(加上支持代码)中提取的筛选子句的多种变体,例如:

{{u From,{u To,{xmllel,{u Attrs,Els}={u Packet}=\u Msg
但它们似乎都没有起作用

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

我错过了什么明显的东西

{_From, _To, #xmlel{name = StanzaType}} = Input
{_From, _To, {xmlel, <<"message">>, _Attrs, Els} = _Packet} = _Msg