Class: Blather::Stanza::Presence

Inherits:
Blather::Stanza show all
Defined in:
lib/blather/stanza/presence.rb,
lib/blather/stanza/presence/status.rb,
lib/blather/stanza/presence/subscription.rb

Overview

# Presence Stanza

[RFC 3921 Section 2.2 - Presence Syntax](xmpp.org/rfcs/rfc3921.html#stanzas-presence)

Within Blather most of the interaction with Presence stanzas will be through one of its child classes: Status or Subscription.

Presence stanzas are used to express an entity’s current network availability (offline or online, along with various sub-states of the latter and optional user-defined descriptive text), and to notify other entities of that availability. Presence stanzas are also used to negotiate and manage subscriptions to the presence of other entities.

## “Type” Attribute

The ‘type` attribute of a presence stanza is optional. A presence stanza that does not possess a `type` attribute is used to signal to the server that the sender is online and available for communication. If included, the `type` attribute specifies a lack of availability, a request to manage a subscription to another entity’s presence, a request for another entity’s current presence, or an error related to a previously-sent presence stanza. If included, the ‘type` attribute must have one of the following values:

  • ‘:unavailable` – Signals that the entity is no longer available for communication

  • ‘:subscribe` – The sender wishes to subscribe to the recipient’s presence.

  • ‘:subscribed` – The sender has allowed the recipient to receive their presence.

  • ‘:unsubscribe` – The sender is unsubscribing from another entity’s presence.

  • ‘:unsubscribed` – The subscription request has been denied or a previously-granted subscription has been cancelled.

  • ‘:probe` – A request for an entity’s current presence; should be generated only by a server on behalf of a user.

  • ‘:error` – An error has occurred regarding processing or delivery of a previously-sent presence stanza.

Blather provides a helper for each possible type:

Presence#unavailabe?
Presence#unavailable?
Presence#subscribe?
Presence#subscribed?
Presence#unsubscribe?
Presence#unsubscribed?
Presence#probe?
Presence#error?

Blather treats the ‘type` attribute like a normal ruby object attribute providing a getter and setter. The default `type` is nil.

presence = Presence.new
presence.type                # => nil
presence.type = :unavailable
presence.unavailable?        # => true
presence.error?              # => false

presence.type = :invalid   # => RuntimeError

Direct Known Subclasses

Status, Subscription

Defined Under Namespace

Classes: Status, Subscription

Constant Summary collapse

VALID_TYPES =
[ :unavailable,
:subscribe,
:subscribed,
:unsubscribe,
:unsubscribed,
:probe,
:error].freeze

Constants inherited from XMPPNode

XMPPNode::BASE_NAMES

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Blather::Stanza

#as_error, #from, #from=, handler_list, #id, #id=, next_id, register, #reply, #reply!, #to, #to=, #type

Methods inherited from XMPPNode

class_from_registration, #content_from, #inherit, #inherit_attrs, #inspect, #namespace=, #namespace_href, #nokogiri_namespace=, #read_attr, #read_content, register, #remove_child, #remove_children, #set_content_for, #to_stanza, #write_attr

Methods inherited from Nokogiri::XML::Node

#[]=, #attr_set, #find_first, #nokogiri_xpath, #xpath

Class Method Details

.import(node) ⇒ Object

Creates a class based on the presence type either a Status or Subscription object is created based on the type attribute. If neither is found it instantiates a Presence object



87
88
89
90
91
92
93
94
# File 'lib/blather/stanza/presence.rb', line 87

def self.import(node) # :nodoc:
  klass = case node['type']
  when nil, 'unavailable' then Status
  when /subscribe/        then Subscription
  else self
  end
  klass.new.inherit(node)
end

.newObject

Ensure element_name is “presence” for all subclasses



97
98
99
# File 'lib/blather/stanza/presence.rb', line 97

def self.new
  super :presence
end

Instance Method Details

#error?true, false

Check if the IQ is of type :error

Returns:

  • (true, false)


146
147
148
# File 'lib/blather/stanza/presence.rb', line 146

def error?
  self.type == :error
end

#probe?true, false

Check if the IQ is of type :probe

Returns:

  • (true, false)


139
140
141
# File 'lib/blather/stanza/presence.rb', line 139

def probe?
  self.type == :probe
end

#subscribe?true, false

Check if the IQ is of type :subscribe

Returns:

  • (true, false)


111
112
113
# File 'lib/blather/stanza/presence.rb', line 111

def subscribe?
  self.type == :subscribe
end

#subscribed?true, false

Check if the IQ is of type :subscribed

Returns:

  • (true, false)


118
119
120
# File 'lib/blather/stanza/presence.rb', line 118

def subscribed?
  self.type == :subscribed
end

#type=(type) ⇒ Object

Ensures type is one of Blather::Stanza::Presence::VALID_TYPES

Parameters:

  • type (#to_sym)

    the Presence type. Must be one of VALID_TYPES



153
154
155
156
157
158
# File 'lib/blather/stanza/presence.rb', line 153

def type=(type)
  if type && !VALID_TYPES.include?(type.to_sym)
    raise ArgumentError, "Invalid Type (#{type}), use: #{VALID_TYPES*' '}"
  end
  super
end

#unavailable?true, false

Check if the IQ is of type :unavailable

Returns:

  • (true, false)


104
105
106
# File 'lib/blather/stanza/presence.rb', line 104

def unavailable?
  self.type == :unavailable
end

#unsubscribe?true, false

Check if the IQ is of type :unsubscribe

Returns:

  • (true, false)


125
126
127
# File 'lib/blather/stanza/presence.rb', line 125

def unsubscribe?
  self.type == :unsubscribe
end

#unsubscribed?true, false

Check if the IQ is of type :unsubscribed

Returns:

  • (true, false)


132
133
134
# File 'lib/blather/stanza/presence.rb', line 132

def unsubscribed?
  self.type == :unsubscribed
end