ejabberd moudle 开发
参考:
http://anders.conbere.org/journal/
http://www.process-one.net/en/wiki/ejabberd_module_development/
ejabberd的内部的不少模块都是以插件的形式工做,这样咱们也能够开发本身的模块融合到ejabberd中去,完成各类各样咱们独特的需求。
ejabberd定义了一个gen_mod behaviour,其要求下面的callback:
Erlang代码
- start(Host, Opts) -> ok
- stop(Host) -> ok
- * Host = string()
- * Opts = [{Name, Value}]
- * Name = Value = string()
其中Host是运行这module的一个虚拟的主机。
Opts是在配置中指定的mod的参数(后面会讲到),能够经过gen_mod:get_module_opt/4获取(参看gen_mod.erl代码得知这些信息存储在ets中)。
咱们要实现一个mod很是容易,就很是容易了:
Erlang代码
- -module(my_module).
- -author('your@mail.com').
- -behaviour(gen_mod).
- -include('ejabberd.hrl').
-
- %% gen_mod callback
- -export([start/2, stop/1]).
-
- start(_Host, _Opt) -> ok.
- stop(_Host) -> ok.
让咱们在添加一代码,让咱们这个“无用”的mod更加清晰一些
Erlang代码
- start(_Host, _Opt) ->
- ?DEBUG("EXAMPLE MODULE LOADING").
编译my_module,将my_module.beam放到你的ejabberd/ebin目录中:
mv my_module.beam /var/lib/ejabberd/ebin
接着,咱们须要对ejabberd.cfg作一些配置,告诉ejabberd加载咱们的my_module:
Erlang代码
- {modules,
- [
- {mod_register, [{access, register}]},
- ...
- {my_module, []} % []为my_module:start/2中的第二个参数
- ]}.
好了,一切OK后,从新启动ejabberd,若是你的loglevel设置为5,那么你将看到以下信息:
Erlang代码
- =INFO REPORT==== 2008-07-17 15:33:27 ===
- D(<0.37.0>:ejabberd_auth_my_auth:44) : EXAMPLE MODULE LOADING
咱们的ejabberd module顺利加载了。
写到这里,您可能会问,如何实现一个更增强大的module呢?
原来ejabberd为咱们提供了不少的API,能够供咱们使用,包含以下:
ejabberd core modules (ejabberd核心模块)
ejabberd events and hooks(ejabberd 事件及钩子)
ejabberd IQ handlers
ejabberd route table (ejabberd 路由表)
ejabberd HTTP request handlers(ejabberd HTTP 请求处理)
有了这些API,咱们能够实现任何咱们想要的功能。
欢迎关注本站公众号,获取更多信息