首先,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