我目前正在尝试编写一个ejabberd模块,但是我遇到了第一个障碍,所以假设我错过了一些简单的事情。
完成的模块的目标是检查消息正文并查找某个术语。如果该术语存在,则模块将丢弃该消息并向发起者发送回复,通知他们由于违规而他们的消息已被丢弃。我不想只是混淆那个令人讨厌的词。
我使用' hello world'建立了一个骨架测试模块。来自main ejabberd webpages的示例,它起作用,所以我似乎把东西放在正确的位置并正确地编译它们。
从mod_pottymouth等来源获取灵感以及相关的堆栈溢出问题,例如Filtering message packet's body in ejabberd和How 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。
我遗失了哪些明显的东西?