2011-12-05 140 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 **是右鉤? –