Как использовать 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. Вы просто должны спросить, что вы хотите, а затем ждать, пока ваш обработчик ответа не сработает, когда ответ придет.

Другие вопросы по тегам