首先,xmpp服務器是基於ejabberd。離線消息模塊是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact; 修改后實現群聊離線消息:https://github.com/Joywok/mod_interact
不僅僅要修改這一個文件,還涉及到ehabberd_sm、mod_muc_room、mod_offline三個模塊的修改。
以上三個文件僅僅只需要屏蔽或者修改幾行代碼就能實現了,很簡單的。
ehabberd_sm屏蔽以下兩行代碼:
1
2
|
<<
"groupchat"
>> ->
bounce_offline_message(From, To, Packet);
|
mod_offline:
將下面一行代碼修改
1
|
if
(Type /= <<
"error"
>>) and (Type /= <<
"groupchat"
>>)
|
修改后的:
1
|
if
(Type /= <<
"error"
>>)
|
mod_muc_room這個模塊多要修改幾行,muc只是給在線的用戶發送消息,那么不在線的用戶就收不到了,所以在發送消息那塊把發送在線的用戶修改為muc的成員就ok了。
把以下一個遍歷代碼修改:
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)),
|
修改后的代碼:
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了。
按照這個就能簡單的實現群聊離線消息了。
貼上github實現地址:https://github.com/cisiqo/ejabberd-module-dev