bigbluebutton_rails 2.1.0 → 2.2.0

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +21 -0
  4. data/Gemfile +2 -1
  5. data/Gemfile.lock +4 -11
  6. data/Rakefile +15 -15
  7. data/app/controllers/bigbluebutton/recordings_controller.rb +1 -1
  8. data/app/controllers/bigbluebutton/rooms_controller.rb +10 -12
  9. data/app/controllers/bigbluebutton/servers_controller.rb +4 -5
  10. data/app/models/bigbluebutton_meeting.rb +1 -2
  11. data/app/models/bigbluebutton_metadata.rb +2 -2
  12. data/app/models/bigbluebutton_recording.rb +20 -5
  13. data/app/models/bigbluebutton_room.rb +80 -102
  14. data/app/models/bigbluebutton_server.rb +31 -17
  15. data/app/views/bigbluebutton/recordings/_form.html.erb +13 -13
  16. data/app/views/bigbluebutton/rooms/_form.html.erb +0 -4
  17. data/app/views/bigbluebutton/rooms/_rooms.html.erb +0 -4
  18. data/app/views/bigbluebutton/rooms/show.html.erb +0 -4
  19. data/app/workers/bigbluebutton_update_recordings.rb +2 -2
  20. data/config/locales/en.yml +1 -2
  21. data/config/locales/pt-br.yml +1 -2
  22. data/lib/bigbluebutton_rails.rb +22 -108
  23. data/lib/bigbluebutton_rails/background_tasks.rb +7 -3
  24. data/lib/bigbluebutton_rails/configuration.rb +80 -0
  25. data/lib/bigbluebutton_rails/rails/routes.rb +7 -6
  26. data/lib/bigbluebutton_rails/version.rb +1 -1
  27. data/lib/generators/bigbluebutton_rails/install_generator.rb +10 -1
  28. data/lib/generators/bigbluebutton_rails/templates/migration.rb +0 -3
  29. data/lib/generators/bigbluebutton_rails/templates/migration_2_2_0.rb +13 -0
  30. data/spec/controllers/bigbluebutton/recordings_controller_json_responses_spec.rb +4 -5
  31. data/spec/controllers/bigbluebutton/recordings_controller_spec.rb +3 -2
  32. data/spec/controllers/bigbluebutton/rooms_controller_exception_handling_spec.rb +1 -1
  33. data/spec/controllers/bigbluebutton/rooms_controller_json_responses_spec.rb +4 -4
  34. data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +53 -38
  35. data/spec/controllers/bigbluebutton/servers_controller_json_responses_spec.rb +7 -19
  36. data/spec/controllers/bigbluebutton/servers_controller_spec.rb +32 -51
  37. data/spec/factories/bigbluebutton_meeting.rb +0 -1
  38. data/spec/factories/bigbluebutton_recording.rb +1 -0
  39. data/spec/factories/bigbluebutton_room.rb +0 -1
  40. data/spec/models/bigbluebutton_meeting_db_spec.rb +0 -1
  41. data/spec/models/bigbluebutton_meeting_spec.rb +0 -3
  42. data/spec/models/bigbluebutton_metadata_spec.rb +4 -4
  43. data/spec/models/bigbluebutton_recording_spec.rb +32 -0
  44. data/spec/models/bigbluebutton_room_db_spec.rb +0 -2
  45. data/spec/models/bigbluebutton_room_spec.rb +138 -244
  46. data/spec/models/bigbluebutton_server_spec.rb +40 -21
  47. data/spec/rails_app/db/seeds.rb +1 -1
  48. data/spec/rails_app/features/config.yml.example +4 -4
  49. data/spec/rails_app/features/step_definitions/create_rooms_steps.rb +0 -1
  50. data/spec/rails_app/features/support/templates.rb +0 -4
  51. data/spec/rails_app/lib/tasks/db/populate.rake +2 -2
  52. data/spec/routing/bigbluebutton/servers_only_routing_spec.rb +4 -1
  53. data/spec/routing/bigbluebutton/servers_routing_spec.rb +4 -0
  54. data/spec/spec_helper.rb +4 -0
  55. data/spec/support/mocked_server.rb +1 -1
  56. data/spec/workers/bigbluebutton_meeting_updater_spec.rb +3 -3
  57. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a7aa314ce4ce2cd5647e00de7c1507a570cd2943
4
- data.tar.gz: e79e43b6313f3f001d77c2e86fdaf1af2e196e26
3
+ metadata.gz: 44ffb5fae34d7b736ebf6c372c512b2b37d8f41f
4
+ data.tar.gz: 3446e484579e743d3f58b40bcfc06168f8062ac7
5
5
  SHA512:
6
- metadata.gz: 6cc93453645452f995ce330a496cf00c3e60841709cf0345e62d0a365caf8c692f057f4226dc579ff493330d46cc4e2f8585b3b6a2867b88c2762c82cc34e29c
7
- data.tar.gz: 923713967e60d3f4120590061fc266a4d296a605ecbdb94d4188a4856b83b83b8a1277407fda41f00396532bb51792264186ba8caef697dcfd45765b9acb2893
6
+ metadata.gz: 81ccfdd0a387e03d5d54ae67175eb77a1904e524e3f33b13b53a248f5bd7baebb6c0e4fa40317b50d776082fcf3f2ed0b23d33a7cb263f4630995a48bc8a40e6
7
+ data.tar.gz: c608a39eef0b90ce899f344f05b0d07433010375924de85ba19260d39ca11cacc0f7c365f8c6fb078706a985c0710a90921d1684bef7d444ecec18481c165894
@@ -1,8 +1,11 @@
1
1
  sudo: false
2
2
  language: ruby
3
+ services:
4
+ - redis-server
3
5
  bundler_args: "--without production development"
4
6
  before_script:
5
7
  - "cp spec/rails_app/config/database.yml.travis spec/rails_app/config/database.yml"
8
+ - "cp spec/rails_app/features/config.yml.example spec/rails_app/features/config.yml"
6
9
  - "mysql -e 'create database bigbluebutton_rails_test;'"
7
10
  - "mysql -e 'create database bigbluebutton_rails_dev;'"
8
11
  cache: bundler
@@ -1,5 +1,26 @@
1
1
  # Change Log
2
2
 
3
+ ## [2.2.0] - 2017-10-04
4
+
5
+ * Make only description editable in recordings, since all other attributes are taken from
6
+ the server and editing them won't change them in the server.
7
+ * Fix possible error when joining as guest but with permissions to create the room.
8
+ * Add action "check" to servers, redirects to the server's `/check`, an optional module in
9
+ BigBlueButton.
10
+ * Remove db association between servers and rooms/meetings. Now servers are selected on the
11
+ fly for a room that needs one. There's no association between them in the database anymore.
12
+ * Destroy recordings when their server is removed.
13
+ * Don't require `Server#url` and `Server#name` to be unique.
14
+ * Add `guest_support`, originally in Mconf-Web only. This feature is optional and disabled
15
+ by default. Only works in Mconf-Live at this point (future feature on BigBlueButton).
16
+ * Fetch recordings of a server right after it is created.
17
+ * Improve how the gem is configured, add BigbluebuttonRails::Configuration. Makes it clearer
18
+ how customizable variables and methods can be customized.
19
+ * Create a config for servers not in the db yet, so that we can fetch configs for servers
20
+ not in the database.
21
+ * Update how the welcome message is set when there's a dial number set.
22
+ * Add helper methods to BigbluebuttonRecording. Used to calculate size and length of recordings.
23
+
3
24
 
4
25
  ## [2.1.0] - 2016-07-22
5
26
 
data/Gemfile CHANGED
@@ -10,6 +10,7 @@ group :development do
10
10
  gem "rdoc"
11
11
  gem "rails_best_practices"
12
12
  end
13
+ gem "rspec-rails", '~> 2.99.0'
13
14
 
14
15
  group :test do
15
16
  if RUBY_VERSION >= "1.9"
@@ -24,7 +25,7 @@ group :test do
24
25
  gem "generator_spec"
25
26
  gem "rspec-rails", '~> 2.99.0'
26
27
  gem 'rspec-activemodel-mocks'
27
- gem "bbbot-ruby", :git => "git://github.com/mconf/bbbot-ruby.git"
28
+ # gem "bbbot-ruby", :git => "git://github.com/mconf/bbbot-ruby.git"
28
29
  gem "capybara", "~> 2.2.0"
29
30
  gem "capybara-mechanize" # for remote requests
30
31
  gem "capybara-webkit" # best option found for js
@@ -1,13 +1,7 @@
1
- GIT
2
- remote: git://github.com/mconf/bbbot-ruby.git
3
- revision: fcfd8c4c71371653335a46d7462ee14a9301f546
4
- specs:
5
- bbbot-ruby (0.0.1)
6
-
7
1
  PATH
8
2
  remote: .
9
3
  specs:
10
- bigbluebutton_rails (2.1.0)
4
+ bigbluebutton_rails (2.2.0)
11
5
  bigbluebutton-api-ruby (~> 1.6)
12
6
  browser (~> 0.8.0)
13
7
  rails (>= 4.0.0)
@@ -181,7 +175,7 @@ GEM
181
175
  rdoc (4.1.1)
182
176
  json (~> 1.4)
183
177
  redis (3.1.0)
184
- redis-namespace (1.5.2)
178
+ redis-namespace (1.5.3)
185
179
  redis (~> 3.0, >= 3.0.4)
186
180
  ref (1.0.5)
187
181
  require_all (1.3.2)
@@ -233,8 +227,8 @@ GEM
233
227
  multi_json
234
228
  simplecov-html (~> 0.8.0)
235
229
  simplecov-html (0.8.0)
236
- sinatra (1.4.6)
237
- rack (~> 1.4)
230
+ sinatra (1.4.8)
231
+ rack (~> 1.5)
238
232
  rack-protection (~> 1.4)
239
233
  tilt (>= 1.3, < 3)
240
234
  spoon (0.0.4)
@@ -282,7 +276,6 @@ PLATFORMS
282
276
  ruby
283
277
 
284
278
  DEPENDENCIES
285
- bbbot-ruby!
286
279
  bigbluebutton_rails!
287
280
  capybara (~> 2.2.0)
288
281
  capybara-mechanize
data/Rakefile CHANGED
@@ -3,8 +3,8 @@ require 'bundler/setup'
3
3
  require 'rdoc/task'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'rubygems/package_task'
6
- require 'cucumber'
7
- require 'cucumber/rake/task'
6
+ # require 'cucumber'
7
+ # require 'cucumber/rake/task'
8
8
 
9
9
  desc 'Default: run specs and features.'
10
10
  task :default => [:spec]
@@ -24,7 +24,7 @@ end
24
24
  eval("$specification = begin; #{ IO.read('bigbluebutton_rails.gemspec')}; end")
25
25
  Gem::PackageTask.new $specification do |pkg|
26
26
  pkg.need_tar = true
27
- pkg.need_zip = true
27
+ # pkg.need_zip = true
28
28
  end
29
29
 
30
30
  namespace :rails_app do
@@ -40,7 +40,7 @@ namespace :rails_app do
40
40
  task :db do
41
41
  cd File.join(File.dirname(__FILE__), "spec", "rails_app")
42
42
  sh "bundle exec rake db:drop db:create db:migrate db:seed RAILS_ENV=development"
43
- sh "bundle exec rake db:drop db:create db:migrate db:test:prepare RAILS_ENV=test"
43
+ sh "bundle exec rake db:drop db:create db:migrate db:seed RAILS_ENV=test"
44
44
  cd File.dirname(__FILE__)
45
45
  end
46
46
 
@@ -61,19 +61,19 @@ namespace :rails_app do
61
61
  end
62
62
  end
63
63
 
64
- task :cucumber do
65
- # Disable all features that need the bot. It isn't working since BigBlueButton 0.81.
66
- tags = "~@need-bot"
64
+ # task :cucumber do
65
+ # # Disable all features that need the bot. It isn't working since BigBlueButton 0.81.
66
+ # tags = "~@need-bot"
67
67
 
68
- puts "* Dummy app features"
69
- cd File.join(File.dirname(__FILE__), "spec", "rails_app")
70
- sh "bundle exec cucumber features/ --tags #{tags}"
71
- cd File.dirname(__FILE__)
72
- end
68
+ # puts "* Dummy app features"
69
+ # cd File.join(File.dirname(__FILE__), "spec", "rails_app")
70
+ # sh "bundle exec cucumber features/ --tags #{tags}"
71
+ # cd File.dirname(__FILE__)
72
+ # end
73
73
 
74
- task :notes do
75
- puts `grep -r 'OPTIMIZE\\|FIXME\\|TODO' app/ public/ spec/`
76
- end
74
+ # task :notes do
75
+ # puts `grep -r 'OPTIMIZE\\|FIXME\\|TODO' app/ public/ spec/`
76
+ # end
77
77
 
78
78
  desc 'Setup the rails_app using the migration files created when upgrading the gem
79
79
  version, run all tests and destroys the generated files.'
@@ -148,7 +148,7 @@ class Bigbluebutton::RecordingsController < ApplicationController
148
148
  end
149
149
 
150
150
  def recording_allowed_params
151
- [ :recordid, :meetingid, :name, :published, :start_time, :end_time, :available, :description ]
151
+ [ :description ]
152
152
  end
153
153
 
154
154
  protected
@@ -185,19 +185,17 @@ class Bigbluebutton::RoomsController < ApplicationController
185
185
  def fetch_recordings
186
186
  error = false
187
187
 
188
- if @room.server.nil?
189
- error = true
190
- message = t('bigbluebutton_rails.rooms.errors.fetch_recordings.no_server')
191
- else
192
- begin
193
- # filter only recordings created by this room
194
- filter = { :meetingID => @room.meetingid }
195
- @room.server.fetch_recordings(filter)
188
+ begin
189
+ result = @room.fetch_recordings
190
+ if result
196
191
  message = t('bigbluebutton_rails.rooms.notice.fetch_recordings.success')
197
- rescue BigBlueButton::BigBlueButtonException => e
192
+ else
198
193
  error = true
199
- message = e.to_s[0..200]
194
+ message = t('bigbluebutton_rails.rooms.errors.fetch_recordings.no_server')
200
195
  end
196
+ rescue BigBlueButton::BigBlueButtonException => e
197
+ error = true
198
+ message = e.to_s[0..200]
201
199
  end
202
200
 
203
201
  respond_with do |format|
@@ -340,7 +338,7 @@ class Bigbluebutton::RoomsController < ApplicationController
340
338
  if bigbluebutton_can_create?(@room, role)
341
339
  user_opts = bigbluebutton_create_options(@room)
342
340
  if @room.create_meeting(bigbluebutton_user, request, user_opts)
343
- logger.info "Meeting created: id: #{@room.meetingid}, name: #{@room.name}, created_by: #{bigbluebutton_user.username}, time: #{Time.now.iso8601}"
341
+ logger.info "Meeting created: id: #{@room.meetingid}, name: #{@room.name}, created_by: #{username}, time: #{Time.now.iso8601}"
344
342
  end
345
343
  else
346
344
  flash[:error] = t('bigbluebutton_rails.rooms.errors.join.cannot_create')
@@ -388,7 +386,7 @@ class Bigbluebutton::RoomsController < ApplicationController
388
386
  end
389
387
 
390
388
  def room_allowed_params
391
- [ :name, :server_id, :meetingid, :attendee_key, :moderator_key, :welcome_msg,
389
+ [ :name, :meetingid, :attendee_key, :moderator_key, :welcome_msg,
392
390
  :private, :logout_url, :dial_number, :voice_bridge, :max_participants, :owner_id,
393
391
  :owner_type, :external, :param, :record_meeting, :duration, :default_layout, :presenter_share_only,
394
392
  :auto_start_video, :auto_start_audio, :background,
@@ -106,11 +106,6 @@ class Bigbluebutton::ServersController < ApplicationController
106
106
  respond_with(@recordings)
107
107
  end
108
108
 
109
- def rooms
110
- @rooms ||= @server.rooms
111
- respond_with(@rooms)
112
- end
113
-
114
109
  def publish_recordings
115
110
  self.publish_unpublish(params[:recordings], true)
116
111
  end
@@ -157,6 +152,10 @@ class Bigbluebutton::ServersController < ApplicationController
157
152
  end
158
153
  end
159
154
 
155
+ def check
156
+ redirect_to @server.check_url
157
+ end
158
+
160
159
  protected
161
160
 
162
161
  def find_server
@@ -1,7 +1,6 @@
1
1
  class BigbluebuttonMeeting < ActiveRecord::Base
2
2
  include ActiveModel::ForbiddenAttributesProtection
3
3
 
4
- belongs_to :server, :class_name => 'BigbluebuttonServer'
5
4
  belongs_to :room, :class_name => 'BigbluebuttonRoom'
6
5
 
7
6
  has_one :recording,
@@ -19,7 +18,7 @@ class BigbluebuttonMeeting < ActiveRecord::Base
19
18
  # Whether the meeting was created by the `user` or not.
20
19
  def created_by?(user)
21
20
  unless user.nil?
22
- userid = user.send(BigbluebuttonRails.user_attr_id)
21
+ userid = user.send(BigbluebuttonRails.configuration.user_attr_id)
23
22
  self.creator_id == userid
24
23
  else
25
24
  false
@@ -21,7 +21,7 @@ class BigbluebuttonMetadata < ActiveRecord::Base
21
21
  # validates :name, :exclusion => {
22
22
  # :in => lambda do |m|
23
23
  # if m.owner_type == "BigbluebuttonRoom"
24
- # BigbluebuttonRails.metadata_invalid_keys.map(&:to_s)
24
+ # BigbluebuttonRails.configuration.metadata_invalid_keys.map(&:to_s)
25
25
  # else
26
26
  # []
27
27
  # end
@@ -29,7 +29,7 @@ class BigbluebuttonMetadata < ActiveRecord::Base
29
29
  # }
30
30
  def exclusion_of_name_in_reserved_metadata_keys
31
31
  keys = if owner_type == "BigbluebuttonRoom"
32
- BigbluebuttonRails.metadata_invalid_keys.map(&:to_s)
32
+ BigbluebuttonRails.configuration.metadata_invalid_keys.map(&:to_s)
33
33
  else
34
34
  []
35
35
  end
@@ -1,9 +1,9 @@
1
1
  class BigbluebuttonRecording < ActiveRecord::Base
2
2
  include ActiveModel::ForbiddenAttributesProtection
3
3
 
4
- belongs_to :server, :class_name => 'BigbluebuttonServer'
5
- belongs_to :room, :class_name => 'BigbluebuttonRoom'
6
- belongs_to :meeting, :class_name => 'BigbluebuttonMeeting'
4
+ belongs_to :server, class_name: 'BigbluebuttonServer'
5
+ belongs_to :room, class_name: 'BigbluebuttonRoom'
6
+ belongs_to :meeting, class_name: 'BigbluebuttonMeeting'
7
7
 
8
8
  validates :server, :presence => true
9
9
 
@@ -32,6 +32,21 @@ class BigbluebuttonRecording < ActiveRecord::Base
32
32
  .where("bigbluebutton_playback_types.default = ?", true).first
33
33
  end
34
34
 
35
+ # Returns the overall (i.e. for all recordings) average length of recordings in seconds
36
+ # Uses the length of the default playback format
37
+ def self.overall_average_length
38
+ avg = BigbluebuttonPlaybackFormat.joins(:playback_type)
39
+ .where("bigbluebutton_playback_types.default = ?", true).average(:length)
40
+ avg.nil? ? 0 : (avg.truncate(2) * 60)
41
+ end
42
+
43
+ # Returns the overall (i.e. for all recordings) average size of recordings in bytes
44
+ # Uses the length of the default playback format
45
+ def self.overall_average_size
46
+ avg = BigbluebuttonRecording.average(:size)
47
+ avg.nil? ? 0 : avg
48
+ end
49
+
35
50
  # Syncs the recordings in the db with the array of recordings in 'recordings',
36
51
  # as received from BigBlueButtonApi#get_recordings.
37
52
  # Will add new recordings that are not in the db yet and update the ones that
@@ -97,7 +112,7 @@ class BigbluebuttonRecording < ActiveRecord::Base
97
112
  # BigBlueButtonApi#get_recordings but with the keys already converted to our format.
98
113
  def self.update_recording(server, recording, data)
99
114
  recording.server = server
100
- recording.room = BigbluebuttonRails.match_room_recording(data)
115
+ recording.room = BigbluebuttonRails.configuration.match_room_recording.call(data)
101
116
  recording.attributes = data.slice(:meetingid, :name, :published, :start_time, :end_time, :size)
102
117
  recording.available = true
103
118
  recording.save!
@@ -112,7 +127,7 @@ class BigbluebuttonRecording < ActiveRecord::Base
112
127
  filtered = data.slice(:recordid, :meetingid, :name, :published, :start_time, :end_time, :size)
113
128
  recording = BigbluebuttonRecording.create(filtered)
114
129
  recording.available = true
115
- recording.room = BigbluebuttonRails.match_room_recording(data)
130
+ recording.room = BigbluebuttonRails.configuration.match_room_recording.call(data)
116
131
  recording.server = server
117
132
  recording.description = I18n.t('bigbluebutton_rails.recordings.default.description', :time => recording.start_time.utc.to_formatted_s(:long))
118
133
  recording.meeting = BigbluebuttonRecording.find_matching_meeting(recording)
@@ -3,24 +3,22 @@ class BigbluebuttonRoom < ActiveRecord::Base
3
3
 
4
4
  belongs_to :owner, polymorphic: true
5
5
 
6
- belongs_to :server, class_name: 'BigbluebuttonServer'
7
-
8
6
  has_many :recordings,
9
- :class_name => 'BigbluebuttonRecording',
10
- :foreign_key => 'room_id',
11
- :dependent => :nullify
7
+ class_name: 'BigbluebuttonRecording',
8
+ foreign_key: 'room_id',
9
+ dependent: :nullify
12
10
 
13
11
  has_many :metadata,
14
- :class_name => 'BigbluebuttonMetadata',
15
- :as => :owner,
16
- :dependent => :destroy,
17
- :inverse_of => :owner
12
+ class_name: 'BigbluebuttonMetadata',
13
+ as: :owner,
14
+ dependent: :destroy,
15
+ inverse_of: :owner
18
16
 
19
17
  has_one :room_options,
20
- :class_name => 'BigbluebuttonRoomOptions',
21
- :foreign_key => 'room_id',
22
- :autosave => true,
23
- :dependent => :destroy
18
+ class_name: 'BigbluebuttonRoomOptions',
19
+ foreign_key: 'room_id',
20
+ autosave: true,
21
+ dependent: :destroy
24
22
 
25
23
  delegate :default_layout, :default_layout=, :to => :room_options
26
24
  delegate :presenter_share_only, :presenter_share_only=, :to => :room_options
@@ -105,10 +103,9 @@ class BigbluebuttonRoom < ActiveRecord::Base
105
103
  #
106
104
  # Triggers API call: <tt>getMeetingInfo</tt>.
107
105
  def fetch_meeting_info
108
- require_server :get_meeting_info
109
-
110
106
  begin
111
- response = self.server.api.get_meeting_info(self.meetingid, self.moderator_api_password)
107
+ server = BigbluebuttonRails.configuration.select_server.call(self, :get_meeting_info)
108
+ response = server.api.get_meeting_info(self.meetingid, self.moderator_api_password)
112
109
 
113
110
  @participant_count = response[:participantCount]
114
111
  @moderator_count = response[:moderatorCount]
@@ -147,16 +144,16 @@ class BigbluebuttonRoom < ActiveRecord::Base
147
144
  #
148
145
  # Triggers API call: <tt>isMeetingRunning</tt>.
149
146
  def fetch_is_running?
150
- require_server :is_meeting_running
151
- @running = self.server.api.is_meeting_running?(self.meetingid)
147
+ server = BigbluebuttonRails.configuration.select_server.call(self, :is_meeting_running)
148
+ @running = server.api.is_meeting_running?(self.meetingid)
152
149
  end
153
150
 
154
151
  # Sends a call to the BBB server to end the meeting.
155
152
  #
156
153
  # Triggers API call: <tt>end</tt>.
157
154
  def send_end
158
- require_server :end
159
- response = self.server.api.end_meeting(self.meetingid, self.moderator_api_password)
155
+ server = BigbluebuttonRails.configuration.select_server.call(self, :end)
156
+ response = server.api.end_meeting(self.meetingid, self.moderator_api_password)
160
157
 
161
158
  # enqueue an update in the meeting to end it faster
162
159
  Resque.enqueue(::BigbluebuttonMeetingUpdater, self.id)
@@ -170,18 +167,12 @@ class BigbluebuttonRoom < ActiveRecord::Base
170
167
  # request. Can be passed by the application to enforce some values over the values
171
168
  # that are taken from the database.
172
169
  #
173
- # Will trigger 'select_server' to select a server where the meeting
174
- # will be created. If a server is selected, the model is saved.
175
- #
176
170
  # With the response, updates the following attributes:
177
171
  # * <tt>attendee_api_password</tt>
178
172
  # * <tt>moderator_api_password</tt>
179
173
  #
180
174
  # Triggers API call: <tt>create</tt>.
181
175
  def send_create(user=nil, user_opts={})
182
- # updates the server whenever a meeting will be created and guarantees it has a meetingid
183
- require_server :create
184
-
185
176
  self.meetingid = unique_meetingid() if self.meetingid.blank?
186
177
  self.moderator_api_password = internal_password() if self.moderator_api_password.blank?
187
178
  self.attendee_api_password = internal_password() if self.attendee_api_password.blank?
@@ -217,17 +208,23 @@ class BigbluebuttonRoom < ActiveRecord::Base
217
208
  #
218
209
  # Uses the API but does not require a request to the server.
219
210
  def join_url(username, role, key=nil, options={})
220
- require_server :join_meeting_url
221
-
222
- case role
223
- when :moderator
224
- r = self.server.api.join_meeting_url(self.meetingid, username, self.moderator_api_password, options)
225
- when :attendee
226
- r = self.server.api.join_meeting_url(self.meetingid, username, self.attendee_api_password, options)
227
- else
228
- r = self.server.api.join_meeting_url(self.meetingid, username, map_key_to_internal_password(key), options)
229
- end
230
-
211
+ server = BigbluebuttonRails.configuration.select_server.call(self, :join_meeting_url)
212
+
213
+ pass = case role
214
+ when :moderator
215
+ self.moderator_api_password
216
+ when :attendee
217
+ self.attendee_api_password
218
+ when :guest
219
+ if BigbluebuttonRails.configuration.guest_support
220
+ options = { guest: true }.merge(options)
221
+ end
222
+ self.attendee_api_password
223
+ else
224
+ map_key_to_internal_password(key)
225
+ end
226
+
227
+ r = server.api.join_meeting_url(self.meetingid, username, pass, options)
231
228
  r.strip! unless r.nil?
232
229
  r
233
230
  end
@@ -335,8 +332,8 @@ class BigbluebuttonRoom < ActiveRecord::Base
335
332
 
336
333
  unless metadata.nil?
337
334
  begin
338
- attrs[:creator_id] = metadata[BigbluebuttonRails.metadata_user_id].to_i
339
- attrs[:creator_name] = metadata[BigbluebuttonRails.metadata_user_name]
335
+ attrs[:creator_id] = metadata[BigbluebuttonRails.configuration.metadata_user_id].to_i
336
+ attrs[:creator_name] = metadata[BigbluebuttonRails.configuration.metadata_user_name]
340
337
  rescue
341
338
  attrs[:creator_id] = nil
342
339
  attrs[:creator_name] = nil
@@ -356,11 +353,11 @@ class BigbluebuttonRoom < ActiveRecord::Base
356
353
  # has not yet been set as ended
357
354
  self.finish_meetings
358
355
 
356
+ server = BigbluebuttonRails.configuration.select_server.call(self)
359
357
  attrs = {
360
358
  room: self,
361
- server: self.server,
362
- server_url: self.server.url,
363
- server_secret: self.server.secret,
359
+ server_url: server.url,
360
+ server_secret: server.secret,
364
361
  meetingid: self.meetingid,
365
362
  name: self.name,
366
363
  recorded: self.record_meeting,
@@ -371,8 +368,8 @@ class BigbluebuttonRoom < ActiveRecord::Base
371
368
  }
372
369
  unless metadata.nil?
373
370
  begin
374
- attrs[:creator_id] = metadata[BigbluebuttonRails.metadata_user_id].to_i
375
- attrs[:creator_name] = metadata[BigbluebuttonRails.metadata_user_name]
371
+ attrs[:creator_id] = metadata[BigbluebuttonRails.configuration.metadata_user_id].to_i
372
+ attrs[:creator_name] = metadata[BigbluebuttonRails.configuration.metadata_user_name]
376
373
  rescue
377
374
  attrs[:creator_id] = nil
378
375
  attrs[:creator_name] = nil
@@ -415,17 +412,18 @@ class BigbluebuttonRoom < ActiveRecord::Base
415
412
  # Triggers API call: <tt>setConfigXML</tt>.
416
413
  def fetch_new_token
417
414
  if self.room_options.is_modified?
415
+ server = BigbluebuttonRails.configuration.select_server.call(self, :set_config_xml)
418
416
 
419
417
  # get the default XML we will use to create a new one
420
- config_xml = self.server.api.get_default_config_xml
418
+ config_xml = server.api.get_default_config_xml
421
419
 
422
420
  # set the options on the XML
423
421
  # returns true if something was changed
424
422
  config_xml = self.room_options.set_on_config_xml(config_xml)
425
423
  if config_xml
426
- self.server.update_config(config_xml)
424
+ server.update_config(config_xml)
427
425
  # get the new token for the room, and return it
428
- self.server.api.set_config_xml(self.meetingid, config_xml)
426
+ server.api.set_config_xml(self.meetingid, config_xml)
429
427
  else
430
428
  nil
431
429
  end
@@ -435,14 +433,17 @@ class BigbluebuttonRoom < ActiveRecord::Base
435
433
  end
436
434
 
437
435
  def available_layouts
436
+ server = BigbluebuttonRails.configuration.select_server.call(self)
438
437
  server.present? ? server.available_layouts : []
439
438
  end
440
439
 
441
440
  def available_layouts_names
441
+ server = BigbluebuttonRails.configuration.select_server.call(self)
442
442
  server.present? ? server.available_layouts_names : []
443
443
  end
444
444
 
445
445
  def available_layouts_for_select
446
+ server = BigbluebuttonRails.configuration.select_server.call(self)
446
447
  server.present? ? server.available_layouts_for_select : []
447
448
  end
448
449
 
@@ -461,52 +462,29 @@ class BigbluebuttonRoom < ActiveRecord::Base
461
462
  nil
462
463
  end
463
464
 
464
- protected
465
-
466
- def create_room_options
467
- BigbluebuttonRoomOptions.create(:room => self)
465
+ def fetch_recordings(filter={})
466
+ server = BigbluebuttonRails.configuration.select_server.call(self, :get_recordings)
467
+ if server.present?
468
+ server.fetch_recordings(filter.merge({ meetingID: self.meetingid }))
469
+ true
470
+ else
471
+ false
472
+ end
468
473
  end
469
474
 
470
- # Every room needs a server to be used.
471
- # The server of a room can change during the room's lifespan, but
472
- # it should not change if the room is running or if it was created
473
- # but not yet ended.
474
- # Any action that requires a server should call 'require_server' before
475
- # anything else.
476
- # This method will automatically select a server if the room has no server
477
- # set on it yet.
478
- def require_server(api_method=nil)
479
- selected_server = select_server(api_method)
480
- unless selected_server.nil?
481
- self.server = selected_server
482
- self.save if selected_server && !self.new_record?
483
- end
484
- if self.server.nil?
475
+ def select_server(api_method=nil)
476
+ server = BigbluebuttonServer.first
477
+ if server.nil?
485
478
  msg = I18n.t('bigbluebutton_rails.rooms.errors.server.nil')
486
479
  raise BigbluebuttonRails::ServerRequired.new(msg)
487
480
  end
481
+ server
488
482
  end
489
483
 
490
- # Selects the server with less rooms in it in case this room has no server
491
- # set to it yet. Returns nil if there are no servers to select or if the
492
- # room already has a server associated to it.
493
- #
494
- # This method can be overridden to change the way the server is selected
495
- # before a room is used. `api_method` contains the API method that is being
496
- # called. Any server returned here will be used. If no server is returned, the
497
- # room will continue with its current server (if any).
498
- # One good example is to always select a new server when a meeting is being
499
- # created (in case `api_method` is `:create`), making this a simple load
500
- # balancing tool that can work well in simple cases.
501
- def select_server(api_method=nil)
502
- if self.server.nil?
503
- BigbluebuttonServer.
504
- select("bigbluebutton_servers.*, count(bigbluebutton_rooms.id) as room_count").
505
- joins("LEFT JOIN bigbluebutton_rooms ON bigbluebutton_servers.id = bigbluebutton_rooms.server_id").
506
- group(:server_id).order("room_count ASC").first
507
- else
508
- nil
509
- end
484
+ protected
485
+
486
+ def create_room_options
487
+ BigbluebuttonRoomOptions.create(:room => self)
510
488
  end
511
489
 
512
490
  def init
@@ -541,7 +519,7 @@ class BigbluebuttonRoom < ActiveRecord::Base
541
519
 
542
520
  # Set the voice bridge only if the gem is configured to do so and the voice bridge
543
521
  # is not blank.
544
- if BigbluebuttonRails.use_local_voice_bridges && !self.voice_bridge.blank?
522
+ if BigbluebuttonRails.configuration.use_local_voice_bridges && !self.voice_bridge.blank?
545
523
  opts.merge!({ :voiceBridge => self.voice_bridge })
546
524
  end
547
525
 
@@ -549,20 +527,21 @@ class BigbluebuttonRoom < ActiveRecord::Base
549
527
 
550
528
  # Add information about the user that is creating the meeting (if any)
551
529
  unless user.nil?
552
- userid = user.send(BigbluebuttonRails.user_attr_id)
553
- username = user.send(BigbluebuttonRails.user_attr_name)
554
- opts.merge!({ "meta_#{BigbluebuttonRails.metadata_user_id}" => userid })
555
- opts.merge!({ "meta_#{BigbluebuttonRails.metadata_user_name}" => username })
530
+ userid = user.send(BigbluebuttonRails.configuration.user_attr_id)
531
+ username = user.send(BigbluebuttonRails.configuration.user_attr_name)
532
+ opts.merge!({ "meta_#{BigbluebuttonRails.configuration.metadata_user_id}" => userid })
533
+ opts.merge!({ "meta_#{BigbluebuttonRails.configuration.metadata_user_name}" => username })
556
534
  end
557
535
 
558
536
  # Add the invitation URL, if any
559
- invitation_url = self.try(BigbluebuttonRails.invitation_url_method)
560
- unless invitation_url.nil?
561
- opts.merge!({ "meta_#{BigbluebuttonRails.metadata_invitation_url}" => invitation_url })
537
+ url = BigbluebuttonRails.configuration.get_invitation_url.call(self)
538
+ unless url.nil?
539
+ opts.merge!({ "meta_#{BigbluebuttonRails.configuration.metadata_invitation_url}" => url })
562
540
  end
563
541
 
564
- self.server.api.request_headers = @request_headers # we need the client's IP
565
- response = self.server.api.create_meeting(self.name, self.meetingid, opts)
542
+ server = BigbluebuttonRails.configuration.select_server.call(self, :create)
543
+ server.api.request_headers = @request_headers # we need the client's IP
544
+ response = server.api.create_meeting(self.name, self.meetingid, opts)
566
545
 
567
546
  response
568
547
  end
@@ -571,10 +550,9 @@ class BigbluebuttonRoom < ActiveRecord::Base
571
550
  # there's no message set in this room.
572
551
  # Can be used to easily set a default message format for all rooms.
573
552
  def default_welcome_message
574
- if self.dial_number.present?
575
- I18n.t('bigbluebutton_rails.rooms.default_welcome_msg_dial_number')
576
- else
577
- I18n.t('bigbluebutton_rails.rooms.default_welcome_msg')
553
+ msg = I18n.t('bigbluebutton_rails.rooms.default_welcome_msg_dial_number').html_safe
554
+ if !self.dial_number.blank?
555
+ msg += I18n.t('bigbluebutton_rails.rooms.default_welcome_msg_dial_number').html_safe
578
556
  end
579
557
  end
580
558
 
@@ -602,9 +580,9 @@ class BigbluebuttonRoom < ActiveRecord::Base
602
580
  result["meta_#{meta.name}"] = meta.content; result
603
581
  }
604
582
 
605
- dynamic_metadata = self.try(BigbluebuttonRails.dynamic_metadata_method)
583
+ dynamic_metadata = BigbluebuttonRails.configuration.get_dynamic_metadata.call(self)
606
584
  unless dynamic_metadata.blank?
607
- metadata = self.dynamic_metadata.inject(metadata) { |result, meta|
585
+ metadata = dynamic_metadata.inject(metadata) { |result, meta|
608
586
  result["meta_#{meta[0]}"] = meta[1]; result
609
587
  }
610
588
  end