基于ejabberd简单实现xmpp群聊离线消息

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

相关文章
相关标签/搜索