基於ejabberd簡單實現xmpp羣聊離線消息

首先,xmpp服務器是基於ejabberd。離線消息模塊是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact; 修改後實現羣聊離線消息:https://github.com/Joywok/mod_interactjava

不單單要修改這一個文件,還涉及到ehabberd_sm、mod_muc_room、mod_offline三個模塊的修改。git

以上三個文件僅僅只須要屏蔽或者修改幾行代碼就能實現了,很簡單的。github

ehabberd_sm屏蔽如下兩行代碼:服務器

1
2
<< "groupchat" >> ->
bounce_offline_message(From, To, Packet);

mod_offline: 
將下面一行代碼修改spa

1
if (Type /= << "error" >>) and (Type /= << "groupchat" >>)

修改後的:code

1
if (Type /= << "error" >>)

mod_muc_room這個模塊多要修改幾行,muc只是給在線的用戶發送消息,那麼不在線的用戶就收不到了,因此在發送消息那塊把發送在線的用戶修改成muc的成員就ok了。router

把如下一個遍歷代碼修改:ci

1
2
3
4
5
6
7
8
9
lists:foreach(
  fun({_LJID, Info}) ->
  ejabberd_router:route(
  jlib:jid_replace_resource(
StateData#state.jid,
FromNick),
Info#user.jid,
  Packet)
  end,?DICT:to_list(StateData#state.users)),

修改後的代碼:string

1
2
3
4
5
6
7
8
9
10
11
12
lists:foreach(
  fun(Info) ->
  {Jid,_} = Info,
{Email,Server,Source}=Jid,
To={ 'jid' ,Email,Server,Source,Email,Server,Source},
ejabberd_router:route(
jlib:jid_replace_resource(
  StateData#state.jid,
FromNick),
To,
Packet)
end,?DICT:to_list(StateData#state.affiliations)),

從新編譯模塊,替換原來的模塊,重啓ejabberd服務器就ok了。it

按照這個就能簡單的實現羣聊離線消息了。

貼上github實現地址:https://github.com/cisiqo/ejabberd-module-dev 

相關文章
相關標籤/搜索