【问题标题】:Get online users XMPP4r + Rails获取在线用户 XMPP4r + Rails
【发布时间】:2012-05-29 05:48:56
【问题描述】:

我正在尝试通过 XMPP 服务器 (Ejabberd) 中的用户获取在线朋友。我正在使用 Ruby on Rails 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

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

谢谢。

【问题讨论】:

    标签: ruby-on-rails xmpp ejabberd xmpp4r


    【解决方案1】:

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

    我在 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
    

    【讨论】:

    • BIG +1 多么巧妙的实现。是否也可以以这种方式操纵名册?
    • 是的。所有与 ejabberdctl 一起使用的方法你都可以做到。
    【解决方案2】:

    从长远来看,如果您在浏览器中使用像 Strophe.js 这样的库来执行此操作,并与启用了 BOSH 的 XMPP 服务器通信,那么从长远来看,您会更快乐。存在快照永远不会像您期望的那样有趣,并且在您前进的道路上会遇到非常糟糕的身份验证/授权问题。

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 2012-07-05
      • 2011-06-25
      • 2015-10-14
      • 2011-10-15
      • 2013-02-13
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多