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