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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.md +21 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +4 -11
- data/Rakefile +15 -15
- data/app/controllers/bigbluebutton/recordings_controller.rb +1 -1
- data/app/controllers/bigbluebutton/rooms_controller.rb +10 -12
- data/app/controllers/bigbluebutton/servers_controller.rb +4 -5
- data/app/models/bigbluebutton_meeting.rb +1 -2
- data/app/models/bigbluebutton_metadata.rb +2 -2
- data/app/models/bigbluebutton_recording.rb +20 -5
- data/app/models/bigbluebutton_room.rb +80 -102
- data/app/models/bigbluebutton_server.rb +31 -17
- data/app/views/bigbluebutton/recordings/_form.html.erb +13 -13
- data/app/views/bigbluebutton/rooms/_form.html.erb +0 -4
- data/app/views/bigbluebutton/rooms/_rooms.html.erb +0 -4
- data/app/views/bigbluebutton/rooms/show.html.erb +0 -4
- data/app/workers/bigbluebutton_update_recordings.rb +2 -2
- data/config/locales/en.yml +1 -2
- data/config/locales/pt-br.yml +1 -2
- data/lib/bigbluebutton_rails.rb +22 -108
- data/lib/bigbluebutton_rails/background_tasks.rb +7 -3
- data/lib/bigbluebutton_rails/configuration.rb +80 -0
- data/lib/bigbluebutton_rails/rails/routes.rb +7 -6
- data/lib/bigbluebutton_rails/version.rb +1 -1
- data/lib/generators/bigbluebutton_rails/install_generator.rb +10 -1
- data/lib/generators/bigbluebutton_rails/templates/migration.rb +0 -3
- data/lib/generators/bigbluebutton_rails/templates/migration_2_2_0.rb +13 -0
- data/spec/controllers/bigbluebutton/recordings_controller_json_responses_spec.rb +4 -5
- data/spec/controllers/bigbluebutton/recordings_controller_spec.rb +3 -2
- data/spec/controllers/bigbluebutton/rooms_controller_exception_handling_spec.rb +1 -1
- data/spec/controllers/bigbluebutton/rooms_controller_json_responses_spec.rb +4 -4
- data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +53 -38
- data/spec/controllers/bigbluebutton/servers_controller_json_responses_spec.rb +7 -19
- data/spec/controllers/bigbluebutton/servers_controller_spec.rb +32 -51
- data/spec/factories/bigbluebutton_meeting.rb +0 -1
- data/spec/factories/bigbluebutton_recording.rb +1 -0
- data/spec/factories/bigbluebutton_room.rb +0 -1
- data/spec/models/bigbluebutton_meeting_db_spec.rb +0 -1
- data/spec/models/bigbluebutton_meeting_spec.rb +0 -3
- data/spec/models/bigbluebutton_metadata_spec.rb +4 -4
- data/spec/models/bigbluebutton_recording_spec.rb +32 -0
- data/spec/models/bigbluebutton_room_db_spec.rb +0 -2
- data/spec/models/bigbluebutton_room_spec.rb +138 -244
- data/spec/models/bigbluebutton_server_spec.rb +40 -21
- data/spec/rails_app/db/seeds.rb +1 -1
- data/spec/rails_app/features/config.yml.example +4 -4
- data/spec/rails_app/features/step_definitions/create_rooms_steps.rb +0 -1
- data/spec/rails_app/features/support/templates.rb +0 -4
- data/spec/rails_app/lib/tasks/db/populate.rake +2 -2
- data/spec/routing/bigbluebutton/servers_only_routing_spec.rb +4 -1
- data/spec/routing/bigbluebutton/servers_routing_spec.rb +4 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/mocked_server.rb +1 -1
- data/spec/workers/bigbluebutton_meeting_updater_spec.rb +3 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44ffb5fae34d7b736ebf6c372c512b2b37d8f41f
|
4
|
+
data.tar.gz: 3446e484579e743d3f58b40bcfc06168f8062ac7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81ccfdd0a387e03d5d54ae67175eb77a1904e524e3f33b13b53a248f5bd7baebb6c0e4fa40317b50d776082fcf3f2ed0b23d33a7cb263f4630995a48bc8a40e6
|
7
|
+
data.tar.gz: c608a39eef0b90ce899f344f05b0d07433010375924de85ba19260d39ca11cacc0f7c365f8c6fb078706a985c0710a90921d1684bef7d444ecec18481c165894
|
data/.travis.yml
CHANGED
@@ -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
|
data/CHANGELOG.md
CHANGED
@@ -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
|
data/Gemfile.lock
CHANGED
@@ -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.
|
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.
|
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.
|
237
|
-
rack (~> 1.
|
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:
|
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
|
-
|
66
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
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
|
-
[ :
|
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
|
-
|
189
|
-
|
190
|
-
|
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
|
-
|
192
|
+
else
|
198
193
|
error = true
|
199
|
-
message =
|
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: #{
|
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, :
|
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, :
|
5
|
-
belongs_to :room, :
|
6
|
-
belongs_to :meeting, :
|
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
|
-
:
|
10
|
-
:
|
11
|
-
:
|
7
|
+
class_name: 'BigbluebuttonRecording',
|
8
|
+
foreign_key: 'room_id',
|
9
|
+
dependent: :nullify
|
12
10
|
|
13
11
|
has_many :metadata,
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
12
|
+
class_name: 'BigbluebuttonMetadata',
|
13
|
+
as: :owner,
|
14
|
+
dependent: :destroy,
|
15
|
+
inverse_of: :owner
|
18
16
|
|
19
17
|
has_one :room_options,
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
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
|
-
|
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
|
-
|
151
|
-
@running =
|
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
|
-
|
159
|
-
response =
|
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
|
-
|
221
|
-
|
222
|
-
case role
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
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
|
-
|
362
|
-
|
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 =
|
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
|
-
|
424
|
+
server.update_config(config_xml)
|
427
425
|
# get the new token for the room, and return it
|
428
|
-
|
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
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
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
|
-
|
471
|
-
|
472
|
-
|
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
|
-
|
491
|
-
|
492
|
-
|
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
|
-
|
560
|
-
unless
|
561
|
-
opts.merge!({ "meta_#{BigbluebuttonRails.metadata_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
|
-
|
565
|
-
|
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
|
-
|
575
|
-
|
576
|
-
|
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 =
|
583
|
+
dynamic_metadata = BigbluebuttonRails.configuration.get_dynamic_metadata.call(self)
|
606
584
|
unless dynamic_metadata.blank?
|
607
|
-
metadata =
|
585
|
+
metadata = dynamic_metadata.inject(metadata) { |result, meta|
|
608
586
|
result["meta_#{meta[0]}"] = meta[1]; result
|
609
587
|
}
|
610
588
|
end
|