| Class | Jabber::Roster::Helper::RosterItem |
| In: |
lib/xmpp4r/roster/helper/roster.rb
|
| Parent: | Jabber::Roster::RosterItem |
These are extensions to RosterItem to carry presence information. This information is not stored in XML!
| presences | [R] | Tracked (online) presences of this RosterItem |
Initialize an empty RosterItem
# File lib/xmpp4r/roster/helper/roster.rb, line 364
364: def initialize(stream)
365: super()
366: @stream = stream
367: @presences = []
368: @presences_lock = Mutex.new
369: end
Add presence and sort presences (unless type is :unavailable or :error)
This overwrites previous stanzas with the same destination JID to keep track of resources. Presence stanzas with type == :unavailable or type == :error will be deleted as this indicates that this resource has gone offline.
If type == :error and the presence‘s origin has no specific resource the contact is treated completely offline.
# File lib/xmpp4r/roster/helper/roster.rb, line 441
441: def add_presence(newpres)
442: @presences_lock.synchronize {
443: # Delete old presences with the same JID
444: @presences.delete_if do |pres|
445: pres.from == newpres.from or pres.from.resource.nil?
446: end
447:
448: if newpres.type == :error and newpres.from.resource.nil?
449: # Replace by single error presence
450: @presences = [newpres]
451: else
452: # Add new presence
453: @presences.push(newpres)
454: end
455:
456: @presences.sort!
457: }
458: end
Deny the contact to see your presence.
This method will not wait and returns immediately as you will need no confirmation for this action.
Though, you will get a roster update for that item, carrying either subscription=‘to’ or ‘none’.
# File lib/xmpp4r/roster/helper/roster.rb, line 500
500: def cancel_subscription
501: pres = Presence.new.set_type(:unsubscribed).set_to(jid)
502: @stream.send(pres)
503: end
Remove item
This cancels both subscription from the contact to you and from you to the contact.
The methods waits for a roster push from the server (success) or throws ErrorException upon failure.
# File lib/xmpp4r/roster/helper/roster.rb, line 388
388: def remove
389: request = Iq.new_rosterset
390: request.query.add(Jabber::Roster::RosterItem.new(jid, nil, :remove))
391: @stream.send_with_id(request) { true }
392: # Removing from list is handled by Roster#handle_iq_query_roster
393: end
Send the updated RosterItem to the server, i.e. if you modified iname, groups, …
# File lib/xmpp4r/roster/helper/roster.rb, line 374
374: def send
375: request = Iq.new_rosterset
376: request.query.add(self)
377: @stream.send(request)
378: end
Send subscription request to the user
The block given to Jabber::Roster::Roster#add_update_callback will be called, carrying the RosterItem with ask="subscribe"
This function returns immediately after sending the subscription request and will not wait of approval or declination as it may take months for the contact to decide. ;-)
# File lib/xmpp4r/roster/helper/roster.rb, line 469
469: def subscribe
470: pres = Presence.new.set_type(:subscribe).set_to(jid.strip)
471: @stream.send(pres)
472: end
Unsubscribe from a contact‘s presence
This method waits for a presence with type=‘unsubscribed’ from the contact. It may throw ErrorException upon failure.
subscription attribute of the item is from or none afterwards. As long as you don‘t remove that item and subscription=‘from’ the contact is subscribed to your presence.
# File lib/xmpp4r/roster/helper/roster.rb, line 484
484: def unsubscribe
485: pres = Presence.new.set_type(:unsubscribe).set_to(jid.strip)
486: @stream.send(pres) { |answer|
487: answer.type == :unsubscribed and
488: answer.from.strip == pres.to
489: }
490: end