Получите онлайн-пользователи XMPP4R + Rails
-
13-12-2019 - |
Вопрос
Я пытаюсь получить онлайн друзей по пользователю в XMPP Server (Ejabberd).Я использую Ruby на рельсах 3.2. Идея состоит в том, чтобы добавить в массиве всех онлайн-пользователей, чтобы использовать эту на странице просмотра.
Я нашел асинхронный код (ниже), но он использует нить, и его трудно работать над методом контроллера.
jid = Jabber::JID.new('user@localhost')
cl = Jabber::Client.new(jid)
cl.connect
cl.auth('123456')
@online_users = [] #online users queue
roster = Jabber::Roster::Helper.new(cl)
mainthread = Thread.current
roster.add_presence_callback { |item,oldpres,pres|
if item.online?
@online_users.push item
else
@online_users.delete_if {|x| x.jid == item.jid }
end
puts @online_users.inspect
puts "#{item.jid} - online: #{item.online?}"
}
cl.send(Jabber::Presence.new.set_show(:dnd))
t = Thread.new { sleep XMPP_REQUEST_TIMEOUT; mainthread.wakeup;}
Thread.stop
cl.close
.
Поэтому мне нужен какой-то синхронный код, или какой-то способ выполнить этот тип кода в методе контроллера.
спасибо.
Решение
Для этого нашел другое решение, которое поможет мне:
Я установил mod_rest в сервере ejabberd.Этот модуль позволяет сделать HTTP-запрос концевых команд
Так что у него есть "ejabberdctl inning_users", которые возвращают пользователей онлайн.
Так что в вашем приложении модели с использованием
def online_users
response = RestClient.post('http://localhost:5280/rest', "connected_users")
response
end
. Другие советы
Вы будете намного счастливее в долгосрочной перспективе, если вы используете библиотеку, такую как strophe.js В браузере, разговаривая с сервером XMPP, который имеет bosh включен.Снимки присутствия никогда не так же интересны, как вы ожидаете, что они будут иметь действительно плохую проблемы аутентификации / авторизации на пути, который вы загораетесь.