2

XMPPサーバー(Ejabberd)でユーザーごとにオンラインの友達を取得しようとしています。Ruby onRails3.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

したがって、同期コード、またはこの種のコードをコントローラーメソッドで実行する方法が必要です。

ありがとう。

4

2 に答える 2

3

このために私を助ける別の解決策を見つけました:

ejabberdサーバーにmod_restをインストールしました。このモジュールを使用すると、ejabberdctlのターミナルコマンドのHTTPリクエストを実行できます。

したがって、ユーザーをオンラインに戻す「ejabberdctlconnected_users」があります。

したがって、 gem rest-clientを使用するモデルアプリでは、次のようなことができます。

def online_users
    response = RestClient.post('http://localhost:5280/rest', "connected_users")
    response
end
于 2012-07-05T14:07:27.653 に答える
1

Strophe.jsのようなライブラリを使用してブラウザでこれを実行し、 BOSHが有効になっているXMPPサーバーと通信すると、長期的にははるかに幸せになります。プレゼンスのスナップショットは、期待するほど興味深いものではありません。また、進むべき道で、認証/承認の問題が非常にひどくなるでしょう。

于 2012-05-23T15:45:04.567 に答える