lib/blather/stanza/message.rb in blather-0.4.1 vs lib/blather/stanza/message.rb in blather-0.4.2
- old
+ new
@@ -1,16 +1,138 @@
module Blather
class Stanza
- ##
- # Base Message stanza
+ # Exchanging messages is a basic use of XMPP and occurs when a user generates a message stanza
+ # that is addressed to another entity. The sender's server is responsible for delivering the
+ # message to the intended recipient (if the recipient is on the same local server) or for routing
+ # the message to the recipient's server (if the recipient is on a remote server). Thus a message
+ # stanza is used to "push" information to another entity.
+ #
+ # == To Attribute
+ #
+ # An instant messaging client specifies an intended recipient for a message by providing the JID
+ # of an entity other than the sender in the +to+ attribute of the Message stanza. If the message
+ # is being sent outside the context of any existing chat session or received message, the value
+ # of the +to+ address SHOULD be of the form "user@domain" rather than of the form "user@domain/resource".
+ #
+ # msg = Message.new 'user@domain.tld/resource'
+ # msg.to == 'user@domain.tld/resource'
+ #
+ # msg.to = 'another-user@some-domain.tld/resource'
+ # msg.to == 'another-user@some-domain.tld/resource'
+ #
+ # The +to+ attribute on a Message stanza works like any regular ruby object attribute
+ #
+ # == Type Attribute
+ #
+ # Common uses of the message stanza in instant messaging applications include: single messages;
+ # messages sent in the context of a one-to-one chat session; messages sent in the context of a
+ # multi-user chat room; alerts, notifications, or other information to which no reply is expected;
+ # and errors. These uses are differentiated via the +type+ attribute. If included, the +type+
+ # attribute MUST have one of the following values:
+ #
+ # * +:chat+ -- The message is sent in the context of a one-to-one chat session. Typically a receiving
+ # client will present message of type +chat+ in an interface that enables one-to-one chat between
+ # the two parties, including an appropriate conversation history.
+ # * +:error+ -- The message is generated by an entity that experiences an error in processing a message
+ # received from another entity. A client that receives a message of type +error+ SHOULD present an
+ # appropriate interface informing the sender of the nature of the error.
+ # * +:groupchat+ -- The message is sent in the context of a multi-user chat environment (similar to that
+ # of [IRC]). Typically a receiving client will present a message of type +groupchat+ in an interface
+ # that enables many-to-many chat between the parties, including a roster of parties in the chatroom
+ # and an appropriate conversation history.
+ # * +:headline+ -- The message provides an alert, a notification, or other information to which no reply
+ # is expected (e.g., news headlines, sports updates, near-real-time market data, and syndicated content).
+ # Because no reply to the message is expected, typically a receiving client will present a message of
+ # type "headline" in an interface that appropriately differentiates the message from standalone messages,
+ # chat messages, or groupchat messages (e.g., by not providing the recipient with the ability to reply).
+ # * +:normal+ -- The message is a standalone message that is sent outside the context of a one-to-one
+ # conversation or groupchat, and to which it is expected that the recipient will reply. Typically a receiving
+ # client will present a message of type +normal+ in an interface that enables the recipient to reply, but
+ # without a conversation history. The default value of the +type+ attribute is +normal+.
+ #
+ # Blather provides a helper for each possible type:
+ #
+ # Message#chat?
+ # Message#error?
+ # Message#groupchat?
+ # Message#headline?
+ # Message#normal?
+ #
+ # Blather treats the +type+ attribute like a normal ruby object attribute providing a getter and setter.
+ # The default +type+ is +chat+.
+ #
+ # msg = Message.new
+ # msg.type # => :chat
+ # msg.chat? # => true
+ # msg.type = :normal
+ # msg.normal? # => true
+ # msg.chat? # => false
+ #
+ # msg.type = :invalid # => RuntimeError
+ #
+ # == Body Element
+ #
+ # The +body+ element contains human-readable XML character data that specifies the textual contents of the message;
+ # this child element is normally included but is optional.
+ #
+ # Blather provides an attribute-like syntax for Message +body+ elements.
+ #
+ # msg = Message.new 'user@domain.tld', 'message body'
+ # msg.body # => 'message body'
+ #
+ # msg.body = 'other message'
+ # msg.body # => 'other message'
+ #
+ # == Subject Element
+ #
+ # The +subject+ element contains human-readable XML character data that specifies the topic of the message.
+ #
+ # Blather provides an attribute-like syntax for Message +subject+ elements.
+ #
+ # msg = Message.new 'user@domain.tld', 'message subject'
+ # msg.subject # => 'message subject'
+ #
+ # msg.subject = 'other subject'
+ # msg.subject # => 'other subject'
+ #
+ # == Thread Element
+ #
+ # The primary use of the XMPP +thread+ element is to uniquely identify a conversation thread or "chat session"
+ # between two entities instantiated by Message stanzas of type +chat+. However, the XMPP thread element can
+ # also be used to uniquely identify an analogous thread between two entities instantiated by Message stanzas
+ # of type +headline+ or +normal+, or among multiple entities in the context of a multi-user chat room instantiated
+ # by Message stanzas of type +groupchat+. It MAY also be used for Message stanzas not related to a human
+ # conversation, such as a game session or an interaction between plugins. The +thread+ element is not used to
+ # identify individual messages, only conversations or messagingg sessions. The inclusion of the +thread+ element
+ # is optional.
+ #
+ # The value of the +thread+ element is not human-readable and MUST be treated as opaque by entities; no semantic
+ # meaning can be derived from it, and only exact comparisons can be made against it. The value of the +thread+
+ # element MUST be a universally unique identifier (UUID) as described in [UUID].
+ #
+ # The +thread+ element MAY possess a 'parent' attribute that identifies another thread of which the current
+ # thread is an offshoot or child; the value of the 'parent' must conform to the syntax of the +thread+ element itself.
+ #
+ # Blather provides an attribute-like syntax for Message +thread+ elements.
+ #
+ # msg = Message.new
+ # msg.thread = '12345'
+ # msg.thread # => '12345'
+ #
+ # Parent threads can be set using a hash:
+ #
+ # msg.thread = {'parent-id' => 'thread-id'}
+ # msg.thread # => 'thread-id'
+ # msg.parent_thread # => 'parent-id'
+ #
class Message < Stanza
- VALID_TYPES = [:chat, :error, :groupchat, :headline, :normal]
+ VALID_TYPES = [:chat, :error, :groupchat, :headline, :normal] # :nodoc:
register :message
- def self.import(node)
+ def self.import(node) # :nodoc:
klass = nil
node.children.each { |e| break if klass = class_from_registration(e.element_name, (e.namespace.href if e.namespace)) }
if klass && klass != self
klass.import(node)
@@ -18,28 +140,38 @@
new(node[:type]).inherit(node)
end
end
def self.new(to = nil, body = nil, type = :chat)
- node = super(:message)
+ node = super :message
node.to = to
node.type = type
node.body = body
node
end
attribute_helpers_for :type, VALID_TYPES
- ##
- # Ensures type is :chat, :error, :groupchat, :headline or :normal
- def type=(type)
+ def type=(type) # :nodoc:
raise ArgumentError, "Invalid Type (#{type}), use: #{VALID_TYPES*' '}" if type && !VALID_TYPES.include?(type.to_sym)
super
end
content_attr_accessor :body
content_attr_accessor :subject
- content_attr_accessor :thread
+
+ content_attr_reader :thread
+
+ def parent_thread # :nodoc:
+ n = find_first('thread')
+ n[:parent] if n
+ end
+
+ def thread=(thread) # :nodoc:
+ parent, thread = thread.to_a.flatten if thread.is_a?(Hash)
+ set_content_for :thread, thread
+ find_first('thread')[:parent] = parent
+ end
end
end #Stanza
end
\ No newline at end of file