ejabberd moudle 开发 - http modules(二)

继续上一部分,我们已经可以开发一个简单的ejabberd module了,这次让我们开发一个简单的http处理模块。这个http模块可以输出服务器中登录的用户列表(json格式)。
首先,再我们上节的my_module中添加一个process/2导出函数:

-module(mod_http_hello_world).
-author(’your@mail.com’).
-vsn(’1.0′).

-define(EJABBERD_DEBUG, true).

-behavior(gen_mod).

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

-include(”ejabberd.hrl”).
-include(”jlib.hrl”).
-include(”ejabberd_http.hrl”).

start(_Host, _Opts) ->
ok.

stop(_Host) ->
ok.

process(_Path, _Request) ->
“Hello World”.

process/2用来处理ejabberd http服务器中的请求,其中第一个参数Path表示url中的路径,比如
http://example.com/this/cool/article 这个URL如果要我们的模块处理,对应的Path为:["this", "cool", "article"],对了,就是路径拆分后的一个list。这里我们先不对路径做任何处理,匹配,我们首先验证我的http handler module是否可以工作。
老规矩,编译module,然后放到ejabbered的ebin目录:

mv mod_http_hello_world.beam /var/lib/ejabberd/ebin

配置ejabberd.cfg,添加我们的module

{modules,
[
{mod_register, [{access, register}]},

{mod_http_hello_world, [...]

ejabberd moudle 开发(一)

参考:
http://anders.conbere.org/journal/
http://www.process-one.net/en/wiki/ejabberd_module_development/
ejabberd的内部的很多模块都是以插件的形式工作,这样我们也可以开发自己的模块融合到ejabberd中去,完成各种各样我们独特的需求。
ejabberd定义了一个gen_mod behaviour,其要求下面的callback:

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非常容易,就非常容易了:

-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更加清晰一些

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:

{modules,
[
{mod_register, [{access, register}]},

{my_module, []} % []为my_module:start/2中的第二个参数
]}.

好了,一切OK后,重新启动ejabberd,如果你的loglevel设置为5,那么你将看到如下信息:

=INFO REPORT==== 2008-07-17 15:33:27 [...]