首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让在线用户使用XMPP4r + Rails

让在线用户使用XMPP4r + Rails
EN

Stack Overflow用户
提问于 2012-05-23 01:33:55
回答 2查看 1.5K关注 0票数 2

我正在尝试在XMPP服务器(Ejabberd)中按用户获取在线好友。我使用的是Ruby on Rails 3.2。这个想法是在数组中添加所有在线用户,以便在查看页面上使用它。

我发现了异步代码(如下所示),但它使用线程,并且很难在控制器方法上工作。

代码语言:javascript
复制
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

所以我需要一些同步代码,或者某种在控制器方法中执行这类代码的方法。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-05 22:07:28

为此,我找到了另一个对我有帮助的解决方案:

我在ejabberd服务器上安装了一个mod_rest。此模块允许您对ejabberdctl的终端命令进行HTTP请求。

所以它有"ejabberdctl connected_users",返回在线用户。

因此,在使用gem rest-client的模型应用程序中,您可以执行以下操作:

代码语言:javascript
复制
def online_users
    response = RestClient.post('http://localhost:5280/rest', "connected_users")
    response
end
票数 3
EN

Stack Overflow用户

发布于 2012-05-23 23:45:05

如果您在浏览器中使用像Strophe.js这样的库与启用了BOSH的XMPP服务器对话,那么从长远来看,您会更高兴。在线状态的快照永远不会像你期望的那样有趣,而且在你前进的道路上,你会遇到非常糟糕的身份验证/授权问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10707084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档