`
koteancno
  • 浏览: 32092 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Ejabberd roster关系改变,发送type=unavailable 的presence

阅读更多

在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,至于客户端要怎么样展示的效果,可以由客户端自已去操作.

 

 

分享到:
评论

相关推荐

    android+ejabberd

    IM(ejabberd)服务器的客户端android开发的代码详解,该代码例子包含单聊、群聊、发送文字、发送及接收文件等功能。

    ejabberd 服务器测试客户端spark

    8. **离线消息**:当用户离线时,ejabberd服务器应该能存储发送给他们的消息,并在他们上线时转发。通过模拟离线和上线,可以测试这一特性。 9. **推送通知**:对于移动设备,ejabberd可以通过第三方服务(如APNs或...

    iOS xmpp ejabberd服务器

    iOS即时通讯系统在近年来变得越来越流行,而XMPP(Extensible Messaging and Presence Protocol)作为一款开放标准的协议,被广泛应用于此类系统中。本文件主要关注的是如何在iOS平台上使用XMPP与ejabberd服务器进行...

    Android使用smack连接ejabberd服务器注册、收发消息

    在Android平台上,开发即时通讯应用时,我们常常会利用XMPP(Extensible Messaging and Presence Protocol)协议来实现。本文将详细讲解如何使用Smack库连接到ejabberd服务器,并进行用户注册、登录以及收发消息的...

    Android IM开发 Ejabberd+asmck+spack

    Ejabberd是一款开源的XMPP(Extensible Messaging and Presence Protocol)服务器,它是IM系统的核心组件。XMPP是一种基于XML的协议,广泛用于即时通讯,提供实时通讯和消息传递功能。Ejabberd支持多种编程语言的API...

    ejabberd源码

    ejabberd是一款强大的即时通讯服务器,它基于Jabber/XMPP协议,这使得ejabberd能够支持丰富的交互式通信功能,如文本聊天、音视频通话、群聊、文件传输等。作为一款开源软件,ejabberd遵循GPLv2许可证,允许用户自由...

    ejabberd 群聊 strophe.js 实现

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,用于实现即时通信和在线状态传输。在这个场景中,我们关注的是如何使用strophe.js库在前端实现与ejabberd服务器的交互,特别是群聊...

    ejabberd windows installer

    ejabberd是一款开源的XMPP服务器,它基于Erlang编程语言,提供高度可扩展性和高并发处理能力。在Windows环境下,ejabberd通常通过安装程序进行部署,这正是"ejabberd windows installer"所涉及的内容。Ejabberd不...

    ejabberd安装配置[归纳].pdf

    Ejabberd安装配置详解 Ejabberd是一款流行的开源即时通讯服务器软件,具有高度灵活性和可扩展性。下面是Ejabberd安装配置的详细知识点解析: Ejabberd下载 Ejabberd的下载可以从官方网站获取,目前支持多种操作...

    ejabberd的安装包

    ejabberd安装包,很好的工具!适合安装!一定会很好用的!

    ejabberd-14.07聊天服务器

    ejabberd是一款高度可扩展且稳定可靠的XMPP聊天服务器,专为满足现代通信需求而设计。这款服务器在IT行业中广泛应用于构建实时通讯系统,尤其是针对手机端应用,如Android和iOS的聊天功能。ejabberd的强大在于其灵活...

    ejabberd-2.1.11

    windows环境下的ejabberd。。。点击即可安装

    ejabberd-15.07-osx-installer.app.zip

    ejabberd是一款开源的XMPP服务器,广泛应用于实时通讯系统,如即时消息、在线状态显示、多用户聊天室等功能的实现。它基于Erlang编程语言,这使得ejabberd具有高度可扩展性和高容错性。 ejabberd-15.07-osx-...

    ejabberd安装配置.docx

    Ejabberd 安装配置 Ejabberd 是一个基于 XMPP 协议的 instant messaging 服务器,主要用于实时通信和即时消息传递。下面是 Ejabberd 安装配置的相关知识点: 一、Ejabberd 下载 Ejabberd 的安装需要从官方网站...

    ejabberd服务器安装及客户端注册文档

    在进行IT项目管理时,特别是涉及到服务器安装和客户端注册的场景,ejabberd是一个非常重要的开源即时通讯服务器,它基于XMPP(Extensible Messaging and Presence Protocol)协议,这个协议是国际开放标准用于即时...

    ejabberd中mod_privacy_odbc.erl实现没有完全遵循xmpp协议

    ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统。在ejabberd中,`mod_privacy_odbc.erl`是用于处理用户隐私列表模块的一部分,该模块与数据库(通常通过ODBC接口)交互来存储和管理用户的隐私设置。然而...

    ejabberd_rest_client:面向ejabberd的REST客户端

    ejabberd_rest_client是与ejabberd服务器交互的一个客户端库,它利用ejabberd的API接口,通过RESTful方式来操作ejabberd服务器,实现了对ejabberd服务器的远程控制和数据管理。 ejabberd API是ejabberd服务器提供的...

    Ejabberd-2.1.10-mac

    Ejabberd是一款高度可扩展、安全且可靠的即时通讯服务器软件,主要基于XMPP协议。在标题"Ejabberd-2.1.10-mac"中,我们可以推断这是一份针对Mac平台的Ejabberd服务器软件的特定版本,即2.1.10。这个版本可能包含了...

    xmpp-auth:ejabberd 的外部认证脚本

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,常用于即时消息和在线状态服务。Ejabberd是一款开源、跨平台的XMPP服务器,支持多种身份验证方式,包括本地数据库验证、外部脚本...

    Ejabberd-Packet-Interceptor:拦截和更改消息的 Ejabberd 模块

    Ejabberd-Packet-Interceptor 拦截和更改消息的 Ejabberd 模块这个模块接受一个 Ejabberd 消息包,改变消息体并发送它。 该模块挂钩 packet_filter 并检查每个数据包是否有消息正文。 如果有消息正文,它会对其进行 ...

Global site tag (gtag.js) - Google Analytics