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