代码之家  ›  专栏  ›  技术社区  ›  Gabe Hollombe

使用xmpp4r ruby gem,如何同步发现联系人是否在线?

  •  2
  • Gabe Hollombe  · 技术社区  · 15 年前

    我刚接触过XMPP和XMPP4R库,所以如果这显然是在某个地方记录的,请原谅我的noob问题。

    以同步方式找出给定JID是否在线的最直接的方法是什么?(这样我就可以打电话给类似“在线吗?”(jid)在if语句中)

    我的细节:

    我正在编写一个Sinatra应用程序,当Web服务器上请求特定的URL时,它将尝试向用户发送消息,但如果该用户当前联机,它只应尝试向该用户发送消息。弄清楚给定的jid是否在线是我的问题。

    现在,我知道,如果我连接并等待几秒钟,让所有初始存在探测响应返回到花名册助手,那么我可以检查花名册中的任何存在,并在线呼叫?以获得正确的值。但是,我不知道何时所有状态更新都已发送,因此存在一个竞争条件,有时会呼叫 #online? 如果我还没有收到状态探测响应,我的花名册上的状态将返回假。

    因此,我目前的想法是,找出某人是否在线的最直接的方法是构建一个新的存在消息类型:探测并将其发送给我感兴趣的JID。我现在是这样做的:

    #jabber is the result of Client::new
    #email is the jid I'm interested in polling
    def is_online?(jabber, email)
          online = false
          p = Presence.new
          p.set_to(email)
          p.set_from(jabber.jid)
          p.set_type(:probe)
          pres = jabber.send(p) do |returned_presence|
            online = returned_presence.nil?
          end
    
         return online
    end
    

    现在,这在用户实际在线的情况下有效,但是当用户离线时,看起来返回的状态探测消息被其他人捕获了。 presence_callback 不知道如何处理它的处理程序,以及我的 is_online? 函数永远不会返回值。

    有人能提供一个简单的例子来帮助我吗?我可以调用的函数,或将我指向正确的方向,以了解在我尝试检查是否存在之前,如何检测花名册何时完成所有初始状态更新。 在线?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Gabe Hollombe    14 年前

    事实证明,没有同步的方式来请求JID的存在。您只需要请求您想要什么,然后等待响应处理程序在响应到达时触发。