Class Jabber::Roster::Helper::RosterItem
In: lib/xmpp4r/roster/helper/roster.rb
Parent: Jabber::Roster::RosterItem
Message Presence XMPPStanza Iq XMPPElement ErrorResponse X IqQuery JabberError ComponentAuthenticationFailure ArgumentError SOCKS5Error ServerError NoNameXmlnsRegistered ClientAuthenticationFailure Connection Client Component Client Singleton IdGenerator Comparable JID StandardError REXML::Element Stream IqQuery IqQueryVersion IqQueryRoster IqQueryBytestreams IqQueryRPC IqQueryMUCOwner IqQueryMUCAdmin IqQueryDiscoItems IqQueryDiscoInfo Responder SimpleResponder XRosterItem RosterXItem XMPPElement RosterItem IqFeature StreamHost IqSiFile IqSiFileRange IqSi StreamHostUsed C Body HTML UserItem XMUCUserInvite Tune Configuration Items Item IqPubSub Publish Event IqPubSubOwner Subscription Unsubscribe Feature Item Identity XDataField XDataReported XDataTitle XDataInstructions IqVcard XRoster RosterX X XMUC XMUCUser XDelay XData Iq IqCommand SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IBB IBBTarget IBBInitiator XMLRPC::ParserWriterChooseMixin Client Server XMLRPC::ParseContentType XMLRPC::BasicServer MUCClient SimpleMUCClient MUC::UserItem XMUCUserItem IqQueryMUCAdminItem XParent Base Anonymous DigestMD5 Plain PubSub::ServiceHelper Helper SubscriptionConfig NodeConfig OwnerNodeConfig EventItems EventItem ServiceHelper NodeHelper FileSource Base Bot CallbackList Callback StreamParser Semaphore Helper Responder SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Helper MUCBrowser NodeBrowser Responder Helper Helper lib/xmpp4r/message.rb lib/xmpp4r/connection.rb lib/xmpp4r/xmppstanza.rb lib/xmpp4r/iq.rb lib/xmpp4r/callbacks.rb lib/xmpp4r/idgenerator.rb lib/xmpp4r/stream.rb lib/xmpp4r/client.rb lib/xmpp4r/jid.rb lib/xmpp4r/x.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/semaphore.rb lib/xmpp4r/errors.rb lib/xmpp4r/component.rb lib/xmpp4r/presence.rb lib/xmpp4r/xmppelement.rb lib/xmpp4r/query.rb XParent lib/xmpp4r/version/helper/responder.rb lib/xmpp4r/version/helper/simpleresponder.rb lib/xmpp4r/version/iq/version.rb Version lib/xmpp4r/roster/x/roster.rb lib/xmpp4r/roster/helper/roster.rb lib/xmpp4r/roster/iq/roster.rb Roster lib/xmpp4r/feature_negotiation/iq/feature.rb FeatureNegotiation lib/xmpp4r/command/iq/command.rb lib/xmpp4r/command/helper/responder.rb Command lib/xmpp4r/bytestreams/iq/si.rb lib/xmpp4r/bytestreams/helper/ibb/initiator.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb lib/xmpp4r/bytestreams/iq/bytestreams.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb lib/xmpp4r/bytestreams/helper/ibb/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb lib/xmpp4r/bytestreams/helper/ibb/base.rb Bytestreams lib/xmpp4r/caps/helper/helper.rb lib/xmpp4r/caps/c.rb Caps lib/xmpp4r/xhtml/html.rb XHTML lib/xmpp4r/rpc/helper/server.rb lib/xmpp4r/rpc/helper/client.rb lib/xmpp4r/rpc/iq/rpc.rb RPC lib/xmpp4r/muc/iq/mucadminitem.rb lib/xmpp4r/muc/x/muc.rb lib/xmpp4r/muc/item.rb lib/xmpp4r/muc/helper/simplemucclient.rb lib/xmpp4r/muc/iq/mucadmin.rb lib/xmpp4r/muc/helper/mucbrowser.rb lib/xmpp4r/muc/x/mucuseritem.rb lib/xmpp4r/muc/x/mucuserinvite.rb lib/xmpp4r/muc/iq/mucowner.rb lib/xmpp4r/muc/helper/mucclient.rb MUC lib/xmpp4r/delay/x/delay.rb Delay lib/xmpp4r/sasl.rb SASL lib/xmpp4r/tune/helper/helper.rb lib/xmpp4r/tune/tune.rb UserTune lib/xmpp4r/pubsub/children/item.rb lib/xmpp4r/pubsub/children/configuration.rb lib/xmpp4r/pubsub/children/subscription.rb lib/xmpp4r/pubsub/helper/servicehelper.rb lib/xmpp4r/pubsub/children/unsubscribe.rb lib/xmpp4r/pubsub/children/publish.rb lib/xmpp4r/pubsub/children/event.rb lib/xmpp4r/pubsub/iq/pubsub.rb lib/xmpp4r/pubsub/helper/nodebrowser.rb lib/xmpp4r/pubsub/helper/nodehelper.rb lib/xmpp4r/pubsub/children/items.rb lib/xmpp4r/pubsub/children/subscription_config.rb lib/xmpp4r/pubsub/children/node_config.rb PubSub lib/xmpp4r/httpbinding/client.rb HTTPBinding lib/xmpp4r/discovery/iq/discoinfo.rb lib/xmpp4r/discovery/helper/responder.rb lib/xmpp4r/discovery/iq/discoitems.rb Discovery lib/xmpp4r/dataforms/x/data.rb Dataforms lib/xmpp4r/bytestreams/helper/filetransfer.rb TransferSource FileTransfer lib/xmpp4r/vcard/helper/vcard.rb lib/xmpp4r/vcard/iq/vcard.rb Vcard lib/xmpp4r/framework/base.rb lib/xmpp4r/framework/bot.rb Framework Jabber dot/m_99_0.png

These are extensions to RosterItem to carry presence information. This information is not stored in XML!

Methods

Attributes

presences  [R]  Tracked (online) presences of this RosterItem

Public Class methods

Initialize an empty RosterItem

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 376
376:         def initialize(stream)
377:           super()
378:           @stream = stream
379:           @presences = []
380:           @presences_lock = Mutex.new
381:         end

Public Instance methods

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.

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 453
453:         def add_presence(newpres)
454:           @presences_lock.synchronize {
455:             # Delete old presences with the same JID
456:             @presences.delete_if do |pres|
457:               pres.from == newpres.from or pres.from.resource.nil?
458:             end
459: 
460:             if newpres.type == :error and newpres.from.resource.nil?
461:               # Replace by single error presence
462:               @presences = [newpres]
463:             else
464:               # Add new presence
465:               @presences.push(newpres)
466:             end
467: 
468:             @presences.sort!
469:           }
470:         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’.

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 512
512:         def cancel_subscription
513:           pres = Presence.new.set_type(:unsubscribed).set_to(jid)
514:           @stream.send(pres)
515:         end

Iterate through all received <presence/> stanzas

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 422
422:         def each_presence(&block)
423:           # Don't lock here, we don't know what block does...
424:           @presences.each { |pres|
425:             yield(pres)
426:           }
427:         end

Is any presence of this person on-line?

(Or is there any presence? Unavailable presences are deleted.)

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 412
412:         def online?
413:           @presences_lock.synchronize {
414:             @presences.select { |pres|
415:               pres.type.nil?
416:             }.size > 0
417:           }
418:         end

Get specific presence

jid:[JID] Full JID

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 432
432:         def presence(jid)
433:           @presences_lock.synchronize {
434:             @presences.each { |pres|
435:               return(pres) if pres.from == jid
436:             }
437:           }
438:           nil
439:         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 ServerError upon failure.

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 400
400:         def remove
401:           request = Iq.new_rosterset
402:           request.query.add(Jabber::Roster::RosterItem.new(jid, nil, :remove))
403:           @stream.send_with_id(request)
404:           # Removing from list is handled by Roster#handle_iq_query_roster
405:         end

Send the updated RosterItem to the server, i.e. if you modified iname, groups, …

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 386
386:         def send
387:           request = Iq.new_rosterset
388:           request.query.add(self)
389:           @stream.send(request)
390:         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. ;-)

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 481
481:         def subscribe
482:           pres = Presence.new.set_type(:subscribe).set_to(jid.strip)
483:           @stream.send(pres)
484:         end

Unsubscribe from a contact‘s presence

This method waits for a presence with type=‘unsubscribed’ from the contact. It may throw ServerError 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.

[Source]

     # File lib/xmpp4r/roster/helper/roster.rb, line 496
496:         def unsubscribe
497:           pres = Presence.new.set_type(:unsubscribe).set_to(jid.strip)
498:           @stream.send(pres) { |answer|
499:             answer.type == :unsubscribed and
500:             answer.from.strip == pres.to
501:           }
502:         end

[Validate]