在ejabberd 2.1.3版本中的ejabberd_c2s.erl中,有这么一段代码:
roster_change(IJID, ISubscription, StateData) ->
LIJID = jlib:jid_tolower(IJID),
IsFrom = (ISubscription == both) or (ISubscription == from),
IsTo = (ISubscription == both) or (ISubscription == to),
OldIsFrom = ?SETS:is_element(LIJID, StateData#state.pres_f),
FSet = if IsFrom ->
?SETS:add_element(LIJID, StateData#state.pres_f);
true ->
remove_element(LIJID, StateData#state.pres_f)
end,
TSet = if IsTo ->
?SETS:add_element(LIJID, StateData#state.pres_t);
true ->
remove_element(LIJID, StateData#state.pres_t)
end,
case StateData#state.pres_last of
undefined -> StateData#state{pres_f = FSet, pres_t = TSet};
P ->
?DEBUG("roster changed for ~p~n", [StateData#state.user]),
From = StateData#state.jid,
To = jlib:make_jid(IJID),
Cond1 = (not StateData#state.pres_invis) and IsFrom and (not OldIsFrom),
Cond2 = (not IsFrom) and OldIsFrom and
(?SETS:is_element(LIJID, StateData#state.pres_a) or
?SETS:is_element(LIJID, StateData#state.pres_i)),
if Cond1 ->
?DEBUG("C1: ~p~n", [LIJID]),
case ejabberd_hooks:run_fold(privacy_check_packet,
StateData#state.server,
allow,
[StateData#state.user,
StateData#state.server,
StateData#state.privacy_list,
{From, To, P},
out]) of
deny ->
ok;
allow ->
ejabberd_router:route(From, To, P)
end,
A = ?SETS:add_element(LIJID, StateData#state.pres_a),
StateData#state{pres_a = A, pres_f = FSet, pres_t = TSet};
Cond2 ->
?DEBUG("C2: ~p~n", [LIJID]),
PU = {xmlelement, "presence", [{"type", "unavailable"}], []},
case ejabberd_hooks:run_fold(privacy_check_packet,
StateData#state.server,
allow,
[StateData#state.user,
StateData#state.server,
StateData#state.privacy_list,
{From, To, PU},
out]) of
deny ->
ok;
allow ->
ejabberd_router:route(From, To, PU)
end,
I = remove_element(LIJID, StateData#state.pres_i),
A = remove_element(LIJID, StateData#state.pres_a),
StateData#state{pres_i = I, pres_a = A, pres_f = FSet, pres_t = TSet};
true ->
StateData#state{pres_f = FSet, pres_t = TSet}
end
end.
此代码的功能是当用户的roster发生变化时,会发送一些package给用户.
前几日在测时发现,删除好友时,这个unavailable类的presence 发送的类乎有点问题:
1.当A删除好友B时,B总是收到A发送过来的 <presence type="unavailable"/>,结果导致,A在B这边下线了.这样是不对的.
2.所以个人觉得,将发送unavailable的这一行去掉,就是说无论好友关系发生什么变化,都不发送unavaible,至于客户端要怎么样展示的效果,可以由客户端自已去操作.
分享到:
相关推荐
IM(ejabberd)服务器的客户端android开发的代码详解,该代码例子包含单聊、群聊、发送文字、发送及接收文件等功能。
8. **离线消息**:当用户离线时,ejabberd服务器应该能存储发送给他们的消息,并在他们上线时转发。通过模拟离线和上线,可以测试这一特性。 9. **推送通知**:对于移动设备,ejabberd可以通过第三方服务(如APNs或...
iOS即时通讯系统在近年来变得越来越流行,而XMPP(Extensible Messaging and Presence Protocol)作为一款开放标准的协议,被广泛应用于此类系统中。本文件主要关注的是如何在iOS平台上使用XMPP与ejabberd服务器进行...
在Android平台上,开发即时通讯应用时,我们常常会利用XMPP(Extensible Messaging and Presence Protocol)协议来实现。本文将详细讲解如何使用Smack库连接到ejabberd服务器,并进行用户注册、登录以及收发消息的...
Ejabberd是一款开源的XMPP(Extensible Messaging and Presence Protocol)服务器,它是IM系统的核心组件。XMPP是一种基于XML的协议,广泛用于即时通讯,提供实时通讯和消息传递功能。Ejabberd支持多种编程语言的API...
ejabberd是一款强大的即时通讯服务器,它基于Jabber/XMPP协议,这使得ejabberd能够支持丰富的交互式通信功能,如文本聊天、音视频通话、群聊、文件传输等。作为一款开源软件,ejabberd遵循GPLv2许可证,允许用户自由...
XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,用于实现即时通信和在线状态传输。在这个场景中,我们关注的是如何使用strophe.js库在前端实现与ejabberd服务器的交互,特别是群聊...
ejabberd是一款开源的XMPP服务器,它基于Erlang编程语言,提供高度可扩展性和高并发处理能力。在Windows环境下,ejabberd通常通过安装程序进行部署,这正是"ejabberd windows installer"所涉及的内容。Ejabberd不...
Ejabberd安装配置详解 Ejabberd是一款流行的开源即时通讯服务器软件,具有高度灵活性和可扩展性。下面是Ejabberd安装配置的详细知识点解析: Ejabberd下载 Ejabberd的下载可以从官方网站获取,目前支持多种操作...
ejabberd安装包,很好的工具!适合安装!一定会很好用的!
ejabberd是一款高度可扩展且稳定可靠的XMPP聊天服务器,专为满足现代通信需求而设计。这款服务器在IT行业中广泛应用于构建实时通讯系统,尤其是针对手机端应用,如Android和iOS的聊天功能。ejabberd的强大在于其灵活...
windows环境下的ejabberd。。。点击即可安装
ejabberd是一款开源的XMPP服务器,广泛应用于实时通讯系统,如即时消息、在线状态显示、多用户聊天室等功能的实现。它基于Erlang编程语言,这使得ejabberd具有高度可扩展性和高容错性。 ejabberd-15.07-osx-...
Ejabberd 安装配置 Ejabberd 是一个基于 XMPP 协议的 instant messaging 服务器,主要用于实时通信和即时消息传递。下面是 Ejabberd 安装配置的相关知识点: 一、Ejabberd 下载 Ejabberd 的安装需要从官方网站...
在进行IT项目管理时,特别是涉及到服务器安装和客户端注册的场景,ejabberd是一个非常重要的开源即时通讯服务器,它基于XMPP(Extensible Messaging and Presence Protocol)协议,这个协议是国际开放标准用于即时...
ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统。在ejabberd中,`mod_privacy_odbc.erl`是用于处理用户隐私列表模块的一部分,该模块与数据库(通常通过ODBC接口)交互来存储和管理用户的隐私设置。然而...
ejabberd_rest_client是与ejabberd服务器交互的一个客户端库,它利用ejabberd的API接口,通过RESTful方式来操作ejabberd服务器,实现了对ejabberd服务器的远程控制和数据管理。 ejabberd API是ejabberd服务器提供的...
Ejabberd是一款高度可扩展、安全且可靠的即时通讯服务器软件,主要基于XMPP协议。在标题"Ejabberd-2.1.10-mac"中,我们可以推断这是一份针对Mac平台的Ejabberd服务器软件的特定版本,即2.1.10。这个版本可能包含了...
XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,常用于即时消息和在线状态服务。Ejabberd是一款开源、跨平台的XMPP服务器,支持多种身份验证方式,包括本地数据库验证、外部脚本...
Ejabberd-Packet-Interceptor 拦截和更改消息的 Ejabberd 模块这个模块接受一个 Ejabberd 消息包,改变消息体并发送它。 该模块挂钩 packet_filter 并检查每个数据包是否有消息正文。 如果有消息正文,它会对其进行 ...