forked from External/greenlight
Add flag to use webhooks and API call to register a hook
It almost works with webhooks now. Still TODO is: * Remove the hook after the recording is published * To process the publish_ended event from the webhooks either the webhook needs to include the metadata (currently it doesn't) or GreenLight has find out the meeting token without reading it from the metadata.
This commit is contained in:
parent
906b21ab0e
commit
09c30bb5bd
|
@ -155,18 +155,31 @@ class BbbController < ApplicationController
|
|||
end
|
||||
|
||||
def treat_callback_event(event)
|
||||
eventName = (event.present? && event['header'].present?) ? event['header']['name'] : nil
|
||||
|
||||
# a recording is ready
|
||||
if event['header']['name'] == "publish_ended"
|
||||
token = event['payload']['metadata'][META_TOKEN]
|
||||
record_id = event['payload']['meeting_id']
|
||||
if eventName == "publish_ended"
|
||||
if event['payload'] && event['payload']['metadata'] && event['payload']['meeting_id']
|
||||
token = event['payload']['metadata'][META_TOKEN]
|
||||
record_id = event['payload']['meeting_id']
|
||||
|
||||
# the webhook event doesn't have all the data we need, so we need
|
||||
# to send a getRecordings anyway
|
||||
# TODO: if the webhooks included all data we wouldn't need this
|
||||
rec_info = bbb_get_recordings(token, record_id)
|
||||
rec_info = rec_info[:recordings].first
|
||||
RecordingCreatedJob.perform_later(token, parse_recording_for_view(rec_info))
|
||||
# the webhook event doesn't have all the data we need, so we need
|
||||
# to send a getRecordings anyway
|
||||
# TODO: if the webhooks included all data in the event we wouldn't need this
|
||||
rec_info = bbb_get_recordings(token, record_id)
|
||||
rec_info = rec_info[:recordings].first
|
||||
RecordingCreatedJob.perform_later(token, parse_recording_for_view(rec_info))
|
||||
|
||||
# TODO: remove the webhook now that the meeting and recording are done
|
||||
# remove only if the meeting is not running, otherwise the hook is needed
|
||||
# if ENV['GREENLIGHT_USE_WEBHOOKS']
|
||||
# webhook_remove("#{base_url}/callback")
|
||||
# end
|
||||
else
|
||||
logger.error "Bad format for event #{event}, won't process"
|
||||
end
|
||||
else
|
||||
logger.info "Callback event will not be treated. Event name: #{eventName}"
|
||||
end
|
||||
|
||||
render head(:ok) && return
|
||||
|
|
|
@ -78,9 +78,13 @@ module BbbApi
|
|||
"meta_#{BbbApi::META_TOKEN}": meeting_token
|
||||
}
|
||||
|
||||
meeting_options.merge!(
|
||||
{ "meta_#{BbbApi::META_HOOK_URL}": options[:hook_url] }
|
||||
) if options[:hook_url]
|
||||
if ENV['GREENLIGHT_USE_WEBHOOKS']
|
||||
webhook_register(options[:hook_url], meeting_id)
|
||||
else
|
||||
meeting_options.merge!(
|
||||
{ "meta_#{BbbApi::META_HOOK_URL}": options[:hook_url] }
|
||||
) if options[:hook_url]
|
||||
end
|
||||
|
||||
# Create the meeting
|
||||
bbb.create_meeting(options[:meeting_name], meeting_id, meeting_options)
|
||||
|
@ -253,6 +257,26 @@ module BbbApi
|
|||
}
|
||||
end
|
||||
|
||||
def webhook_register(url, meeting_id=nil)
|
||||
params = { callbackURL: url }
|
||||
params.merge!({ meetingID: meeting_id }) if meeting_id.present?
|
||||
bbb_safe_execute :send_api_request, "hooks/create", params
|
||||
end
|
||||
|
||||
def webhook_remove(url)
|
||||
res = bbb_safe_execute :send_api_request, "hooks/list"
|
||||
if res && res[:hooks] && res[:hooks][:hook]
|
||||
res[:hooks][:hook] = [res[:hooks][:hook]] unless res[:hooks][:hook].is_a?(Array)
|
||||
hook = res[:hooks][:hook].select{ |h|
|
||||
h[:callbackURL] == url
|
||||
}.first
|
||||
if hook.present?
|
||||
params = { hookID: hook[:hookID] }
|
||||
bbb_safe_execute :send_api_request, "hooks/destroy", params
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def success_join_res(join_url)
|
||||
{
|
||||
returncode: true,
|
||||
|
|
10
sample.env
10
sample.env
|
@ -7,6 +7,16 @@ RAILS_ENV=development
|
|||
BIGBLUEBUTTON_ENDPOINT=http://test-install.blindsidenetworks.com/bigbluebutton/
|
||||
BIGBLUEBUTTON_SECRET=8cd8ef52e8e101574e400365b55e11a6
|
||||
|
||||
# If "true", GreenLight will register a webhook callback for each meeting
|
||||
# created. This callback is called for all events that happen in the meeting,
|
||||
# including the processing of its recording. These events are used to update
|
||||
# the web page dynamically as things happen in the server.
|
||||
# If not "true", the application will add a metadata to the meetings with this same
|
||||
# callback URL. Scripts can then be added to BigBlueButton to call this callback
|
||||
# URL and send specific events to GreenLight (e.g. a post publish script to warn
|
||||
# the application when recordings are done).
|
||||
GREENLIGHT_USE_WEBHOOKS=false
|
||||
|
||||
# OmniAuth
|
||||
TWITTER_ID=
|
||||
TWITTER_SECRET=
|
||||
|
|
Loading…
Reference in New Issue