ejabberd moudle 开发

一笑奈何 提交于 2019-12-06 18:31:50
参考: 
http://anders.conbere.org/journal/ 
http://www.process-one.net/en/wiki/ejabberd_module_development/ 

ejabberd的内部的很多模块都是以插件的形式工作,这样我们也可以开发自己的模块融合到ejabberd中去,完成各种各样我们独特的需求。 

ejabberd定义了一个gen_mod behaviour,其要求下面的callback: 

Erlang代码   收藏代码
  1. start(Host, Opts) -> ok  
  2. stop(Host) -> ok  
  3. * Host = string()  
  4. * Opts = [{Name, Value}]  
  5. * Name = Value = string()  


其中Host是运行这module的一个虚拟的主机。 
Opts是在配置中指定的mod的参数(后面会讲到),可以通过gen_mod:get_module_opt/4获取(参看gen_mod.erl代码得知这些信息存储在ets中)。 

我们要实现一个mod非常容易,就非常容易了: 
Erlang代码   收藏代码
  1. -module(my_module).  
  2. -author('your@mail.com').  
  3. -behaviour(gen_mod).  
  4. -include('ejabberd.hrl').  
  5.   
  6. %% gen_mod callback  
  7. -export([start/2, stop/1]).  
  8.   
  9. start(_Host, _Opt) -> ok.  
  10. stop(_Host) -> ok.  


让我们在添加一代码,让我们这个“无用”的mod更加清晰一些 
Erlang代码   收藏代码
  1. start(_Host, _Opt) ->  
  2.     ?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代码   收藏代码
  1. {modules,  
  2.  [  
  3.   {mod_register, [{access, register}]},  
  4.   ...  
  5.   {my_module, []}  % []为my_module:start/2中的第二个参数  
  6.   ]}.  

好了,一切OK后,重新启动ejabberd,如果你的loglevel设置为5,那么你将看到如下信息: 
Erlang代码   收藏代码
  1. =INFO REPORT==== 2008-07-17 15:33:27 ===  
  2. 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,我们可以实现任何我们想要的功能。 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!