2

我是 XMPP 和 xmpp4r 库的新手,所以如果这明显记录在某处,请原谅我的菜鸟问题。

以同步方式找出给定 JID 是否在线的最直接方法是什么?(这样我就可以在 if 语句中调用类似 is_online?(jid) 的东西)

我的细节:

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

现在,我知道如果我连接并等待几秒钟让所有初始存在探测响应返回到名册助手,那么我可以从我的名册中检查任何这些存在并调用#online?在他们身上获得正确的价值。但是,我不知道何时发送了所有状态更新,因此存在竞争条件,#online?如果我还没有收到状态探测响应,有时从我的名册中调用状态会返回 false。

所以,我目前的想法是,找出某人是否在线的最直接的方法是构建一个新的 Presence 类型的消息 :probe 并将其发送到我感兴趣的 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?函数永远不会完成返回值。

任何人都可以通过提供一个简单的示例 is_online 来帮助我吗?我可以调用的函数,或者指出我如何检测花名册何时完成获取所有初始存在更新的正确方向,然后再尝试检查存在#online?

4

1 回答 1

1

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

于 2010-03-17T21:54:27.650 回答