# =XMPP4R - XMPP Library for Ruby
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
# Website::http://home.gna.org/xmpp4r/
require 'xmpp4r/discovery'
module Jabber
module PubSub
class NodeBrowser
##
# Initialize a new NodeBrowser
# new(stream,pubsubservice)
# stream:: [Jabber::Stream]
def initialize(stream)
@stream = stream
end
##
# Retrieve the nodes
# Throws an ServerError when receiving
#
# jid:: [JID] Target entity (set only domain!)
# return:: [Array] of [String] or [nil]
def nodes(jid)
iq = Iq.new(:get,jid)
iq.from = @stream.jid
iq.add(Discovery::IqQueryDiscoItems.new)
nodes = []
@stream.send_with_id(iq) do |answer|
answer.query.each_element('item') { |item|
nodes.push(item.node)
}
end
nodes
end
##
# Retrieve the nodes with names
# Throws a ServerError when receiving
#
# jid:: [Jabber::JID] Target entity (set only domain!)
# return:: [Array] of [Hash] with keys 'node' => [String] and 'name' => [String] or [nil]
def nodes_names(jid)
iq = Iq.new(:get,jid)
iq.from = @stream.jid
iq.add(Discovery::IqQueryDiscoItems.new)
nodes = []
@stream.send_with_id(iq) do |answer|
answer.query.each_element('item') do |item|
nodes.push( {'node' => item.node,'name' => item.iname } )
end
end
nodes
end
##
# Retrieve the items from a node
# Throws an ServerError when receiving
#
# jid:: [Jabber::JID] Target entity (set only domain!)
# node:: [String]
# return:: [Array] of [Hash] with keys 'name' => [String] and 'jid' => [Jabber::JID]
def items(jid,node)
iq = Iq.new(:get,jid)
iq.from = @stream.jid
discoitems = Discovery::IqQueryDiscoItems.new
discoitems.node = node
iq.add(discoitems)
items = []
err = nil
@stream.send_with_id(iq) do |answer|
answer.query.each_element('item') { |item|
items.push( {'jid' => item.jid,'name' => item.iname } )
}
end
items
end
##
# get disco info for a node
# jid:: [Jabber::JID]
# node:: [String]
# return:: [Hash] with possible keys type:: [String] ,category:: [String],features:: [Array] of feature, nodeinformation:: [Jabber::XData]
# check http://www.xmpp.org/extensions/xep-0060.html#entity for more infos
def get_info(jid,node)
iq = Iq.new(:get,jid)
iq.from = @stream.jid
discoinfo = Discovery::IqQueryDiscoInfo.new
discoinfo.node = node
iq.add(discoinfo)
info = {}
@stream.send_with_id(iq) do |answer|
identity = answer.query.identity
info['type'] = identity.type
info['category'] = identity.category
info['features'] = answer.query.features
answer.query.each_element('x') { |x|
info['nodeinformation'] = x
}
end
info
end
# this is only for a xep <-> nodebrowser.rb understanding
alias get_metadata get_info
##
# get type of node
# jid:: [Jabber::JID]
# node:: [String]
#
def type(jid,node)
info = get_info(jid,node)
return info['type']
end
##
# get category of node
# jid:: [Jabber::JID]
# node:: [String]
#
def category(jid,node)
info = get_info(jid,node)
return info['category']
end
end #class
end #module
end #module