lib/blather/stanza/iq/roster.rb in blather-0.3.4 vs lib/blather/stanza/iq/roster.rb in blather-0.4.0
- old
+ new
@@ -5,76 +5,87 @@
class Roster < Query
register :roster, nil, 'jabber:iq:roster'
##
# Any new items are added to the query
- def initialize(type = nil, item = nil)
- super type
- query << item if item
+ def self.new(type = nil, item = nil)
+ node = super type
+ node.query << item if item
+ node
end
##
# Inherit the XMPPNode to create a proper Roster object.
# Creates RosterItem objects out of each roster item as well.
def inherit(node)
# remove the current set of nodes
- items.each { |i| i.remove! }
+ remove_children :item
super
# transmogrify nodes into RosterItems
- items.each { |i| query << RosterItem.new(i); i.remove! }
+ items.each { |i| query << RosterItem.new(i); i.remove }
self
end
##
# Roster items
def items
- items = query.find('//item', self.class.ns)
- items = query.find('//query_ns:item', :query_ns => self.class.ns) if items.empty?
- items.map { |i| RosterItem.new(i) }
+ query.find('//ns:item', :ns => self.class.registered_ns).map { |i| RosterItem.new(i) }
end
class RosterItem < XMPPNode
##
# [jid] may be either a JID or XMPPNode.
# [name] name alias of the given JID
# [subscription] subscription type
# [ask] ask subscription sub-state
- def initialize(jid = nil, name = nil, subscription = nil, ask = nil)
- super :item
+ def self.new(jid = nil, name = nil, subscription = nil, ask = nil)
+ new_node = super :item
- if jid.is_a?(XML::Node)
- self.inherit jid
+ case jid
+ when Nokogiri::XML::Node
+ new_node.inherit jid
+ when Hash
+ new_node.jid = jid[:jid]
+ new_node.name = jid[:name]
+ new_node.subscription = jid[:subscription]
+ new_node.ask = jid[:ask]
else
- self.jid = jid
- self.name = name
- self.subscription = subscription
- self.ask = ask
+ new_node.jid = jid
+ new_node.name = name
+ new_node.subscription = subscription
+ new_node.ask = ask
end
+ new_node
end
##
# Roster item's JID
def jid
- (j = attributes[:jid]) ? JID.new(j) : nil
+ (j = self[:jid]) ? JID.new(j) : nil
end
attribute_writer :jid
- attribute_accessor :name, :to_sym => false
+ attribute_accessor :name
- attribute_accessor :subscription, :ask
+ attribute_accessor :subscription, :ask, :call => :to_sym
##
# The groups roster item belongs to
def groups
- find(:group).map { |g| g.content }
+ find('child::*[local-name()="group"]').map { |g| g.content }
end
##
# Set the roster item's groups
# must be an array
def groups=(new_groups)
- find(:group).each { |g| g.remove! }
- new_groups.uniq.each { |g| self << XMPPNode.new(:group, g) } if new_groups
+ remove_children :group
+ if new_groups
+ new_groups.uniq.each do |g|
+ self << (group = XMPPNode.new(:group, self.document))
+ group.content = g
+ end
+ end
end
##
# Convert the roster item to a proper stanza all wrapped up
# This facilitates new subscriptions
\ No newline at end of file