blather 0.4.7 → 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/blather/client/dsl.rb
CHANGED
@@ -1,121 +1,248 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'client')
|
2
2
|
|
3
3
|
module Blather
|
4
|
+
|
5
|
+
# # Blather DSL
|
6
|
+
#
|
7
|
+
# The DSL is a set of methods that enables you to write cleaner code. Being a
|
8
|
+
# module means it can be included in or extend any class you may want to
|
9
|
+
# create.
|
10
|
+
#
|
11
|
+
# Every stanza handler is registered as a method on the DSL.
|
12
|
+
#
|
13
|
+
# @example Include the DSL in the top level namespace.
|
14
|
+
#
|
15
|
+
# require 'blather/client'
|
16
|
+
# when_ready { puts "Connected ! send messages to #{jid.stripped}." }
|
17
|
+
#
|
18
|
+
# subscription :request? do |s|
|
19
|
+
# write_to_stream s.approve!
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# message :chat?, :body => 'exit' do |m|
|
23
|
+
# say m.from, 'Exiting ...'
|
24
|
+
# shutdown
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# message :chat?, :body do |m|
|
28
|
+
# say m.from, "You sent: #{m.body}"
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# @example Set the DSL to its own namespace.
|
32
|
+
#
|
33
|
+
# require 'blather/client/dsl'
|
34
|
+
# module Echo
|
35
|
+
# extend Blather::DSL
|
36
|
+
# def self.run
|
37
|
+
# client.run
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# when_ready { puts "Connected ! send messages to #{jid.stripped}." }
|
41
|
+
#
|
42
|
+
# subscription :request? do |s|
|
43
|
+
# write_to_stream s.approve!
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# message :chat?, :body => 'exit' do |m|
|
47
|
+
# say m.from, 'Exiting ...'
|
48
|
+
# shutdown
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# message :chat?, :body do |m|
|
52
|
+
# say m.from, "You sent: #{m.body}"
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# EM.run { Echo.run }
|
57
|
+
#
|
58
|
+
# @example Create a class out of it
|
59
|
+
#
|
60
|
+
# require 'blather/client/dsl'
|
61
|
+
# class Echo
|
62
|
+
# include Blather::DSL
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# echo = Echo.new
|
66
|
+
# echo.when_ready { puts "Connected ! send messages to #{jid.stripped}." }
|
67
|
+
#
|
68
|
+
# echo.subscription :request? do |s|
|
69
|
+
# write_to_stream s.approve!
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# echo.message :chat?, :body => 'exit' do |m|
|
73
|
+
# say m.from, 'Exiting ...'
|
74
|
+
# shutdown
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# echo.message :chat?, :body do |m|
|
78
|
+
# say m.from, "You sent: #{m.body}"
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# EM.run { echo.client.run }
|
4
82
|
module DSL
|
5
83
|
|
6
84
|
autoload :PubSub, File.expand_path(File.join(File.dirname(__FILE__), *%w[dsl pubsub]))
|
7
85
|
|
86
|
+
# The actual client connection
|
87
|
+
#
|
88
|
+
# @return [Blather::Client]
|
8
89
|
def client
|
9
90
|
@client ||= Client.new
|
10
91
|
end
|
11
92
|
module_function :client
|
12
93
|
|
94
|
+
# A pubsub helper
|
95
|
+
#
|
96
|
+
# @return [Blather::PubSub]
|
13
97
|
def pubsub
|
14
98
|
@pubsub ||= PubSub.new client, jid.domain
|
15
99
|
end
|
16
100
|
|
17
|
-
##
|
18
101
|
# Push data to the stream
|
19
102
|
# This works such that it can be chained:
|
20
|
-
#
|
103
|
+
# self << stanza1 << stanza2 << "raw data"
|
104
|
+
#
|
105
|
+
# @param [#to_xml, #to_s] stanza data to send down the wire
|
106
|
+
# @return [self]
|
21
107
|
def <<(stanza)
|
22
108
|
client.write stanza
|
23
109
|
self
|
24
110
|
end
|
25
111
|
|
26
|
-
##
|
27
112
|
# Prepare server settings
|
28
|
-
#
|
29
|
-
#
|
113
|
+
#
|
114
|
+
# @param [#to_s] jid the JID to authenticate with
|
115
|
+
# @param [#to_s] password the password to authenticate with
|
116
|
+
# @param [String] host (optional) the host to connect to (can be an IP). If
|
117
|
+
# this is `nil` the domain on the JID will be used
|
118
|
+
# @param [Fixnum, String] (optional) port the port to connect on
|
30
119
|
def setup(jid, password, host = nil, port = nil)
|
31
120
|
client.setup(jid, password, host, port)
|
32
121
|
end
|
33
122
|
|
34
|
-
##
|
35
123
|
# Shutdown the connection.
|
36
124
|
# Flushes the write buffer then stops EventMachine
|
37
125
|
def shutdown
|
38
126
|
client.close
|
39
127
|
end
|
40
128
|
|
41
|
-
##
|
42
129
|
# Setup a before filter
|
130
|
+
#
|
131
|
+
# @param [Symbol] handler (optional) the stanza handler the filter should
|
132
|
+
# run before
|
133
|
+
# @param [guards] guards (optional) a set of guards to check the stanza
|
134
|
+
# against
|
135
|
+
# @yield [Blather::Stanza] stanza
|
43
136
|
def before(handler = nil, *guards, &block)
|
44
137
|
client.register_filter :before, handler, *guards, &block
|
45
138
|
end
|
46
139
|
|
47
|
-
##
|
48
140
|
# Setup an after filter
|
141
|
+
#
|
142
|
+
# @param [Symbol] handler (optional) the stanza handler the filter should
|
143
|
+
# run after
|
144
|
+
# @param [guards] guards (optional) a set of guards to check the stanza
|
145
|
+
# against
|
146
|
+
# @yield [Blather::Stanza] stanza
|
49
147
|
def after(handler = nil, *guards, &block)
|
50
148
|
client.register_filter :after, handler, *guards, &block
|
51
149
|
end
|
52
150
|
|
53
|
-
##
|
54
151
|
# Set handler for a stanza type
|
55
|
-
|
56
|
-
|
152
|
+
#
|
153
|
+
# @param [Symbol] handler the stanza type it should handle
|
154
|
+
# @param [guards] guards (optional) a set of guards to check the stanza
|
155
|
+
# against
|
156
|
+
# @yield [Blather::Stanza] stanza
|
157
|
+
def handle(handler, *guards, &block)
|
158
|
+
client.register_handler handler, *guards, &block
|
57
159
|
end
|
58
160
|
|
59
|
-
##
|
60
161
|
# Wrapper for "handle :ready" (just a bit of syntactic sugar)
|
162
|
+
#
|
163
|
+
# This is run after the connection has been completely setup
|
61
164
|
def when_ready(&block)
|
62
165
|
handle :ready, &block
|
63
166
|
end
|
64
167
|
|
65
|
-
##
|
66
168
|
# Wrapper for "handle :disconnected"
|
169
|
+
#
|
170
|
+
# This is run after the connection has been shut down.
|
171
|
+
#
|
172
|
+
# @example Reconnect after a disconnection
|
173
|
+
# disconnected { client.run }
|
67
174
|
def disconnected(&block)
|
68
175
|
handle :disconnected, &block
|
69
176
|
end
|
70
177
|
|
71
|
-
##
|
72
178
|
# Set current status
|
179
|
+
#
|
180
|
+
# @param [Blather::Stanza::Presence::State::VALID_STATES] state the current
|
181
|
+
# state
|
182
|
+
# @param [#to_s] msg the status message to use
|
73
183
|
def set_status(state = nil, msg = nil)
|
74
184
|
client.status = state, msg
|
75
185
|
end
|
76
186
|
|
77
|
-
##
|
78
187
|
# Direct access to the roster
|
188
|
+
#
|
189
|
+
# @return [Blather::Roster]
|
79
190
|
def my_roster
|
80
191
|
client.roster
|
81
192
|
end
|
82
193
|
|
83
|
-
##
|
84
194
|
# Write data to the stream
|
85
|
-
#
|
195
|
+
#
|
196
|
+
# @param [#to_xml, #to_s] stanza the data to send down the wire.
|
86
197
|
def write_to_stream(stanza)
|
87
198
|
client.write stanza
|
88
199
|
end
|
89
200
|
|
90
|
-
##
|
91
201
|
# Helper method to make sending basic messages easier
|
92
|
-
#
|
202
|
+
#
|
203
|
+
# @param [Blather::JID, #to_s] to the JID of the message recipient
|
204
|
+
# @param [#to_s] msg the message to send
|
93
205
|
def say(to, msg)
|
94
206
|
client.write Blather::Stanza::Message.new(to, msg)
|
95
207
|
end
|
96
208
|
|
97
|
-
|
98
|
-
#
|
209
|
+
# The JID according to the server
|
210
|
+
#
|
211
|
+
# @return [Blather::JID]
|
99
212
|
def jid
|
100
213
|
client.jid
|
101
214
|
end
|
102
215
|
|
103
|
-
##
|
104
216
|
# Halt the handler chain
|
217
|
+
#
|
218
|
+
# Use this to stop the propogation of the stanza though the handler chain.
|
219
|
+
#
|
220
|
+
# @example
|
221
|
+
# Ignore all IQ stanzas
|
222
|
+
#
|
223
|
+
# before(:iq) { halt }
|
105
224
|
def halt
|
106
225
|
throw :halt
|
107
226
|
end
|
108
227
|
|
109
|
-
##
|
110
228
|
# Pass responsibility to the next handler
|
229
|
+
#
|
230
|
+
# Use this to jump out of the current handler and let the next registered
|
231
|
+
# handler take care of the stanza
|
232
|
+
#
|
233
|
+
# @example
|
234
|
+
# This is contrive and should be handled with guards, but pass a message
|
235
|
+
# to the next handler based on the content
|
236
|
+
#
|
237
|
+
# message { |s| puts "message caught" }
|
238
|
+
# message { |s| pass if s.body =~ /pass along/ }
|
111
239
|
def pass
|
112
240
|
throw :pass
|
113
241
|
end
|
114
242
|
|
115
|
-
##
|
116
243
|
# Request items or info from an entity
|
117
|
-
#
|
118
|
-
#
|
244
|
+
# discover (items|info), [jid], [node] do |response|
|
245
|
+
# end
|
119
246
|
def discover(what, who, where, &callback)
|
120
247
|
stanza = Blather::Stanza.class_from_registration(:query, "http://jabber.org/protocol/disco##{what}").new
|
121
248
|
stanza.to = who
|
@@ -125,10 +252,7 @@ module Blather
|
|
125
252
|
client.write stanza
|
126
253
|
end
|
127
254
|
|
128
|
-
|
129
|
-
# Checks to see if the method is part of the handlers list.
|
130
|
-
# If so it creates a handler, otherwise it'll pass it back
|
131
|
-
# to Ruby's method_missing handler
|
255
|
+
# Generate a method for every stanza handler that exists.
|
132
256
|
Blather::Stanza.handler_list.each do |handler_name|
|
133
257
|
module_eval <<-METHOD, __FILE__, __LINE__
|
134
258
|
def #{handler_name}(*args, &callback)
|
@@ -136,5 +260,5 @@ module Blather
|
|
136
260
|
end
|
137
261
|
METHOD
|
138
262
|
end
|
139
|
-
end
|
140
|
-
end
|
263
|
+
end # DSL
|
264
|
+
end # Blather
|
@@ -4,31 +4,36 @@ module DSL
|
|
4
4
|
class PubSub
|
5
5
|
attr_accessor :host
|
6
6
|
|
7
|
+
# Create a new pubsub DSL
|
8
|
+
#
|
9
|
+
# @param [Blather::Client] client the client who's connection will be used
|
10
|
+
# @param [#to_s] host the PubSub host
|
7
11
|
def initialize(client, host)
|
8
12
|
@client = client
|
9
13
|
@host = host
|
10
14
|
end
|
11
15
|
|
12
|
-
##
|
13
16
|
# Retrieve Affiliations
|
14
|
-
#
|
15
|
-
#
|
17
|
+
#
|
18
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
19
|
+
# @yield [Hash] affiliations See {Blather::Stanza::PubSub::Affiliations#list}
|
16
20
|
def affiliations(host = nil, &callback)
|
17
21
|
request Stanza::PubSub::Affiliations.new(:get, send_to(host)), :list, callback
|
18
22
|
end
|
19
23
|
|
20
|
-
##
|
21
24
|
# Retrieve Subscriptions
|
22
|
-
#
|
23
|
-
#
|
25
|
+
#
|
26
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
27
|
+
# @yield [Hash] affiliations See {Blather::Stanza::PubSub::Subscriptions#list}
|
24
28
|
def subscriptions(host = nil, &callback)
|
25
29
|
request Stanza::PubSub::Subscriptions.new(:get, send_to(host)), :list, callback
|
26
30
|
end
|
27
31
|
|
28
|
-
##
|
29
32
|
# Discover Nodes
|
30
|
-
#
|
31
|
-
#
|
33
|
+
#
|
34
|
+
# @param [#to_s] path the node path
|
35
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
36
|
+
# @yield [Array<Blather::Stanza::DiscoItems::Item>] items
|
32
37
|
def nodes(path = nil, host = nil, &callback)
|
33
38
|
path ||= '/'
|
34
39
|
stanza = Stanza::DiscoItems.new(:get, path)
|
@@ -36,91 +41,118 @@ module DSL
|
|
36
41
|
request stanza, :items, callback
|
37
42
|
end
|
38
43
|
|
39
|
-
##
|
40
44
|
# Discover node information
|
41
|
-
#
|
42
|
-
#
|
45
|
+
#
|
46
|
+
# @param [#to_s] path the node path
|
47
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
48
|
+
# @yield [Blather::Stanza::DiscoInfo>] info
|
43
49
|
def node(path, host = nil, &callback)
|
44
50
|
stanza = Stanza::DiscoInfo.new(:get, path)
|
45
51
|
stanza.to = send_to(host)
|
46
52
|
request stanza, nil, callback
|
47
53
|
end
|
48
54
|
|
49
|
-
##
|
50
55
|
# Retrieve items for a node
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
56
|
+
#
|
57
|
+
# @param [#to_s] path the node path
|
58
|
+
# @param [Array<#to_s>] list a list of IDs to retrieve
|
59
|
+
# @param [Fixnum, #to_s] max the maximum number of items to return
|
60
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
61
|
+
# @yield [Array<Blather::Stanza::PubSub::PubSubItem>] items see {Blather::Stanza::PubSub::Items#items}
|
54
62
|
def items(path, list = [], max = nil, host = nil, &callback)
|
55
|
-
request
|
63
|
+
request(
|
64
|
+
Stanza::PubSub::Items.request(send_to(host), path, list, max),
|
65
|
+
:items,
|
66
|
+
callback
|
67
|
+
)
|
56
68
|
end
|
57
69
|
|
58
|
-
##
|
59
70
|
# Subscribe to a node
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
71
|
+
#
|
72
|
+
# @param [#to_s] node the node to subscribe to
|
73
|
+
# @param [Blather::JID, #to_s] jid is the jid that should be used.
|
74
|
+
# Defaults to the stripped current JID
|
75
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
76
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
63
77
|
def subscribe(node, jid = nil, host = nil)
|
64
78
|
jid ||= client.jid.stripped
|
65
|
-
|
79
|
+
stanza = Stanza::PubSub::Subscribe.new(:set, send_to(host), node, jid)
|
80
|
+
request(stanza) { |n| yield n if block_given? }
|
66
81
|
end
|
67
82
|
|
68
|
-
##
|
69
83
|
# Unsubscribe from a node
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
84
|
+
#
|
85
|
+
# @param [#to_s] node the node to unsubscribe from
|
86
|
+
# @param [Blather::JID, #to_s] jid is the jid that should be used.
|
87
|
+
# Defaults to the stripped current JID
|
88
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
89
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
73
90
|
def unsubscribe(node, jid = nil, host = nil)
|
74
91
|
jid ||= client.jid.stripped
|
75
|
-
|
92
|
+
stanza = Stanza::PubSub::Unsubscribe.new(:set, send_to(host), node, jid)
|
93
|
+
request(stanza) { |n| yield n if block_given? }
|
76
94
|
end
|
77
95
|
|
78
|
-
##
|
79
96
|
# Publish an item to a node
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
97
|
+
#
|
98
|
+
# @param [#to_s] node the node to publish to
|
99
|
+
# @param [#to_s] payload the payload to send see {Blather::Stanza::PubSub::Publish}
|
100
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
101
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
83
102
|
def publish(node, payload, host = nil)
|
84
|
-
|
103
|
+
stanza = Stanza::PubSub::Publish.new(send_to(host), node, :set, payload)
|
104
|
+
request(stanza) { |n| yield n if block_given? }
|
85
105
|
end
|
86
106
|
|
87
|
-
##
|
88
107
|
# Delete items from a node
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
108
|
+
#
|
109
|
+
# @param [#to_s] node the node to delete from
|
110
|
+
# @param [Array<#to_s>] ids a list of ids to delete
|
111
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
112
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
92
113
|
def retract(node, ids = [], host = nil)
|
93
|
-
|
114
|
+
stanza = Stanza::PubSub::Retract.new(send_to(host), node, :set, ids)
|
115
|
+
request(stanza) { |n| yield n if block_given? }
|
94
116
|
end
|
95
117
|
|
96
|
-
##
|
97
118
|
# Create a node
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
119
|
+
#
|
120
|
+
# @param [#to_s] node the node to create
|
121
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
122
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
101
123
|
def create(node, host = nil)
|
102
|
-
|
124
|
+
stanza = Stanza::PubSub::Create.new(:set, send_to(host), node)
|
125
|
+
request(stanza) { |n| yield n if block_given? }
|
103
126
|
end
|
104
127
|
|
105
|
-
##
|
106
128
|
# Purge all node items
|
107
|
-
#
|
108
|
-
#
|
129
|
+
#
|
130
|
+
# @param [#to_s] node the node to purge
|
131
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
132
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
109
133
|
def purge(node, host = nil)
|
110
|
-
|
134
|
+
stanza = Stanza::PubSubOwner::Purge.new(:set, send_to(host), node)
|
135
|
+
request(stanza) { |n| yield n if block_given? }
|
111
136
|
end
|
112
137
|
|
113
|
-
##
|
114
138
|
# Delete a node
|
115
|
-
#
|
116
|
-
#
|
139
|
+
#
|
140
|
+
# @param [#to_s] node the node to delete
|
141
|
+
# @param [#to_s] host the PubSub host (defaults to the initialized host)
|
142
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
117
143
|
def delete(node, host = nil)
|
118
|
-
|
144
|
+
stanza = Stanza::PubSubOwner::Delete.new(:set, send_to(host), node)
|
145
|
+
request(stanza) { |n| yield n if block_given? }
|
119
146
|
end
|
120
147
|
|
121
148
|
private
|
122
149
|
def request(node, method = nil, callback = nil, &block)
|
123
|
-
|
150
|
+
unless block_given?
|
151
|
+
block = lambda do |node|
|
152
|
+
callback.call(method ? node.__send__(method) : node)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
124
156
|
client.write_with_handler(node, &block)
|
125
157
|
end
|
126
158
|
|
@@ -132,7 +164,7 @@ module DSL
|
|
132
164
|
def client
|
133
165
|
@client
|
134
166
|
end
|
135
|
-
end
|
167
|
+
end # PubSub
|
136
168
|
|
137
|
-
end
|
138
|
-
end
|
169
|
+
end # DSL
|
170
|
+
end # Blather
|