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

时间:2009-11-08 23:45:43

标签: ruby xmpp xmpp4r

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

以同步方式查找给定JID是否在线最简单的方法是什么? (这样我可以在if语句中调用类似is_online?(jid)的内容)

我的详细信息:

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

现在,我知道如果我连接并等待几秒钟以便所有初始状态探测器响应返回到Roster帮助器,那么我可以检查我的Roster中的任何存在并调用#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?

的状态之前,如何检查名单何时完成所有初始状态更新

1 个答案:

答案 0 :(得分:1)

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