jubjub 0.0.5 → 0.0.6

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.
Files changed (39) hide show
  1. data/README.mdown +42 -6
  2. data/lib/jubjub/connection/xmpp_gateway/muc.rb +4 -20
  3. data/lib/jubjub/connection/xmpp_gateway/pubsub.rb +194 -13
  4. data/lib/jubjub/data_form.rb +30 -0
  5. data/lib/jubjub/muc.rb +4 -93
  6. data/lib/jubjub/muc/collection.rb +55 -0
  7. data/lib/jubjub/muc/configuration.rb +5 -0
  8. data/lib/jubjub/muc/muc.rb +37 -0
  9. data/lib/jubjub/pubsub.rb +8 -201
  10. data/lib/jubjub/pubsub/affiliation.rb +83 -0
  11. data/lib/jubjub/pubsub/affiliation_collection.rb +38 -0
  12. data/lib/jubjub/pubsub/collection.rb +68 -0
  13. data/lib/jubjub/pubsub/configuration.rb +5 -0
  14. data/lib/jubjub/pubsub/item.rb +35 -0
  15. data/lib/jubjub/pubsub/item_collection.rb +35 -0
  16. data/lib/jubjub/pubsub/pubsub.rb +66 -0
  17. data/lib/jubjub/pubsub/subscription.rb +24 -0
  18. data/lib/jubjub/user.rb +2 -2
  19. data/spec/connection/xmpp_gateway_muc_spec.rb +3 -3
  20. data/spec/connection/xmpp_gateway_pubsub_spec.rb +167 -11
  21. data/spec/fixtures/dataform_1.xml +65 -0
  22. data/spec/fixtures/vcr_cassettes/pubsub_default_configuration.yml +118 -0
  23. data/spec/fixtures/vcr_cassettes/pubsub_modify_affiliations.yml +275 -0
  24. data/spec/fixtures/vcr_cassettes/pubsub_purge.yml +68 -0
  25. data/spec/fixtures/vcr_cassettes/pubsub_retrieve_affiliations.yml +99 -0
  26. data/spec/mixins/user_spec.rb +8 -8
  27. data/spec/models/muc_collection_spec.rb +17 -12
  28. data/spec/models/muc_configuration_spec.rb +1 -1
  29. data/spec/models/pubsub_affiliation_collection_spec.rb +86 -0
  30. data/spec/models/pubsub_affiliation_spec.rb +244 -0
  31. data/spec/models/pubsub_collection_spec.rb +50 -18
  32. data/spec/models/pubsub_item_collection_spec.rb +12 -12
  33. data/spec/models/pubsub_item_spec.rb +9 -2
  34. data/spec/models/pubsub_spec.rb +27 -2
  35. data/spec/models/pubsub_subscription_spec.rb +2 -2
  36. data/spec/spec_helper.rb +1 -1
  37. data/spec/support/helpers.rb +7 -0
  38. data/spec/support/shared_examples.rb +30 -0
  39. metadata +46 -19
@@ -97,17 +97,22 @@ Examples
97
97
  node = u.pubsub.create('node_1')
98
98
  => #<Jubjub::Pubsub:0x101f3bae0 @service="pubsub.jabber.org" @node="node_1">
99
99
 
100
+ # Create a pubsub node with a custom configuration
101
+ u.pubsub.create('node_2'){|c|
102
+ c['pubsub#title'] = "Node 2"
103
+ }
104
+
100
105
  # Subscribe to node
101
106
  subscription = node.subscribe
102
- => #<Jubjub::PubsubSubscription:0x101effd60 @service="pubsub.jabber.org" @node="node_1" @subscriber="theozaurus@jabber.org" @subid="5129CD7935528" @subscription="subscribed">
107
+ => #<Jubjub::Pubsub::Subscription:0x101effd60 @service="pubsub.jabber.org" @node="node_1" @subscriber="theozaurus@jabber.org" @subid="5129CD7935528" @subscription="subscribed">
103
108
 
104
109
  # Subscribe to something else
105
110
  u.pubsub.subscribe('new_thing')
106
- => #<Jubjub::PubsubSubscription:0x101effd60 @service="pubsub.jabber.org" @node="new_thing" @subscriber="theozaurus@jabber.org" @subid="5129CD7935528" @subscription="subscribed">
111
+ => #<Jubjub::Pubsub::Subscription:0x101effd60 @service="pubsub.jabber.org" @node="new_thing" @subscriber="theozaurus@jabber.org" @subid="5129CD7935528" @subscription="subscribed">
107
112
 
108
113
  # Publish to a node
109
114
  item = u.pubsub['node_1'].publish(Jubjub::DataForm.new({:foo => {:type => 'boolean', :value => 'bar'}}))
110
- => #<Jubjub::PubsubItem:0x101f2e9f8 @jid="pubsub.jabber.org" @node="node_1" @item_id="519DCAA72FFD6" @data="<x xmlns=\"jabber:x:data\" type=\"submit\">\n <field var=\"foo\">\n <value>false</value>\n </field>\n</x>">
115
+ => #<Jubjub::Pubsub::Item:0x101f2e9f8 @jid="pubsub.jabber.org" @node="node_1" @item_id="519DCAA72FFD6" @data="<x xmlns=\"jabber:x:data\" type=\"submit\">\n <field var=\"foo\">\n <value>false</value>\n </field>\n</x>">
111
116
 
112
117
  # Retract an item from a node
113
118
  item.retract
@@ -120,13 +125,45 @@ Examples
120
125
  # List items on a node
121
126
  u.pubsub['node_1'].items
122
127
  => [
123
- #<Jubjub::PubsubItem:0x101f7bd48 @jid="pubsub.jabber.org" @node="node_1" @item_id="519DCAA72FFD6" @data="...">,
128
+ #<Jubjub::Pubsub::Item:0x101f7bd48 @jid="pubsub.jabber.org" @node="node_1" @item_id="519DCAA72FFD6" @data="...">,
124
129
  ...
125
130
  ]
126
131
 
127
132
  # Retrieve an item from a node
128
133
  u.pubsub['node_1'].items['519DCAA72FFD6']
129
- => #<Jubjub::PubsubItem:0x101f7bd48 @jid="pubsub.jabber.org" @node="node_1" @item_id="519DCAA72FFD6" @data="...">
134
+ => #<Jubjub::Pubsub::Item:0x101f7bd48 @jid="pubsub.jabber.org" @node="node_1" @item_id="519DCAA72FFD6" @data="...">
135
+
136
+ # Retrieve affiliations from a node
137
+ u.pubsub['node_1'].affiliations
138
+ => [
139
+ #<Jubjub::Pubsub::Affiliation:0x101f52830 @pubsub_jid="pubsub.jabber.org" @pubsub_node="node_1" @jid="theozaurus@jabber.org" @affiliation="owner">
140
+ ...
141
+ ]
142
+
143
+ # Search affiliations
144
+ u.pubsub['node_1'].affiliations['theozaurus@jabber.org']
145
+ => #<Jubjub::Pubsub::Affiliation:0x101f52830 @pubsub_jid="pubsub.jabber.org" @pubsub_node="node_1" @jid="theozaurus@jabber.org" @affiliation="owner">
146
+
147
+ # Test affiliations
148
+ u.pubsub['node_1'].affiliations['theozaurus@jabber.org'].owner?
149
+ => true
150
+ u.pubsub['node_1'].affiliations['theozaurus@jabber.org'].publisher?
151
+ => false
152
+
153
+ # Set affiliation
154
+ u.pubsub['node_1'].affiliations['theozaurus@jabber.org'].set_publisher
155
+ => true
156
+ # or
157
+ u.pubsub['node_1'].affiliations['theozaurus@jabber.org'].set('publisher')
158
+ => true
159
+
160
+ # Purge a node
161
+ node.purge
162
+ => true
163
+
164
+ # Or
165
+ u.pubsub.purge('node_1')
166
+ => true
130
167
 
131
168
  # Unsubscribe
132
169
  subscription.unsubscribe
@@ -149,7 +186,6 @@ TODO
149
186
 
150
187
  - Error handling
151
188
  - MUC user role and affiliation control
152
- - Pubsub configuration
153
189
  - Service discovery
154
190
  - Operations that are not IQ based, such as rosters and two way messaging
155
191
  - Other backends (for servers that are evented)
@@ -33,7 +33,7 @@ module Jubjub
33
33
  # to='crone1@shakespeare.lit/desktop'
34
34
  # type='result'/>
35
35
  #
36
- def create(full_jid, configuration = Jubjub::MucConfiguration.new)
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|
@@ -217,27 +217,11 @@ module Jubjub
217
217
  request.to_xml
218
218
  ).xpath(
219
219
  # Get fields
220
- "//iq[@type='result']/muc_owner:query/x_data:x[@type='form']/x_data:field",
220
+ "//iq[@type='result']/muc_owner:query/x_data:x[@type='form']",
221
221
  namespaces
222
- ).inject({}){|result,field|
223
- # Build MucConfiguration parameters
224
- hash = {}
225
- hash[:type] = field.attr 'type'
226
- hash[:label] = field.attr 'label'
227
-
228
- value = field.xpath('x_data:value', namespaces)
229
- hash[:value] = hash[:type].match(/\-multi$/) ? value.map{|e| e.content } : value.text
230
-
231
- options = field.xpath('x_data:option', namespaces).map{|o|
232
- { :label => o.attr('label'), :value => o.xpath('x_data:value', namespaces).text }
233
- }
234
- hash[:options] = options if options.any?
235
-
236
- result[field.attr 'var'] = hash
237
- result
238
- }
222
+ )
239
223
 
240
- Jubjub::MucConfiguration.new response
224
+ Jubjub::Muc::Configuration.new response if response
241
225
  end
242
226
 
243
227
  # http://xmpp.org/extensions/xep-0045.html#destroyroom
@@ -55,13 +55,22 @@ module Jubjub
55
55
  }
56
56
  end
57
57
 
58
- # http://xmpp.org/extensions/xep-0060.html#owner-create
58
+ # http://xmpp.org/extensions/xep-0060.html#owner-create-and-configure
59
59
  # <iq type='set'
60
60
  # from='hamlet@denmark.lit/elsinore'
61
61
  # to='pubsub.shakespeare.lit'
62
62
  # id='create1'>
63
63
  # <pubsub xmlns='http://jabber.org/protocol/pubsub'>
64
64
  # <create node='princely_musings'/>
65
+ # <configure>
66
+ # <x xmlns='jabber:x:data' type='submit'>
67
+ # <field var='FORM_TYPE' type='hidden'>
68
+ # <value>http://jabber.org/protocol/pubsub#node_config</value>
69
+ # </field>
70
+ # <field var='pubsub#title'><value>Princely Musings (Atom)</value></field>
71
+ # ...
72
+ # </x>
73
+ # </configure>
65
74
  # </pubsub>
66
75
  # </iq>
67
76
  #
@@ -69,16 +78,17 @@ module Jubjub
69
78
  # <iq type='result'
70
79
  # from='pubsub.shakespeare.lit'
71
80
  # to='hamlet@denmark.lit/elsinore'
72
- # id='create2'>
73
- # <pubsub xmlns='http://jabber.org/protocol/pubsub'>
74
- # <create node='25e3d37dabbab9541f7523321421edc5bfeb2dae'/>
75
- # </pubsub>
76
- # </iq>
77
- def create(jid, node)
81
+ # id='create1'/>
82
+ def create(jid, node, configuration = nil)
78
83
  request = Nokogiri::XML::Builder.new do |xml|
79
84
  xml.iq_(:to => jid, :type => 'set') {
80
85
  xml.pubsub_('xmlns' => namespaces['pubsub']) {
81
86
  xml.create_('node' => node)
87
+ if configuration
88
+ xml.configure_{
89
+ configuration.to_builder(xml.parent)
90
+ }
91
+ end
82
92
  }
83
93
  }
84
94
  end
@@ -88,12 +98,64 @@ module Jubjub
88
98
  request.to_xml
89
99
  ).xpath(
90
100
  # Pull out required parts
91
- '//iq[@type="result"]/pubsub:pubsub/pubsub:create',
92
- namespaces
101
+ '//iq[@type="result"]'
93
102
  ).any?
94
103
  Jubjub::Pubsub.new jid, node, @connection if success
95
104
  end
96
105
 
106
+ # http://xmpp.org/extensions/xep-0060.html#owner-configure
107
+ # <iq type='get'
108
+ # from='hamlet@denmark.lit/elsinore'
109
+ # to='pubsub.shakespeare.lit'
110
+ # id='config1'>
111
+ # <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
112
+ # <configure node='princely_musings'/>
113
+ # </pubsub>
114
+ # </iq>
115
+ #
116
+ # Expected
117
+ # <iq type='result'
118
+ # from='pubsub.shakespeare.lit'
119
+ # to='hamlet@denmark.lit/elsinore'
120
+ # id='config1'>
121
+ # <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
122
+ # <configure node='princely_musings'>
123
+ # <x xmlns='jabber:x:data' type='form'>
124
+ # <field var='FORM_TYPE' type='hidden'>
125
+ # <value>http://jabber.org/protocol/pubsub#node_config</value>
126
+ # </field>
127
+ # <field var='pubsub#title' type='text-single'
128
+ # label='A friendly name for the node'/>
129
+ # <field var='pubsub#deliver_notifications' type='boolean'
130
+ # label='Whether to deliver event notifications'>
131
+ # <value>true</value>
132
+ # </field>
133
+ # ...
134
+ # </x>
135
+ # </configure>
136
+ # </pubsub>
137
+ # </iq>
138
+ def default_configuration(jid)
139
+ request = Nokogiri::XML::Builder.new do |xml|
140
+ xml.iq_(:to => jid, :type => 'get') {
141
+ xml.pubsub_('xmlns' => namespaces['pubsub_owner']) {
142
+ xml.default_
143
+ }
144
+ }
145
+ end
146
+
147
+ response = write(
148
+ # Request default node configuration
149
+ request.to_xml
150
+ ).xpath(
151
+ # Get fields
152
+ "//iq[@type='result']/pubsub_owner:pubsub/pubsub_owner:default/x_data:x[@type='form']",
153
+ namespaces
154
+ )
155
+
156
+ Jubjub::Pubsub::Configuration.new response if response
157
+ end
158
+
97
159
  # http://xmpp.org/extensions/xep-0060.html#owner-delete
98
160
  # <iq type='set'
99
161
  # from='hamlet@denmark.lit/elsinore'
@@ -130,6 +192,38 @@ module Jubjub
130
192
  ).any?
131
193
  end
132
194
 
195
+ # http://xmpp.org/extensions/xep-0060.html#owner-purge
196
+ # <iq type='set'
197
+ # from='hamlet@denmark.lit/elsinore'
198
+ # to='pubsub.shakespeare.lit'
199
+ # id='purge1'>
200
+ # <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
201
+ # <purge node='princely_musings'/>
202
+ # </pubsub>
203
+ # </iq>
204
+ #
205
+ # Expected
206
+ # <iq type='result'
207
+ # from='pubsub.shakespeare.lit'
208
+ # id='purge1'/>
209
+ def purge(jid,node)
210
+ request = Nokogiri::XML::Builder.new do |xml|
211
+ xml.iq_(:to => jid, :type => 'set') {
212
+ xml.pubsub_('xmlns' => namespaces['pubsub_owner']) {
213
+ xml.purge_('node' => node)
214
+ }
215
+ }
216
+ end
217
+
218
+ success = write(
219
+ # Generate stanza
220
+ request.to_xml
221
+ ).xpath(
222
+ # Pull out required parts
223
+ '//iq[@type="result"]'
224
+ ).any?
225
+ end
226
+
133
227
  # http://xmpp.org/extensions/xep-0060.html#subscriber-subscribe
134
228
  # <iq type='set'
135
229
  # from='francisco@denmark.lit/barracks'
@@ -176,7 +270,7 @@ module Jubjub
176
270
  subscriber = Jubjub::Jid.new(result.first.attr('jid'))
177
271
  subid = result.first.attr('subid')
178
272
  subscription = result.first.attr('subscription')
179
- Jubjub::PubsubSubscription.new jid, node, subscriber, subid, subscription, @connection
273
+ Jubjub::Pubsub::Subscription.new jid, node, subscriber, subid, subscription, @connection
180
274
  end
181
275
  end
182
276
 
@@ -274,7 +368,7 @@ module Jubjub
274
368
  if result.any?
275
369
  item_id = result.first.attr('id')
276
370
  data = request.doc.xpath("//pubsub:item/*", namespaces).to_s
277
- Jubjub::PubsubItem.new jid, node, item_id, data, @connection
371
+ Jubjub::Pubsub::Item.new jid, node, item_id, data, @connection
278
372
  end
279
373
  end
280
374
 
@@ -366,10 +460,96 @@ module Jubjub
366
460
  ).map{|item|
367
461
  item_id = item.attr('id')
368
462
  data = item.xpath('./*').to_xml
369
- Jubjub::PubsubItem.new jid, node, item_id, data, @connection
463
+ Jubjub::Pubsub::Item.new jid, node, item_id, data, @connection
464
+ }
465
+ end
466
+
467
+
468
+ # http://xmpp.org/extensions/xep-0060.html#owner-affiliations
469
+ # <iq type='get'
470
+ # from='hamlet@denmark.lit/elsinore'
471
+ # to='pubsub.shakespeare.lit'
472
+ # id='ent1'>
473
+ # <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
474
+ # <affiliations node='princely_musings'/>
475
+ # </pubsub>
476
+ # </iq>
477
+ #
478
+ # Expected
479
+ # <iq type='result'
480
+ # from='pubsub.shakespeare.lit'
481
+ # to='hamlet@denmark.lit/elsinore'
482
+ # id='ent1'>
483
+ # <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
484
+ # <affiliations node='princely_musings'>
485
+ # <affiliation jid='hamlet@denmark.lit' affiliation='owner'/>
486
+ # <affiliation jid='polonius@denmark.lit' affiliation='outcast'/>
487
+ # </affiliations>
488
+ # </pubsub>
489
+ # </iq>
490
+ def retrieve_affiliations(pubsub_jid, pubsub_node)
491
+ request = Nokogiri::XML::Builder.new do |xml|
492
+ xml.iq_(:to => pubsub_jid, :type => 'get') {
493
+ xml.pubsub_(:xmlns => namespaces['pubsub_owner']){
494
+ xml.affiliations_(:node => pubsub_node)
495
+ }
496
+ }
497
+ end
498
+
499
+ write(
500
+ # Generate stanza
501
+ request.to_xml
502
+ ).xpath(
503
+ # Pull out required parts
504
+ '//iq[@type="result"]/pubsub_owner:pubsub/pubsub_owner:affiliations/pubsub_owner:affiliation',
505
+ namespaces
506
+ ).map{|affiliation|
507
+ jid = Jubjub::Jid.new affiliation.attr('jid')
508
+ affiliation = affiliation.attr('affiliation')
509
+ Jubjub::Pubsub::Affiliation.new pubsub_jid, pubsub_node, jid, affiliation, @connection
370
510
  }
371
511
  end
372
512
 
513
+ # http://xmpp.org/extensions/xep-0060.html#owner-affiliations-modify
514
+ # <iq type='set'
515
+ # from='hamlet@denmark.lit/elsinore'
516
+ # to='pubsub.shakespeare.lit'
517
+ # id='ent2'>
518
+ # <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
519
+ # <affiliations node='princely_musings'>
520
+ # <affiliation jid='bard@shakespeare.lit' affiliation='publisher'/>
521
+ # </affiliations>
522
+ # </pubsub>
523
+ # </iq>
524
+ #
525
+ # Expected
526
+ # <iq type='result'
527
+ # from='pubsub.shakespeare.lit'
528
+ # id='ent2'/>
529
+ def modify_affiliations(pubsub_jid, pubsub_node, *affiliations)
530
+ affiliations = [affiliations].flatten
531
+
532
+ request = Nokogiri::XML::Builder.new do |xml|
533
+ xml.iq_(:to => pubsub_jid, :type => 'set') {
534
+ xml.pubsub_(:xmlns => namespaces['pubsub_owner']){
535
+ xml.affiliations_(:node => pubsub_node){
536
+ affiliations.each {|a|
537
+ xml.affiliation_(:jid => a.jid, :affiliation => a.affiliation)
538
+ }
539
+ }
540
+ }
541
+ }
542
+ end
543
+
544
+ write(
545
+ # Generate stanza
546
+ request.to_xml
547
+ ).xpath(
548
+ # Pull out required parts
549
+ '//iq[@type="result"]'
550
+ ).any?
551
+ end
552
+
373
553
  private
374
554
 
375
555
  def subscriber
@@ -384,7 +564,8 @@ module Jubjub
384
564
  {
385
565
  'disco_items' => 'http://jabber.org/protocol/disco#items',
386
566
  'pubsub' => 'http://jabber.org/protocol/pubsub',
387
- 'pubsub_owner' => 'http://jabber.org/protocol/pubsub#owner'
567
+ 'pubsub_owner' => 'http://jabber.org/protocol/pubsub#owner',
568
+ 'x_data' => 'jabber:x:data'
388
569
  }
389
570
  end
390
571
 
@@ -6,6 +6,8 @@ module Jubjub
6
6
  attr_reader :fields
7
7
 
8
8
  def initialize(config={})
9
+ config = convert_xml config if config.respond_to? :xpath
10
+
9
11
  check_config config
10
12
 
11
13
  @fields = config
@@ -85,6 +87,34 @@ module Jubjub
85
87
  ) if mystery_arguments.any?
86
88
  end
87
89
  end
90
+
91
+ def convert_xml(config)
92
+ config.xpath(
93
+ # Get fields
94
+ "//x_data:x[@type='form']/x_data:field",
95
+ namespaces
96
+ ).inject({}){|result,field|
97
+ # Build parameters
98
+ hash = {}
99
+ hash[:type] = field.attr 'type'
100
+ hash[:label] = field.attr 'label'
101
+
102
+ value = field.xpath('x_data:value', namespaces)
103
+ hash[:value] = hash[:type].match(/\-multi$/) ? value.map{|e| e.content } : value.text
104
+
105
+ options = field.xpath('x_data:option', namespaces).map{|o|
106
+ { :label => o.attr('label'), :value => o.xpath('x_data:value', namespaces).text }
107
+ }
108
+ hash[:options] = options if options.any?
109
+
110
+ result[field.attr 'var'] = hash unless hash[:type] == 'fixed'
111
+ result
112
+ }
113
+ end
114
+
115
+ def namespaces
116
+ { 'x_data' => 'jabber:x:data' }
117
+ end
88
118
 
89
119
  end
90
120
 
@@ -1,93 +1,4 @@
1
- require 'jubjub/data_form'
2
-
3
- module Jubjub
4
- class Muc
5
-
6
- attr_reader :jid, :name
7
-
8
- def initialize(jid, name = nil, connection = nil)
9
- @jid = Jubjub::Jid.new(jid)
10
- @name = name
11
- @connection = connection
12
- end
13
-
14
- def exit(nick = nil)
15
- full_jid = Jubjub::Jid.new @jid.node, @jid.domain, nick || @connection.jid.node
16
-
17
- @connection.muc.exit(full_jid)
18
- self
19
- end
20
-
21
- def destroy
22
- @connection.muc.destroy(@jid)
23
- end
24
-
25
- # Hide the connection details and show jid as string for compactness
26
- def inspect
27
- obj_id = "%x" % (object_id << 1)
28
- "#<#{self.class}:0x#{obj_id} @jid=\"#{@jid}\" @name=#{@name.inspect}>"
29
- end
30
-
31
- end
32
-
33
- # Uses proxy pattern for syntax sugar
34
- # and delaying expensive operations until
35
- # required
36
- class MucCollection
37
-
38
- attr_reader :jid
39
-
40
- def initialize(jid, connection)
41
- @jid = Jubjub::Jid.new(jid)
42
- @connection = connection
43
- end
44
-
45
- def create(node, nick = nil, &block)
46
- full_jid = Jubjub::Jid.new node, @jid.domain, nick || @connection.jid.node
47
-
48
- if block_given?
49
- # Reserved room
50
- config = @connection.muc.configuration full_jid
51
- yield config
52
- @connection.muc.create full_jid, config
53
- else
54
- # Instant room
55
- result = @connection.muc.create full_jid
56
- end
57
-
58
- end
59
-
60
- def [](jid_node_num)
61
- case jid_node_num
62
- when Fixnum
63
- list[jid_node_num]
64
- when Jubjub::Jid
65
- list.find{|m| m.jid == jid_node_num }
66
- else
67
- j = Jubjub::Jid.new jid_node_num, jid.domain
68
- list.find{|m| m.jid == j }
69
- end
70
- end
71
-
72
- # Hint that methods are actually applied to list using method_missing
73
- def inspect
74
- list.inspect
75
- end
76
-
77
- private
78
-
79
- def method_missing(name, *args, &block)
80
- list.send(name, *args, &block)
81
- end
82
-
83
- def list
84
- @list ||= @connection.muc.list @jid
85
- end
86
-
87
- end
88
-
89
- class MucConfiguration < DataForm
90
-
91
- end
92
-
93
- end
1
+ require "jubjub/connection/xmpp_gateway/muc"
2
+ require 'jubjub/muc/muc'
3
+ require 'jubjub/muc/collection'
4
+ require 'jubjub/muc/configuration'