首先,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了。
按照这个就能简单的实现群聊离线消息了。
原文:http://www.cnblogs.com/yanwei-wang/p/4705413.html