2

我正在尝试通过 XMPP 服务器(Ejabberd)中的用户获取在线朋友。我正在使用 Ruby on Rails 3.2。这个想法是在数组中添加所有在线用户以在视图页面上使用它。

我找到了异步代码(如下),但它使用 Thread 并且很难使用控制器方法。

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 请求。

所以它有“ejabberdctl connected_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 回答