Как использовать xmpp4r Ruby gem, как я могу синхронно обнаружить, находится ли контакт в сети?
Я новичок в XMPP и библиотеке xmpp4r, поэтому, пожалуйста, прости мой вопрос noob, если это явно задокументировано где-то.
Каким самым простым и синхронным способом выяснить, подключен ли данный JID к сети? (чтобы я мог вызвать что-то вроде is_online?(jid) в операторе if)
Мои детали:
Я пишу приложение Sinatra, которое попытается отправить сообщение пользователю, когда на веб-сервере будет запрошен определенный URL, но оно должно пытаться отправить сообщение пользователю только в том случае, если этот пользователь в данный момент находится в сети. Выяснить, является ли данный JID онлайн, моя проблема.
Теперь я знаю, что если я подключусь и подожду несколько секунд, чтобы все начальные ответы зондов присутствия вернулись к помощнику реестра, тогда я смогу проверить любое из этих присутствий в моем списке и вызвать #online? на них, чтобы получить правильное значение. Но я не знаю, когда все обновления присутствия были отправлены, так что там есть условие гонки и иногда звонит #online?
Присутствие из моего списка вернет false, если я просто еще не получил ответ от датчика присутствия.
Итак, мое текущее мышление заключается в том, что самый простой способ выяснить, находится ли кто-то в сети, - это создать новое сообщение о присутствии типа: исследование и отправить его в 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 ответ
Как выясняется, нет синхронного способа запросить присутствие JID. Вы просто должны спросить, что вы хотите, а затем ждать, пока ваш обработчик ответа не сработает, когда ответ придет.