2011-12-05 141 views
3

我想知道用户何时登录并从自定义模块中的ejabberd会话中注销,而无需更改ejabberd代码。拦截登录/注销ejabberd

我需要这样做,因为我必须在用户登录时执行一些操作并清理用户注销时执行的操作。另外,在某些情况下,我需要能够注销用户。

那么,有没有办法扩展一些模块来获得这些功能?我仍然在寻找一些可以帮助我的文档。

+0

使用ejabberd挂钩,http://www.process-one.net/en/wiki/ejabberd_events_and_hooks /。你需要user_available_hook,set_presence_hook和unset_presence_hook – 0xAX

+1

'user_available_hook'是做什么的?我知道,通过set_presence和unset_presence,我可以在用户登录或退出时(以及其他)获取事件。那么这个user_available呢? – RobisonSantos

回答

9

你可以编写自己的代码,并构建它有一个插件,其行为genjmod,ejabberd给你。 一个很好的开始是blog/tutorial,接着是next part。 这应该够了,但你会在同一个博客上找到更多。

后你会得到一点更舒服构建自己的模块,我建议你看一看挂钩set_presence_hookunset_presence_hook

只需注意set_presence_hook被激活每一个存在设置,不受时间只有在登录时,如果可以的话,你只需要解决这个问题。

长话短说,你将最终像下面

-module(mod_your_mod). 

-behavior(gen_mod). 
-include("ejabberd.hrl"). 

-export([start/2, stop/1, on_set/4, on_unset/4]). 

start(Host, _Opts) -> 
    ejabberd_hooks:add(set_presence_hook, Host, ?MODULE, on_set, 50), 
    ejabberd_hooks:add(unset_presence_hook, Host, ?MODULE, on_unset, 50), 
    ok. 

stop(Host) -> 
    ejabberd_hooks:delete(set_presence_hook, Host, ?MODULE, on_set, 50), 
    ejabberd_hooks:delete(unset_presence_hook, Host, ?MODULE, on_unset, 50), 
    ok. 

on_set(User, Server, _Resource, _Packet) -> 
<presence code>  

on_unset(User, Server, _Resource, _Packet) -> 
<offline code> 

希望这有助于

+0

谢谢,这为我工作。 – RobisonSantos

+0

任何想法为什么set_presence_hook被触发两次? – nhenrique

+0

@ nuno-freitas不是钩** user_available_hook **是右钩? –