blather 0.4.7 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +162 -0
- data/examples/{print_heirarchy.rb → print_hierarchy.rb} +5 -5
- data/examples/stream_only.rb +27 -0
- data/lib/blather.rb +4 -0
- data/lib/blather/client/client.rb +91 -73
- data/lib/blather/client/dsl.rb +156 -32
- data/lib/blather/client/dsl/pubsub.rb +86 -54
- data/lib/blather/core_ext/active_support.rb +9 -9
- data/lib/blather/core_ext/active_support/inheritable_attributes.rb +2 -2
- data/lib/blather/core_ext/nokogiri.rb +12 -7
- data/lib/blather/errors.rb +25 -14
- data/lib/blather/errors/sasl_error.rb +21 -3
- data/lib/blather/errors/stanza_error.rb +37 -21
- data/lib/blather/errors/stream_error.rb +27 -17
- data/lib/blather/jid.rb +79 -24
- data/lib/blather/roster.rb +39 -21
- data/lib/blather/roster_item.rb +43 -21
- data/lib/blather/stanza.rb +88 -40
- data/lib/blather/stanza/disco.rb +12 -2
- data/lib/blather/stanza/disco/disco_info.rb +112 -20
- data/lib/blather/stanza/disco/disco_items.rb +81 -12
- data/lib/blather/stanza/iq.rb +94 -38
- data/lib/blather/stanza/iq/query.rb +16 -22
- data/lib/blather/stanza/iq/roster.rb +98 -20
- data/lib/blather/stanza/message.rb +266 -111
- data/lib/blather/stanza/presence.rb +118 -42
- data/lib/blather/stanza/presence/status.rb +140 -60
- data/lib/blather/stanza/presence/subscription.rb +44 -10
- data/lib/blather/stanza/pubsub.rb +70 -15
- data/lib/blather/stanza/pubsub/affiliations.rb +36 -7
- data/lib/blather/stanza/pubsub/create.rb +26 -4
- data/lib/blather/stanza/pubsub/errors.rb +13 -4
- data/lib/blather/stanza/pubsub/event.rb +56 -10
- data/lib/blather/stanza/pubsub/items.rb +46 -6
- data/lib/blather/stanza/pubsub/publish.rb +52 -7
- data/lib/blather/stanza/pubsub/retract.rb +45 -6
- data/lib/blather/stanza/pubsub/subscribe.rb +30 -4
- data/lib/blather/stanza/pubsub/subscription.rb +74 -6
- data/lib/blather/stanza/pubsub/subscriptions.rb +35 -9
- data/lib/blather/stanza/pubsub/unsubscribe.rb +30 -4
- data/lib/blather/stanza/pubsub_owner.rb +17 -7
- data/lib/blather/stanza/pubsub_owner/delete.rb +23 -5
- data/lib/blather/stanza/pubsub_owner/purge.rb +23 -5
- data/lib/blather/stream.rb +96 -29
- data/lib/blather/stream/parser.rb +6 -9
- data/lib/blather/xmpp_node.rb +101 -153
- data/spec/blather/client/client_spec.rb +1 -1
- data/spec/blather/errors_spec.rb +5 -5
- data/spec/blather/stanza/message_spec.rb +56 -0
- data/spec/blather/stanza/presence/status_spec.rb +1 -1
- data/spec/blather/stanza_spec.rb +3 -3
- data/spec/blather/xmpp_node_spec.rb +19 -74
- metadata +6 -10
- data/README.rdoc +0 -185
- data/examples/drb_client.rb +0 -5
- data/examples/ping.rb +0 -11
- data/examples/pong.rb +0 -6
- data/examples/pubsub/cli.rb +0 -64
- data/examples/pubsub/ping_pong.rb +0 -18
@@ -2,9 +2,22 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class Presence
|
4
4
|
|
5
|
+
# # Subscription Stanza
|
6
|
+
#
|
7
|
+
# [RFC 3921 Section 8 - Integration of Roster Items and Presence Subscriptions](http://xmpp.org/rfcs/rfc3921.html#rfc.section.8)
|
8
|
+
#
|
9
|
+
# Blather handles subscription request/response through this class. It
|
10
|
+
# provides a set of helper methods to quickly transform the stanza into a
|
11
|
+
# response.
|
12
|
+
#
|
13
|
+
# @handler :subscription
|
5
14
|
class Subscription < Presence
|
6
15
|
register :subscription, :subscription
|
7
16
|
|
17
|
+
# Create a new Subscription stanza
|
18
|
+
#
|
19
|
+
# @param [Blather::JID, #to_s] to the JID to subscribe to
|
20
|
+
# @param [Symbol, nil] type the subscription type
|
8
21
|
def self.new(to = nil, type = nil)
|
9
22
|
node = super()
|
10
23
|
node.to = to
|
@@ -12,50 +25,71 @@ class Presence
|
|
12
25
|
node
|
13
26
|
end
|
14
27
|
|
28
|
+
# @private
|
15
29
|
def inherit(node)
|
16
30
|
inherit_attrs node.attributes
|
17
31
|
self
|
18
32
|
end
|
19
33
|
|
34
|
+
# Set the to value on the stanza
|
35
|
+
#
|
36
|
+
# @param [Blather::JID, #to_s] to a JID to subscribe to
|
20
37
|
def to=(to)
|
21
38
|
super JID.new(to).stripped
|
22
39
|
end
|
23
40
|
|
24
|
-
|
25
|
-
#
|
41
|
+
# Transform the stanza into an approve stanza
|
42
|
+
# makes approving requests simple
|
43
|
+
#
|
44
|
+
# @example approve an incoming request
|
45
|
+
# subscription(:request?) { |s| write_to_stream s.approve! }
|
46
|
+
# @return [self]
|
26
47
|
def approve!
|
27
48
|
self.type = :subscribed
|
28
49
|
reply_if_needed!
|
29
50
|
end
|
30
51
|
|
31
|
-
|
32
|
-
#
|
52
|
+
# Transform the stanza into a refuse stanza
|
53
|
+
# makes refusing requests simple
|
54
|
+
#
|
55
|
+
# @example refuse an incoming request
|
56
|
+
# subscription(:request?) { |s| write_to_stream s.refuse! }
|
57
|
+
# @return [self]
|
33
58
|
def refuse!
|
34
59
|
self.type = :unsubscribed
|
35
60
|
reply_if_needed!
|
36
61
|
end
|
37
62
|
|
38
|
-
|
39
|
-
#
|
63
|
+
# Transform the stanza into an unsubscribe stanza
|
64
|
+
# makes unsubscribing simple
|
65
|
+
#
|
66
|
+
# @return [self]
|
40
67
|
def unsubscribe!
|
41
68
|
self.type = :unsubscribe
|
42
69
|
reply_if_needed!
|
43
70
|
end
|
44
71
|
|
45
|
-
|
46
|
-
#
|
72
|
+
# Transform the stanza into a cancel stanza
|
73
|
+
# makes canceling simple
|
74
|
+
#
|
75
|
+
# @return [self]
|
47
76
|
def cancel!
|
48
77
|
self.type = :unsubscribed
|
49
78
|
reply_if_needed!
|
50
79
|
end
|
51
80
|
|
52
|
-
|
53
|
-
#
|
81
|
+
# Transform the stanza into a request stanza
|
82
|
+
# makes requests simple
|
83
|
+
#
|
84
|
+
# @return [self]
|
54
85
|
def request!
|
55
86
|
self.type = :subscribe
|
56
87
|
reply_if_needed!
|
57
88
|
end
|
58
89
|
|
90
|
+
# Check if the stanza is a request
|
91
|
+
#
|
92
|
+
# @return [true, false]
|
59
93
|
def request?
|
60
94
|
self.type == :subscribe
|
61
95
|
end
|
@@ -1,19 +1,34 @@
|
|
1
1
|
module Blather
|
2
2
|
class Stanza
|
3
3
|
|
4
|
+
# # Pubsub Stanza
|
5
|
+
#
|
6
|
+
# [XEP-0060 - Publish-Subscribe](http://xmpp.org/extensions/xep-0060.html)
|
7
|
+
#
|
8
|
+
# The base class for all PubSub nodes. This provides helper methods common to
|
9
|
+
# all PubSub nodes.
|
10
|
+
#
|
11
|
+
# @handler :pubsub_node
|
4
12
|
class PubSub < Iq
|
5
13
|
register :pubsub_node, :pubsub, 'http://jabber.org/protocol/pubsub'
|
6
14
|
|
15
|
+
# @private
|
7
16
|
def self.import(node)
|
8
17
|
klass = nil
|
9
18
|
if pubsub = node.document.find_first('//ns:pubsub', :ns => self.registered_ns)
|
10
|
-
pubsub.children.
|
19
|
+
pubsub.children.detect do |e|
|
20
|
+
ns = e.namespace ? e.namespace.href : nil
|
21
|
+
klass = class_from_registration(e.element_name, ns)
|
22
|
+
end
|
11
23
|
end
|
12
24
|
(klass || self).new(node[:type]).inherit(node)
|
13
25
|
end
|
14
26
|
|
15
|
-
|
16
|
-
#
|
27
|
+
# Overwrites the parent constructor to ensure a pubsub node is present.
|
28
|
+
# Also allows the addition of a host attribute
|
29
|
+
#
|
30
|
+
# @param [<Blather::Stanza::Iq::VALID_TYPES>] type the IQ type
|
31
|
+
# @param [String, nil] host the host the node should be sent to
|
17
32
|
def self.new(type = nil, host = nil)
|
18
33
|
new_node = super type
|
19
34
|
new_node.to = host
|
@@ -21,13 +36,18 @@ class Stanza
|
|
21
36
|
new_node
|
22
37
|
end
|
23
38
|
|
24
|
-
|
25
|
-
#
|
39
|
+
# Overrides the parent to ensure the current pubsub node is destroyed before
|
40
|
+
# inheritting the new content
|
41
|
+
#
|
42
|
+
# @private
|
26
43
|
def inherit(node)
|
27
44
|
remove_children :pubsub
|
28
45
|
super
|
29
46
|
end
|
30
47
|
|
48
|
+
# Get or create the pubsub node on the stanza
|
49
|
+
#
|
50
|
+
# @return [Blather::XMPPNode]
|
31
51
|
def pubsub
|
32
52
|
p = find_first('ns:pubsub', :ns => self.class.registered_ns) ||
|
33
53
|
find_first('pubsub', :ns => self.class.registered_ns)
|
@@ -38,9 +58,21 @@ class Stanza
|
|
38
58
|
end
|
39
59
|
p
|
40
60
|
end
|
41
|
-
end
|
61
|
+
end # PubSub
|
42
62
|
|
63
|
+
# # PubSubItem Fragment
|
64
|
+
#
|
65
|
+
# This fragment is found in many places throughout the pubsub spec
|
66
|
+
# This is a convenience class to attach methods to the node
|
43
67
|
class PubSubItem < XMPPNode
|
68
|
+
ATOM_NS = 'http://www.w3.org/2005/Atom'.freeze
|
69
|
+
|
70
|
+
# Create a new PubSubItem
|
71
|
+
#
|
72
|
+
# @param [String, nil] id the id of the stanza
|
73
|
+
# @param [#to_s, nil] payload the payload to attach to this item.
|
74
|
+
# @param [XML::Document, nil] document the document the node should be
|
75
|
+
# attached to. This should be the document of the parent PubSub node.
|
44
76
|
def self.new(id = nil, payload = nil, document = nil)
|
45
77
|
new_node = super 'item', document
|
46
78
|
new_node.id = id
|
@@ -48,27 +80,50 @@ class Stanza
|
|
48
80
|
new_node
|
49
81
|
end
|
50
82
|
|
51
|
-
|
83
|
+
# Get the item's ID
|
84
|
+
#
|
85
|
+
# @return [String, nil]
|
86
|
+
def id
|
87
|
+
read_attr :id
|
88
|
+
end
|
52
89
|
|
53
|
-
|
54
|
-
|
90
|
+
# Set the item's ID
|
91
|
+
#
|
92
|
+
# @param [#to_s] id the new ID
|
93
|
+
def id=(id)
|
94
|
+
write_attr :id, id
|
55
95
|
end
|
56
96
|
|
97
|
+
# Get the item's payload
|
98
|
+
#
|
99
|
+
# To get the XML representation use #entry
|
100
|
+
#
|
101
|
+
# @return [String, nil]
|
57
102
|
def payload
|
58
103
|
self.entry.content.empty? ? nil : content
|
59
104
|
end
|
60
105
|
|
106
|
+
# Set the item's payload
|
107
|
+
#
|
108
|
+
# @param [String, nil] payload the payload
|
109
|
+
def payload=(payload)
|
110
|
+
self.entry.content = payload
|
111
|
+
end
|
112
|
+
|
113
|
+
# Get or create the entry node
|
114
|
+
#
|
115
|
+
# @return [Blather::XMPPNode]
|
61
116
|
def entry
|
62
|
-
e = find_first('ns:entry', :ns =>
|
63
|
-
find_first('entry', :ns =>
|
117
|
+
e = find_first('ns:entry', :ns => ATOM_NS) ||
|
118
|
+
find_first('entry', :ns => ATOM_NS)
|
64
119
|
|
65
120
|
unless e
|
66
121
|
self << (e = XMPPNode.new('entry', self.document))
|
67
|
-
e.namespace =
|
122
|
+
e.namespace = ATOM_NS
|
68
123
|
end
|
69
124
|
e
|
70
125
|
end
|
71
|
-
end
|
126
|
+
end # PubSubItem
|
72
127
|
|
73
|
-
end
|
74
|
-
end
|
128
|
+
end # Stanza
|
129
|
+
end # Blather
|
@@ -2,39 +2,68 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class PubSub
|
4
4
|
|
5
|
+
# # PubSub Affiliations Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 8.9 - Manage Affiliations](http://xmpp.org/extensions/xep-0060.html#owner-affiliations)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_affiliations
|
5
10
|
class Affiliations < PubSub
|
6
11
|
register :pubsub_affiliations, :affiliations, self.registered_ns
|
7
12
|
|
8
13
|
include Enumerable
|
9
14
|
alias_method :find, :xpath
|
10
15
|
|
16
|
+
# Overrides the parent to ensure an affiliation node is created
|
17
|
+
# @private
|
11
18
|
def self.new(type = nil, host = nil)
|
12
19
|
new_node = super
|
13
20
|
new_node.affiliations
|
14
21
|
new_node
|
15
22
|
end
|
16
23
|
|
17
|
-
##
|
18
24
|
# Kill the affiliations node before running inherit
|
25
|
+
# @private
|
19
26
|
def inherit(node)
|
20
27
|
affiliations.remove
|
21
28
|
super
|
22
29
|
end
|
23
30
|
|
31
|
+
# Get or create the affiliations node
|
32
|
+
#
|
33
|
+
# @return [Blather::XMPPNode]
|
24
34
|
def affiliations
|
25
|
-
aff = pubsub.find_first('
|
26
|
-
|
35
|
+
aff = pubsub.find_first('ns:affiliations', :ns => self.class.registered_ns)
|
36
|
+
unless aff
|
37
|
+
self.pubsub << (aff = XMPPNode.new('affiliations', self.document))
|
38
|
+
end
|
27
39
|
aff
|
28
40
|
end
|
29
41
|
|
42
|
+
# Convenience method for iterating over the list
|
43
|
+
#
|
44
|
+
# @see #list for the format of the yielded input
|
30
45
|
def each(&block)
|
31
46
|
list.each &block
|
32
47
|
end
|
33
48
|
|
49
|
+
# Get the number of affiliations
|
50
|
+
#
|
51
|
+
# @return [Fixnum]
|
34
52
|
def size
|
35
53
|
list.size
|
36
54
|
end
|
37
55
|
|
56
|
+
# Get the hash of affilations as affiliation-type => [nodes]
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
#
|
60
|
+
# { :owner => ['node1', 'node2'],
|
61
|
+
# :publisher => ['node3'],
|
62
|
+
# :outcast => ['node4'],
|
63
|
+
# :member => ['node5'],
|
64
|
+
# :none => ['node6'] }
|
65
|
+
#
|
66
|
+
# @return [Hash<String => Array<String>>]
|
38
67
|
def list
|
39
68
|
items = affiliations.find('//ns:affiliation', :ns => self.class.registered_ns)
|
40
69
|
items.inject({}) do |hash, item|
|
@@ -43,8 +72,8 @@ class PubSub
|
|
43
72
|
hash
|
44
73
|
end
|
45
74
|
end
|
46
|
-
end
|
75
|
+
end # Affiliations
|
47
76
|
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
77
|
+
end # PubSub
|
78
|
+
end # Stanza
|
79
|
+
end # Blather
|
@@ -2,9 +2,19 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class PubSub
|
4
4
|
|
5
|
+
# # PubSub Create Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 8.1 - Create a Node](http://xmpp.org/extensions/xep-0060.html#owner-create)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_create
|
5
10
|
class Create < PubSub
|
6
11
|
register :pubsub_create, :create, self.registered_ns
|
7
12
|
|
13
|
+
# Create a new Create Stanza
|
14
|
+
#
|
15
|
+
# @param [<Blather::Stanza::Iq::VALID_TYPES>] type the node type
|
16
|
+
# @param [String, nil] host the host to send the request to
|
17
|
+
# @param [String, nil] node the name of the node to create
|
8
18
|
def self.new(type = :set, host = nil, node = nil)
|
9
19
|
new_node = super(type, host)
|
10
20
|
new_node.create_node
|
@@ -13,14 +23,23 @@ class PubSub
|
|
13
23
|
new_node
|
14
24
|
end
|
15
25
|
|
26
|
+
# Get the name of the node to create
|
27
|
+
#
|
28
|
+
# @return [String, nil]
|
16
29
|
def node
|
17
30
|
create_node[:node]
|
18
31
|
end
|
19
32
|
|
33
|
+
# Set the name of the node to create
|
34
|
+
#
|
35
|
+
# @param [String, nil] node
|
20
36
|
def node=(node)
|
21
37
|
create_node[:node] = node
|
22
38
|
end
|
23
39
|
|
40
|
+
# Get or create the actual create node on the stanza
|
41
|
+
#
|
42
|
+
# @return [Balther::XMPPNode]
|
24
43
|
def create_node
|
25
44
|
unless create_node = pubsub.find_first('ns:create', :ns => self.class.registered_ns)
|
26
45
|
self.pubsub << (create_node = XMPPNode.new('create', self.document))
|
@@ -29,6 +48,9 @@ class PubSub
|
|
29
48
|
create_node
|
30
49
|
end
|
31
50
|
|
51
|
+
# Get or create the actual configure node on the stanza
|
52
|
+
#
|
53
|
+
# @return [Blather::XMPPNode]
|
32
54
|
def configure_node
|
33
55
|
unless configure_node = pubsub.find_first('ns:configure', :ns => self.class.registered_ns)
|
34
56
|
self.pubsub << (configure_node = XMPPNode.new('configure', self.document))
|
@@ -36,8 +58,8 @@ class PubSub
|
|
36
58
|
end
|
37
59
|
configure_node
|
38
60
|
end
|
39
|
-
end
|
61
|
+
end # Create
|
40
62
|
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
63
|
+
end # PubSub
|
64
|
+
end # Stanza
|
65
|
+
end # Blather
|
@@ -1,9 +1,18 @@
|
|
1
1
|
module Blather
|
2
2
|
class Stanza
|
3
3
|
|
4
|
+
# # PusSub Error Stanza
|
5
|
+
#
|
6
|
+
# @private
|
4
7
|
class PubSubErrors < PubSub
|
5
|
-
|
6
|
-
|
8
|
+
def node
|
9
|
+
read_attr :node
|
10
|
+
end
|
7
11
|
|
8
|
-
|
9
|
-
|
12
|
+
def node=(node)
|
13
|
+
write_attr :node, node
|
14
|
+
end
|
15
|
+
end # PubSubErrors
|
16
|
+
|
17
|
+
end # Stanza
|
18
|
+
end # Blather
|
@@ -2,48 +2,83 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class PubSub
|
4
4
|
|
5
|
+
# # PubSub Event Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060](http://xmpp.org/extensions/xep-0060.html)
|
8
|
+
#
|
9
|
+
# The PubSub Event stanza is used in many places. Please see the XEP for more
|
10
|
+
# information.
|
11
|
+
#
|
12
|
+
# @handler :pubsub_event
|
5
13
|
class Event < Message
|
14
|
+
SHIM_NS = 'http://jabber.org/protocol/shim'.freeze
|
15
|
+
|
6
16
|
register :pubsub_event, :event, 'http://jabber.org/protocol/pubsub#event'
|
7
17
|
|
8
|
-
|
9
|
-
#
|
18
|
+
# Ensures the event_node is created
|
19
|
+
# @private
|
10
20
|
def self.new(type = nil)
|
11
21
|
node = super
|
12
22
|
node.event_node
|
13
23
|
node
|
14
24
|
end
|
15
25
|
|
16
|
-
##
|
17
26
|
# Kill the event_node node before running inherit
|
27
|
+
# @private
|
18
28
|
def inherit(node)
|
19
29
|
event_node.remove
|
20
30
|
super
|
21
31
|
end
|
22
32
|
|
33
|
+
# Get the name of the node
|
34
|
+
#
|
35
|
+
# @return [String, nil]
|
23
36
|
def node
|
24
37
|
!purge? ? items_node[:node] : purge_node[:node]
|
25
38
|
end
|
26
39
|
|
40
|
+
# Get a list of retractions
|
41
|
+
#
|
42
|
+
# @return [Array<String>]
|
27
43
|
def retractions
|
28
|
-
items_node.find('//ns:retract', :ns => self.class.registered_ns).map
|
44
|
+
items_node.find('//ns:retract', :ns => self.class.registered_ns).map do |i|
|
45
|
+
i[:id]
|
46
|
+
end
|
29
47
|
end
|
30
48
|
|
49
|
+
# Check if this is a retractions stanza
|
50
|
+
#
|
51
|
+
# @return [Boolean]
|
31
52
|
def retractions?
|
32
53
|
!retractions.empty?
|
33
54
|
end
|
34
55
|
|
56
|
+
# Get the list of items attached to this event
|
57
|
+
#
|
58
|
+
# @return [Array<Blather::Stanza::PubSub::PubSubItem>]
|
35
59
|
def items
|
36
|
-
items_node.find('//ns:item', :ns => self.class.registered_ns).map
|
60
|
+
items_node.find('//ns:item', :ns => self.class.registered_ns).map do |i|
|
61
|
+
PubSubItem.new(nil,nil,self.document).inherit i
|
62
|
+
end
|
37
63
|
end
|
38
64
|
|
65
|
+
# Check if this stanza has items
|
66
|
+
#
|
67
|
+
# @return [Boolean]
|
39
68
|
def items?
|
40
69
|
!items.empty?
|
41
70
|
end
|
42
71
|
|
72
|
+
# Check if this is a purge stanza
|
73
|
+
#
|
74
|
+
# @return [XML::Node, nil]
|
43
75
|
def purge?
|
44
76
|
purge_node
|
45
77
|
end
|
46
78
|
|
79
|
+
# Get or create the actual event node
|
80
|
+
#
|
81
|
+
# @return [Blather::XMPPNode]
|
47
82
|
def event_node
|
48
83
|
node = find_first('//ns:event', :ns => self.class.registered_ns)
|
49
84
|
node = find_first('//event', self.class.registered_ns) unless node
|
@@ -54,6 +89,9 @@ class PubSub
|
|
54
89
|
node
|
55
90
|
end
|
56
91
|
|
92
|
+
# Get or create the actual items node
|
93
|
+
#
|
94
|
+
# @return [Blather::XMPPNode]
|
57
95
|
def items_node
|
58
96
|
node = find_first('ns:event/ns:items', :ns => self.class.registered_ns)
|
59
97
|
unless node
|
@@ -63,15 +101,23 @@ class PubSub
|
|
63
101
|
node
|
64
102
|
end
|
65
103
|
|
104
|
+
# Get the actual purge node
|
105
|
+
#
|
106
|
+
# @return [Blather::XMPPNode]
|
66
107
|
def purge_node
|
67
108
|
event_node.find_first('//ns:purge', :ns => self.class.registered_ns)
|
68
109
|
end
|
69
110
|
|
111
|
+
# Get the subscription IDs associated with this event
|
112
|
+
#
|
113
|
+
# @return [Array<String>]
|
70
114
|
def subscription_ids
|
71
|
-
find('//ns:header[@name="SubID"]', :ns =>
|
115
|
+
find('//ns:header[@name="SubID"]', :ns => SHIM_NS).map do |n|
|
116
|
+
n.content
|
117
|
+
end
|
72
118
|
end
|
73
|
-
end
|
119
|
+
end # Event
|
74
120
|
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
121
|
+
end # PubSub
|
122
|
+
end # Stanza
|
123
|
+
end # Blather
|