我刚接触过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?
函数永远不会返回值。
有人能提供一个简单的例子来帮助我吗?我可以调用的函数,或将我指向正确的方向,以了解在我尝试检查是否存在之前,如何检测花名册何时完成所有初始状态更新。
在线?