jubjub 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/README.mdown +27 -1
  2. data/lib/jubjub.rb +1 -1
  3. data/lib/jubjub/connection/xmpp_gateway.rb +9 -9
  4. data/lib/jubjub/connection/xmpp_gateway/helper.rb +5 -5
  5. data/lib/jubjub/connection/xmpp_gateway/muc.rb +127 -32
  6. data/lib/jubjub/connection/xmpp_gateway/pubsub.rb +64 -64
  7. data/lib/jubjub/data_form.rb +16 -13
  8. data/lib/jubjub/errors.rb +2 -2
  9. data/lib/jubjub/helpers.rb +32 -0
  10. data/lib/jubjub/jid.rb +8 -8
  11. data/lib/jubjub/muc.rb +3 -1
  12. data/lib/jubjub/muc/affiliation.rb +77 -0
  13. data/lib/jubjub/muc/affiliations_collection.rb +31 -0
  14. data/lib/jubjub/muc/collection.rb +12 -19
  15. data/lib/jubjub/muc/configuration.rb +2 -2
  16. data/lib/jubjub/muc/muc.rb +24 -11
  17. data/lib/jubjub/pubsub.rb +1 -1
  18. data/lib/jubjub/pubsub/affiliation.rb +20 -20
  19. data/lib/jubjub/pubsub/affiliation_collection.rb +11 -18
  20. data/lib/jubjub/pubsub/collection.rb +14 -21
  21. data/lib/jubjub/pubsub/configuration.rb +2 -2
  22. data/lib/jubjub/pubsub/item.rb +8 -8
  23. data/lib/jubjub/pubsub/item_collection.rb +10 -17
  24. data/lib/jubjub/pubsub/pubsub.rb +17 -17
  25. data/lib/jubjub/pubsub/subscription.rb +6 -6
  26. data/lib/jubjub/response.rb +1 -1
  27. data/lib/jubjub/response/error.rb +6 -6
  28. data/lib/jubjub/response/proxy.rb +8 -8
  29. data/lib/jubjub/response/response.rb +10 -10
  30. data/lib/jubjub/user.rb +16 -15
  31. data/spec/connection/xmpp_gateway_muc_spec.rb +174 -40
  32. data/spec/connection/xmpp_gateway_pubsub_spec.rb +100 -104
  33. data/spec/fixtures/vcr_cassettes/muc_configuration.yml +73 -6
  34. data/spec/fixtures/vcr_cassettes/muc_create_with_configuration.yml +8 -8
  35. data/spec/fixtures/vcr_cassettes/muc_message.yml +89 -0
  36. data/spec/fixtures/vcr_cassettes/muc_modify_affiliations.yml +367 -0
  37. data/spec/fixtures/vcr_cassettes/muc_retrieve_affiliations.yml +93 -0
  38. data/spec/fixtures/vcr_cassettes/pubsub_publish_with_dataform_payload.yml +3 -3
  39. data/spec/fixtures/vcr_cassettes/pubsub_retrieve_items.yml +24 -18
  40. data/spec/mixins/user_spec.rb +37 -37
  41. data/spec/models/data_form_spec.rb +3 -3
  42. data/spec/models/jid_spec.rb +41 -41
  43. data/spec/models/muc_affiliation_collection_spec.rb +146 -0
  44. data/spec/models/muc_affiliation_spec.rb +215 -0
  45. data/spec/models/muc_collection_spec.rb +64 -32
  46. data/spec/models/muc_configuration_spec.rb +3 -3
  47. data/spec/models/muc_spec.rb +44 -23
  48. data/spec/models/pubsub_affiliation_collection_spec.rb +65 -30
  49. data/spec/models/pubsub_affiliation_spec.rb +50 -50
  50. data/spec/models/pubsub_collection_spec.rb +65 -49
  51. data/spec/models/pubsub_item_collection_spec.rb +17 -17
  52. data/spec/models/pubsub_item_spec.rb +18 -18
  53. data/spec/models/pubsub_spec.rb +41 -41
  54. data/spec/models/pubsub_subscription_spec.rb +23 -23
  55. data/spec/models/response_error_spec.rb +19 -19
  56. data/spec/models/response_proxy_spec.rb +51 -49
  57. data/spec/models/response_spec.rb +33 -33
  58. data/spec/support/helpers.rb +21 -1
  59. data/spec/support/matchers.rb +4 -4
  60. data/spec/support/shared_examples.rb +132 -94
  61. data/spec/support/webmock_stanza_matching.rb +43 -0
  62. metadata +45 -16
@@ -67,6 +67,31 @@ Examples
67
67
  c['muc#roomconfig_allowinvites'] = false
68
68
  }
69
69
 
70
+ # Retrieve current affiliations
71
+ room.affiliations
72
+ => [#<Jubjub::Muc::Affiliation:0x1019a3c90 @muc_jid="jubjub@chat.test.com" @jid="theozaurus@jabber.org" @nick=nil @affiliation="owner" @role=nil>]
73
+
74
+ # Search affiliations
75
+ room.affiliations['theozaurus@jabber.org']
76
+ => #<Jubjub::Muc::Affiliation:0x1019a3c90 @muc_jid="jubjub@chat.test.com" @jid="theozaurus@jabber.org" @nick=nil @affiliation="owner" @role=nil>
77
+
78
+ # Test affiliations
79
+ room.affiliations['theozaurus@jabber.org'].owner?
80
+ => true
81
+ room.affiliations['theozaurus@jabber.org'].member?
82
+ => false
83
+
84
+ # Create affiliation
85
+ room.affiliations['bob@test.com'].set_admin
86
+ => true
87
+ # or
88
+ room.affiliations['bot@test.com'].set('admin')
89
+ => true
90
+
91
+ # Message a room
92
+ room.message "I am an invisible man."
93
+ => #<Jubjub::Muc:0x10161c3b0 @jid="customjub@chat.test.com" @name=nil>
94
+
70
95
  # Destroy a room
71
96
  room.destroy
72
97
  => true
@@ -230,7 +255,8 @@ The error `type` and error `condition` are the important factors. The `type` is
230
255
  TODO
231
256
  ====
232
257
 
233
- - MUC user role and affiliation control
258
+ - MUC user role control
259
+ - Bulk Pubsub and MUC affiliation control
234
260
  - Better exception handling
235
261
  - Service discovery
236
262
  - Operations that are not IQ based, such as rosters and two way messaging
@@ -1 +1 @@
1
- require 'jubjub/user'
1
+ require 'jubjub/user'
@@ -6,23 +6,23 @@ require "jubjub/connection/xmpp_gateway/pubsub"
6
6
  module Jubjub
7
7
  module Connection
8
8
  class XmppGateway
9
-
9
+
10
10
  attr_reader :jid
11
-
11
+
12
12
  def initialize(jid,password,settings)
13
13
  @jid = jid
14
14
  @password = password
15
15
  @settings = settings
16
16
  end
17
-
17
+
18
18
  def muc
19
19
  @muc ||= Muc.new(self)
20
20
  end
21
-
21
+
22
22
  def pubsub
23
23
  @pubsub ||= Pubsub.new(self)
24
24
  end
25
-
25
+
26
26
  def write(stanza)
27
27
  req = Net::HTTP::Post.new( url.path )
28
28
  req.basic_auth( @jid.to_s, @password )
@@ -33,20 +33,20 @@ module Jubjub
33
33
  # OK
34
34
  else
35
35
  #res.error!
36
- end
36
+ end
37
37
  decode res.body
38
38
  end
39
39
 
40
40
  private
41
-
41
+
42
42
  def url
43
43
  URI.parse "http://#{@settings[:host]}:#{@settings[:port]}/"
44
44
  end
45
-
45
+
46
46
  def decode(http_body)
47
47
  Nokogiri::XML::Document.parse http_body
48
48
  end
49
49
 
50
50
  end
51
51
  end
52
- end
52
+ end
@@ -2,16 +2,16 @@ module Jubjub
2
2
  module Connection
3
3
  class XmppGateway
4
4
  module Helper
5
-
5
+
6
6
  def initialize(connection)
7
7
  @connection = connection
8
8
  end
9
-
9
+
10
10
  def write(stanza)
11
- @connection.write(stanza)
11
+ @connection.write stanza.to_xml(:indent => 0, :save_with => Nokogiri::XML::Node::SaveOptions::NO_DECLARATION)
12
12
  end
13
-
13
+
14
14
  end
15
15
  end
16
16
  end
17
- end
17
+ end
@@ -5,19 +5,19 @@ module Jubjub
5
5
  module Connection
6
6
  class XmppGateway
7
7
  class Muc
8
-
8
+
9
9
  include Helper
10
-
10
+
11
11
  def initialize(connection)
12
12
  @connection = connection
13
13
  end
14
-
14
+
15
15
  # http://xmpp.org/extensions/xep-0045.html#createroom-instant
16
16
  # <presence
17
17
  # from='crone1@shakespeare.lit/desktop'
18
18
  # to='darkcave@chat.shakespeare.lit/firstwitch'>
19
19
  # <x xmlns='http://jabber.org/protocol/muc'/>
20
- # </presence>
20
+ # </presence>
21
21
  # <iq from='crone1@shakespeare.lit/desktop'
22
22
  # id='create1'
23
23
  # to='darkcave@chat.shakespeare.lit'
@@ -35,23 +35,23 @@ module Jubjub
35
35
  #
36
36
  def create(full_jid, configuration = Jubjub::Muc::Configuration.new)
37
37
  room_jid = Jubjub::Jid.new full_jid.node, full_jid.domain
38
-
38
+
39
39
  request = Nokogiri::XML::Builder.new do |xml|
40
40
  xml.iq_(:type => 'set', :to => room_jid) {
41
- xml.query_('xmlns' => 'http://jabber.org/protocol/muc#owner'){
41
+ xml.query_('xmlns' => namespaces['muc_owner']){
42
42
  configuration.to_builder(xml.parent)
43
43
  }
44
44
  }
45
45
  end
46
-
46
+
47
47
  presence full_jid
48
-
49
- Jubjub::Response.new( write request.to_xml ){|stanza|
48
+
49
+ Jubjub::Response.new( write request ){|stanza|
50
50
  success = stanza.xpath( '/iq[@type="result"]' ).any?
51
51
  Jubjub::Muc.new room_jid, nil, @connection if success
52
52
  }.proxy_result
53
53
  end
54
-
54
+
55
55
  # http://xmpp.org/extensions/xep-0045.html#createroom-reserved
56
56
  # <presence
57
57
  # from='crone1@shakespeare.lit/desktop'
@@ -200,16 +200,16 @@ module Jubjub
200
200
  # </iq>
201
201
  def configuration(full_jid)
202
202
  room_jid = Jubjub::Jid.new full_jid.node, full_jid.domain
203
-
203
+
204
204
  request = Nokogiri::XML::Builder.new do |xml|
205
205
  xml.iq_(:to => room_jid, :type => 'get') {
206
- xml.query_('xmlns' => 'http://jabber.org/protocol/muc#owner')
206
+ xml.query_('xmlns' => namespaces['muc_owner'])
207
207
  }
208
208
  end
209
-
209
+
210
210
  presence full_jid
211
-
212
- Jubjub::Response.new( write request.to_xml ){|stanza|
211
+
212
+ Jubjub::Response.new( write request ){|stanza|
213
213
  config = stanza.xpath(
214
214
  "/iq[@type='result']/muc_owner:query/x_data:x[@type='form']",
215
215
  namespaces
@@ -217,7 +217,7 @@ module Jubjub
217
217
  Jubjub::Muc::Configuration.new config if config
218
218
  }.proxy_result
219
219
  end
220
-
220
+
221
221
  # http://xmpp.org/extensions/xep-0045.html#destroyroom
222
222
  # <iq from='crone1@shakespeare.lit/desktop'
223
223
  # id='begone'
@@ -238,17 +238,17 @@ module Jubjub
238
238
  def destroy(jid)
239
239
  request = Nokogiri::XML::Builder.new do |xml|
240
240
  xml.iq_(:to => jid, :type => 'set') {
241
- xml.query_('xmlns' => 'http://jabber.org/protocol/muc#owner'){
241
+ xml.query_('xmlns' => namespaces['muc_owner']){
242
242
  xml.destroy_
243
243
  }
244
244
  }
245
245
  end
246
-
247
- Jubjub::Response.new( write request.to_xml ){|stanza|
246
+
247
+ Jubjub::Response.new( write request ){|stanza|
248
248
  stanza.xpath( '/iq[@type="result"]' ).any?
249
249
  }.proxy_result
250
250
  end
251
-
251
+
252
252
  # http://xmpp.org/extensions/xep-0045.html#disco-rooms
253
253
  # <iq from='hag66@shakespeare.lit/pda'
254
254
  # id='disco2'
@@ -276,11 +276,11 @@ module Jubjub
276
276
  def list(jid)
277
277
  request = Nokogiri::XML::Builder.new do |xml|
278
278
  xml.iq_(:to => jid, :type => 'get') {
279
- xml.query_('xmlns' => 'http://jabber.org/protocol/disco#items')
279
+ xml.query_('xmlns' => namespaces['disco_items'])
280
280
  }
281
281
  end
282
-
283
- Jubjub::Response.new( write request.to_xml ){|stanza|
282
+
283
+ Jubjub::Response.new( write request ){|stanza|
284
284
  stanza.xpath(
285
285
  '/iq[@type="result"]/disco_items:query/disco_items:item',
286
286
  namespaces
@@ -290,7 +290,101 @@ module Jubjub
290
290
  }
291
291
  }.proxy_result
292
292
  end
293
-
293
+
294
+ # http://xmpp.org/extensions/xep-0045.html#modifymember
295
+ # <iq from='crone1@shakespeare.lit/desktop'
296
+ # id='member3'
297
+ # to='coven@chat.shakespeare.lit'
298
+ # type='get'>
299
+ # <query xmlns='http://jabber.org/protocol/muc#admin'>
300
+ # <item affiliation='member'/>
301
+ # </query>
302
+ # </iq>
303
+ #
304
+ # Expected
305
+ # <iq from='coven@chat.shakespeare.lit'
306
+ # id='member3'
307
+ # to='crone1@shakespeare.lit/desktop'
308
+ # type='result'>
309
+ # <query xmlns='http://jabber.org/protocol/muc#admin'>
310
+ # <item affiliation='member'
311
+ # jid='hag66@shakespeare.lit'
312
+ # nick='thirdwitch'
313
+ # role='participant'/>
314
+ # </query>
315
+ # </iq>
316
+ def retrieve_affiliations(jid, affiliation)
317
+ request = Nokogiri::XML::Builder.new do |xml|
318
+ xml.iq_(:to => jid, :type => 'get') {
319
+ xml.query_('xmlns' => namespaces['muc_admin']) {
320
+ xml.item_(:affiliation => affiliation)
321
+ }
322
+ }
323
+ end
324
+
325
+ Jubjub::Response.new( write request ){|stanza|
326
+ stanza.xpath(
327
+ '/iq[@type="result"]/muc_admin:query/muc_admin:item',
328
+ namespaces
329
+ ).map{|item|
330
+ # Convert to Jubjub object
331
+ Jubjub::Muc::Affiliation.new jid, item.attr('jid'), item.attr('nick'), item.attr('role'), item.attr('affiliation'), @connection
332
+ }
333
+ }.proxy_result
334
+ end
335
+
336
+ # http://xmpp.org/extensions/xep-0045.html#grantmember
337
+ # <iq from='crone1@shakespeare.lit/desktop'
338
+ # id='member1'
339
+ # to='coven@chat.shakespeare.lit'
340
+ # type='set'>
341
+ # <query xmlns='http://jabber.org/protocol/muc#admin'>
342
+ # <item affiliation='member'
343
+ # jid='hag66@shakespeare.lit'/>
344
+ # </query>
345
+ # </iq>
346
+ #
347
+ # Expected
348
+ # <iq from='coven@chat.shakespeare.lit'
349
+ # id='member1'
350
+ # to='crone1@shakespeare.lit/desktop'
351
+ # type='result'/>
352
+ def modify_affiliations(muc_jid, *affiliations)
353
+ affiliations = [affiliations].flatten
354
+
355
+ request = Nokogiri::XML::Builder.new do |xml|
356
+ xml.iq_(:to => muc_jid, :type => 'set') {
357
+ xml.query_('xmlns' => namespaces['muc_admin']) {
358
+ affiliations.each {|a|
359
+ xml.item_(:affiliation => a.affiliation, :jid => a.jid)
360
+ }
361
+ }
362
+ }
363
+ end
364
+
365
+ Jubjub::Response.new( write request ){|stanza|
366
+ stanza.xpath( '/iq[@type="result"]' ).any?
367
+ }.proxy_result
368
+ end
369
+
370
+
371
+ # http://xmpp.org/extensions/xep-0045.html#message
372
+ # <message
373
+ # from='hag66@shakespeare.lit/pda'
374
+ # to='coven@chat.shakespeare.lit'
375
+ # type='groupchat'>
376
+ # <body>Harpier cries: 'tis time, 'tis time.</body>
377
+ # </message>
378
+ def message(muc_jid, body)
379
+ request = Nokogiri::XML::Builder.new do |xml|
380
+ xml.message_(:to => muc_jid, :type => 'groupchat') {
381
+ xml.body_ body
382
+ }
383
+ end
384
+
385
+ write request
386
+ end
387
+
294
388
  # http://xmpp.org/extensions/xep-0045.html#exit
295
389
  # <presence
296
390
  # from='hag66@shakespeare.lit/pda'
@@ -299,31 +393,32 @@ module Jubjub
299
393
  def exit(full_jid)
300
394
  presence full_jid, :unavailable
301
395
  end
302
-
396
+
303
397
  private
304
-
398
+
305
399
  def presence(full_jid, availability = :available)
306
400
  options = { :to => full_jid }
307
401
  options[:type] = availability unless availability == :available
308
-
402
+
309
403
  request = Nokogiri::XML::Builder.new do |xml|
310
404
  xml.presence_(options) {
311
405
  xml.x_('xmlns' => 'http://jabber.org/protocol/muc')
312
406
  }
313
407
  end
314
-
315
- write request.to_xml
408
+
409
+ write request
316
410
  end
317
-
411
+
318
412
  def namespaces
319
413
  {
320
414
  'disco_items' => 'http://jabber.org/protocol/disco#items',
321
415
  'muc_owner' => "http://jabber.org/protocol/muc#owner",
416
+ 'muc_admin' => "http://jabber.org/protocol/muc#admin",
322
417
  'x_data' => 'jabber:x:data'
323
418
  }
324
419
  end
325
-
420
+
326
421
  end
327
422
  end
328
423
  end
329
- end
424
+ end
@@ -5,13 +5,13 @@ module Jubjub
5
5
  module Connection
6
6
  class XmppGateway
7
7
  class Pubsub
8
-
8
+
9
9
  include Helper
10
-
10
+
11
11
  def initialize(connection)
12
12
  @connection = connection
13
13
  end
14
-
14
+
15
15
  # http://xmpp.org/extensions/xep-0060.html#entity-nodes
16
16
  # <iq type='get'
17
17
  # from='francisco@denmark.lit/barracks'
@@ -19,7 +19,7 @@ module Jubjub
19
19
  # id='nodes1'>
20
20
  # <query xmlns='http://jabber.org/protocol/disco#items'/>
21
21
  # </iq>
22
- #
22
+ #
23
23
  # Expected
24
24
  # <iq type='result'
25
25
  # from='pubsub.shakespeare.lit'
@@ -40,8 +40,8 @@ module Jubjub
40
40
  xml.query_('xmlns' => namespaces['disco_items'])
41
41
  }
42
42
  end
43
-
44
- Jubjub::Response.new( write request.to_xml ){|stanza|
43
+
44
+ Jubjub::Response.new( write request ){|stanza|
45
45
  stanza.xpath(
46
46
  '/iq[@type="result"]/disco_items:query/disco_items:item',
47
47
  namespaces
@@ -52,7 +52,7 @@ module Jubjub
52
52
  }
53
53
  }.proxy_result
54
54
  end
55
-
55
+
56
56
  # http://xmpp.org/extensions/xep-0060.html#owner-create-and-configure
57
57
  # <iq type='set'
58
58
  # from='hamlet@denmark.lit/elsinore'
@@ -71,7 +71,7 @@ module Jubjub
71
71
  # </configure>
72
72
  # </pubsub>
73
73
  # </iq>
74
- #
74
+ #
75
75
  # Expected
76
76
  # <iq type='result'
77
77
  # from='pubsub.shakespeare.lit'
@@ -82,7 +82,7 @@ module Jubjub
82
82
  xml.iq_(:to => jid, :type => 'set') {
83
83
  xml.pubsub_('xmlns' => namespaces['pubsub']) {
84
84
  xml.create_('node' => node)
85
- if configuration
85
+ if configuration
86
86
  xml.configure_{
87
87
  configuration.to_builder(xml.parent)
88
88
  }
@@ -90,8 +90,8 @@ module Jubjub
90
90
  }
91
91
  }
92
92
  end
93
-
94
- Jubjub::Response.new( write request.to_xml ){|stanza|
93
+
94
+ Jubjub::Response.new( write request ){|stanza|
95
95
  success = stanza.xpath(
96
96
  # Pull out required parts
97
97
  '/iq[@type="result"]'
@@ -99,7 +99,7 @@ module Jubjub
99
99
  Jubjub::Pubsub.new jid, node, @connection if success
100
100
  }.proxy_result
101
101
  end
102
-
102
+
103
103
  # http://xmpp.org/extensions/xep-0060.html#owner-configure
104
104
  # <iq type='get'
105
105
  # from='hamlet@denmark.lit/elsinore'
@@ -109,7 +109,7 @@ module Jubjub
109
109
  # <configure node='princely_musings'/>
110
110
  # </pubsub>
111
111
  # </iq>
112
- #
112
+ #
113
113
  # Expected
114
114
  # <iq type='result'
115
115
  # from='pubsub.shakespeare.lit'
@@ -132,7 +132,7 @@ module Jubjub
132
132
  # </configure>
133
133
  # </pubsub>
134
134
  # </iq>
135
- def default_configuration(jid)
135
+ def default_configuration(jid)
136
136
  request = Nokogiri::XML::Builder.new do |xml|
137
137
  xml.iq_(:to => jid, :type => 'get') {
138
138
  xml.pubsub_('xmlns' => namespaces['pubsub_owner']) {
@@ -140,8 +140,8 @@ module Jubjub
140
140
  }
141
141
  }
142
142
  end
143
-
144
- Jubjub::Response.new( write request.to_xml ){|stanza|
143
+
144
+ Jubjub::Response.new( write request ){|stanza|
145
145
  config = stanza.xpath(
146
146
  # Pull out required parts
147
147
  "/iq[@type='result']/pubsub_owner:pubsub/pubsub_owner:default/x_data:x[@type='form']",
@@ -150,7 +150,7 @@ module Jubjub
150
150
  Jubjub::Pubsub::Configuration.new config if config
151
151
  }.proxy_result
152
152
  end
153
-
153
+
154
154
  # http://xmpp.org/extensions/xep-0060.html#owner-delete
155
155
  # <iq type='set'
156
156
  # from='hamlet@denmark.lit/elsinore'
@@ -162,12 +162,12 @@ module Jubjub
162
162
  # </delete>
163
163
  # </pubsub>
164
164
  # </iq>
165
- #
165
+ #
166
166
  # Expected
167
167
  # <iq type='result'
168
168
  # from='pubsub.shakespeare.lit'
169
169
  # id='delete1'/>
170
- def destroy(jid, node, redirect_jid = nil, redirect_node = nil)
170
+ def destroy(jid, node, redirect_jid = nil, redirect_node = nil)
171
171
  request = Nokogiri::XML::Builder.new do |xml|
172
172
  xml.iq_(:to => jid, :type => 'set') {
173
173
  xml.pubsub_('xmlns' => namespaces['pubsub_owner']) {
@@ -177,12 +177,12 @@ module Jubjub
177
177
  }
178
178
  }
179
179
  end
180
-
181
- Jubjub::Response.new( write request.to_xml ){|stanza|
180
+
181
+ Jubjub::Response.new( write request ){|stanza|
182
182
  stanza.xpath( '/iq[@type="result"]' ).any?
183
183
  }.proxy_result
184
184
  end
185
-
185
+
186
186
  # http://xmpp.org/extensions/xep-0060.html#owner-purge
187
187
  # <iq type='set'
188
188
  # from='hamlet@denmark.lit/elsinore'
@@ -205,12 +205,12 @@ module Jubjub
205
205
  }
206
206
  }
207
207
  end
208
-
209
- Jubjub::Response.new( write request.to_xml ){|stanza|
208
+
209
+ Jubjub::Response.new( write request ){|stanza|
210
210
  stanza.xpath( '/iq[@type="result"]' ).any?
211
211
  }.proxy_result
212
212
  end
213
-
213
+
214
214
  # http://xmpp.org/extensions/xep-0060.html#subscriber-subscribe
215
215
  # <iq type='set'
216
216
  # from='francisco@denmark.lit/barracks'
@@ -236,7 +236,7 @@ module Jubjub
236
236
  # subscription='subscribed'/>
237
237
  # </pubsub>
238
238
  # </iq>
239
- def subscribe(jid, node)
239
+ def subscribe(jid, node)
240
240
  request = Nokogiri::XML::Builder.new do |xml|
241
241
  xml.iq_(:to => jid, :type => 'set') {
242
242
  xml.pubsub_('xmlns' => namespaces['pubsub']) {
@@ -244,21 +244,21 @@ module Jubjub
244
244
  }
245
245
  }
246
246
  end
247
-
248
- Jubjub::Response.new( write request.to_xml ){|stanza|
247
+
248
+ Jubjub::Response.new( write request ){|stanza|
249
249
  result = stanza.xpath(
250
250
  '/iq[@type="result"]/pubsub:pubsub/pubsub:subscription',
251
251
  namespaces
252
252
  )
253
253
  if result.any?
254
254
  subscriber = Jubjub::Jid.new(result.first.attr('jid'))
255
- subid = result.first.attr('subid')
255
+ subid = result.first.attr('subid')
256
256
  subscription = result.first.attr('subscription')
257
257
  Jubjub::Pubsub::Subscription.new jid, node, subscriber, subid, subscription, @connection
258
258
  end
259
259
  }.proxy_result
260
260
  end
261
-
261
+
262
262
  # http://xmpp.org/extensions/xep-0060.html#subscriber-unsubscribe
263
263
  # <iq type='set'
264
264
  # from='francisco@denmark.lit/barracks'
@@ -270,16 +270,16 @@ module Jubjub
270
270
  # jid='francisco@denmark.lit'/>
271
271
  # </pubsub>
272
272
  # </iq>
273
- #
273
+ #
274
274
  # Expected
275
275
  # <iq type='result'
276
276
  # from='pubsub.shakespeare.lit'
277
277
  # to='francisco@denmark.lit/barracks'
278
278
  # id='unsub1'/>
279
- def unsubscribe(jid, node, subid=nil)
279
+ def unsubscribe(jid, node, subid=nil)
280
280
  unsubscribe_options = {'node' => node, 'jid' => subscriber}
281
281
  unsubscribe_options['subid'] = subid if subid
282
-
282
+
283
283
  request = Nokogiri::XML::Builder.new do |xml|
284
284
  xml.iq_(:to => jid, :type => 'set') {
285
285
  xml.pubsub_('xmlns' => namespaces['pubsub']) {
@@ -287,12 +287,12 @@ module Jubjub
287
287
  }
288
288
  }
289
289
  end
290
-
291
- Jubjub::Response.new( write request.to_xml ){|stanza|
290
+
291
+ Jubjub::Response.new( write request ){|stanza|
292
292
  stanza.xpath( '/iq[@type="result"]' ).any?
293
293
  }.proxy_result
294
294
  end
295
-
295
+
296
296
  # http://xmpp.org/extensions/xep-0060.html#publisher-publish
297
297
  # <iq type='set'
298
298
  # from='hamlet@denmark.lit/blogbot'
@@ -306,7 +306,7 @@ module Jubjub
306
306
  # </publish>
307
307
  # </pubsub>
308
308
  # </iq>
309
- #
309
+ #
310
310
  # Expected
311
311
  # <iq type='result'
312
312
  # from='pubsub.shakespeare.lit'
@@ -321,7 +321,7 @@ module Jubjub
321
321
  def publish(jid, node, data, item_id = nil)
322
322
  item_options = {}
323
323
  item_options[:id] = item_id if item_id
324
-
324
+
325
325
  request = Nokogiri::XML::Builder.new do |xml|
326
326
  xml.iq_(:to => jid, :type => 'set') {
327
327
  xml.pubsub_('xmlns' => namespaces['pubsub']) {
@@ -337,8 +337,8 @@ module Jubjub
337
337
  }
338
338
  }
339
339
  end
340
-
341
- Jubjub::Response.new( write request.to_xml ){|stanza|
340
+
341
+ Jubjub::Response.new( write request ){|stanza|
342
342
  result = stanza.xpath(
343
343
  '/iq[@type="result"]/pubsub:pubsub/pubsub:publish/pubsub:item',
344
344
  namespaces
@@ -350,7 +350,7 @@ module Jubjub
350
350
  end
351
351
  }.proxy_result
352
352
  end
353
-
353
+
354
354
  # http://xmpp.org/extensions/xep-0060.html#publisher-delete
355
355
  # <iq type='set'
356
356
  # from='hamlet@denmark.lit/elsinore'
@@ -362,7 +362,7 @@ module Jubjub
362
362
  # </retract>
363
363
  # </pubsub>
364
364
  # </iq>
365
- #
365
+ #
366
366
  # Expected
367
367
  # <iq type='result'
368
368
  # from='pubsub.shakespeare.lit'
@@ -378,12 +378,12 @@ module Jubjub
378
378
  }
379
379
  }
380
380
  end
381
-
382
- Jubjub::Response.new( write request.to_xml ){|stanza|
381
+
382
+ Jubjub::Response.new( write request ){|stanza|
383
383
  stanza.xpath( '/iq[@type="result"]' ).any?
384
384
  }.proxy_result
385
385
  end
386
-
386
+
387
387
  # http://xmpp.org/extensions/xep-0060.html#subscriber-retrieve
388
388
  # <iq type='get'
389
389
  # from='francisco@denmark.lit/barracks'
@@ -393,7 +393,7 @@ module Jubjub
393
393
  # <items node='princely_musings'/>
394
394
  # </pubsub>
395
395
  # </iq>
396
- #
396
+ #
397
397
  # Expected
398
398
  # <iq type='result'
399
399
  # from='pubsub.shakespeare.lit'
@@ -427,8 +427,8 @@ module Jubjub
427
427
  }
428
428
  }
429
429
  end
430
-
431
- Jubjub::Response.new( write request.to_xml ){|stanza|
430
+
431
+ Jubjub::Response.new( write request ){|stanza|
432
432
  stanza.xpath(
433
433
  '/iq[@type="result"]/pubsub:pubsub/pubsub:items/pubsub:item',
434
434
  namespaces
@@ -439,8 +439,8 @@ module Jubjub
439
439
  }
440
440
  }.proxy_result
441
441
  end
442
-
443
-
442
+
443
+
444
444
  # http://xmpp.org/extensions/xep-0060.html#owner-affiliations
445
445
  # <iq type='get'
446
446
  # from='hamlet@denmark.lit/elsinore'
@@ -450,7 +450,7 @@ module Jubjub
450
450
  # <affiliations node='princely_musings'/>
451
451
  # </pubsub>
452
452
  # </iq>
453
- #
453
+ #
454
454
  # Expected
455
455
  # <iq type='result'
456
456
  # from='pubsub.shakespeare.lit'
@@ -471,8 +471,8 @@ module Jubjub
471
471
  }
472
472
  }
473
473
  end
474
-
475
- Jubjub::Response.new( write request.to_xml ){|stanza|
474
+
475
+ Jubjub::Response.new( write request ){|stanza|
476
476
  stanza.xpath(
477
477
  '/iq[@type="result"]/pubsub_owner:pubsub/pubsub_owner:affiliations/pubsub_owner:affiliation',
478
478
  namespaces
@@ -483,7 +483,7 @@ module Jubjub
483
483
  }
484
484
  }.proxy_result
485
485
  end
486
-
486
+
487
487
  # http://xmpp.org/extensions/xep-0060.html#owner-affiliations-modify
488
488
  # <iq type='set'
489
489
  # from='hamlet@denmark.lit/elsinore'
@@ -495,14 +495,14 @@ module Jubjub
495
495
  # </affiliations>
496
496
  # </pubsub>
497
497
  # </iq>
498
- #
498
+ #
499
499
  # Expected
500
500
  # <iq type='result'
501
501
  # from='pubsub.shakespeare.lit'
502
502
  # id='ent2'/>
503
503
  def modify_affiliations(pubsub_jid, pubsub_node, *affiliations)
504
504
  affiliations = [affiliations].flatten
505
-
505
+
506
506
  request = Nokogiri::XML::Builder.new do |xml|
507
507
  xml.iq_(:to => pubsub_jid, :type => 'set') {
508
508
  xml.pubsub_(:xmlns => namespaces['pubsub_owner']){
@@ -514,22 +514,22 @@ module Jubjub
514
514
  }
515
515
  }
516
516
  end
517
-
518
- Jubjub::Response.new( write request.to_xml ){|stanza|
517
+
518
+ Jubjub::Response.new( write request ){|stanza|
519
519
  stanza.xpath( '/iq[@type="result"]' ).any?
520
520
  }.proxy_result
521
521
  end
522
-
522
+
523
523
  private
524
-
524
+
525
525
  def subscriber
526
526
  Jubjub::Jid.new @connection.jid.node, @connection.jid.domain
527
527
  end
528
-
528
+
529
529
  def pubsub_uri(jid, node)
530
530
  "xmpp:#{jid}?;node=#{node}"
531
531
  end
532
-
532
+
533
533
  def namespaces
534
534
  {
535
535
  'disco_items' => 'http://jabber.org/protocol/disco#items',
@@ -538,8 +538,8 @@ module Jubjub
538
538
  'x_data' => 'jabber:x:data'
539
539
  }
540
540
  end
541
-
541
+
542
542
  end
543
543
  end
544
544
  end
545
- end
545
+ end