Вопрос

Я пытаюсь получить онлайн друзей по пользователю в 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 .

Так что у него есть "ejabberdctl inning_users", которые возвращают пользователей онлайн.

Так что в вашем приложении модели с использованием GEM REST-CLIEND вы можете сделать что-то подобное:

def online_users
    response = RestClient.post('http://localhost:5280/rest', "connected_users")
    response
end
.

Другие советы

Вы будете намного счастливее в долгосрочной перспективе, если вы используете библиотеку, такую как strophe.js В браузере, разговаривая с сервером XMPP, который имеет bosh включен.Снимки присутствия никогда не так же интересны, как вы ожидаете, что они будут иметь действительно плохую проблемы аутентификации / авторизации на пути, который вы загораетесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top