bigbluebutton_rails 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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