Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 获取在线用户XMPP4r+;轨道_Ruby On Rails_Xmpp_Ejabberd_Xmpp4r - Fatal编程技术网

Ruby on rails 获取在线用户XMPP4r+;轨道

Ruby on rails 获取在线用户XMPP4r+;轨道,ruby-on-rails,xmpp,ejabberd,xmpp4r,Ruby On Rails,Xmpp,Ejabberd,Xmpp4r,我正在尝试在XMPP服务器(Ejabberd)中通过用户获得在线朋友。我正在使用RubyonRails3.2。 其想法是将所有在线用户添加到数组中,以便在查看页面上使用此功能 我发现了异步代码(如下),但它使用线程,并且很难使用控制器方法 jid = Jabber::JID.new('user@localhost') cl = Jabber::Client.new(jid) cl.connect cl.auth('123456') @online_users = [] #online user

我正在尝试在XMPP服务器(Ejabberd)中通过用户获得在线朋友。我正在使用RubyonRails3.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
所以我需要一些同步代码,或者一些在控制器方法中执行此类代码的方法

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

谢谢。

如果您在浏览器中使用类似这样的库,并与已启用的XMPP服务器交谈,那么从长远来看,您会更快乐。状态快照永远不会像您期望的那样有趣,在您前进的道路上,您将遇到非常糟糕的身份验证/授权问题。

如果您在浏览器中使用类似于此的库,并与启用了此功能的XMPP服务器交谈,那么从长远来看,您将更加快乐。状态快照永远不会像您期望的那样有趣,在您前进的道路上,您将遇到非常糟糕的身份验证/授权问题。

为此,我们找到了另一种解决方案,可以帮助我:

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

所以它有“ejabberdctl连接的_用户”,可以在线返回用户

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

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

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

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

所以它有“ejabberdctl连接的_用户”,可以在线返回用户

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

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

大+1是一个多么简洁的实现。有没有可能以这种方式操纵花名册?是的。所有与ejabberdctl一起使用的方法你都可以做到。BIG+1多么简洁的实现啊。也可以用这种方式操纵排班吗?是的,所有使用ejabberdctl的方法都可以。