diff options
| -rw-r--r-- | actions/event_calendar/join_conference.php | 20 | ||||
| -rw-r--r-- | languages/en.php | 2 | ||||
| -rw-r--r-- | models/model.php | 116 | ||||
| -rw-r--r-- | start.php | 2 | ||||
| -rw-r--r-- | views/default/event_calendar/conference_button.php | 5 | ||||
| -rw-r--r-- | views/default/forms/event_calendar/edit.php | 2 | 
6 files changed, 137 insertions, 10 deletions
diff --git a/actions/event_calendar/join_conference.php b/actions/event_calendar/join_conference.php new file mode 100644 index 000000000..9eb8f0da9 --- /dev/null +++ b/actions/event_calendar/join_conference.php @@ -0,0 +1,20 @@ +<?php +// extended logic for BBB +elgg_load_library('elgg:event_calendar'); + +$event_guid = get_input('event_guid'); +$event = get_entity($event_guid); +if (elgg_instanceof($event,'object','event_calendar')) { +	// make sure that the conference still exists, and if not, try recreating it	 +	if (event_calendar_conference_exists($event)) { +		event_calendar_join_conference($event); +	} else if (event_calendar_create_bbb_conf($event)) { +		event_calendar_join_conference($event); +	} else { +		register_error(elgg_echo('event_calendar:couldnotjoin')); +		forward($event->getURL()); +	} +} else { +	register_error(elgg_echo('event_calendar:error_nosuchevent')); +	forward('event_calendar/list'); +} diff --git a/languages/en.php b/languages/en.php index 3fd9cf7cb..3b6f7f249 100644 --- a/languages/en.php +++ b/languages/en.php @@ -328,7 +328,9 @@ You can visit the event page here:  	'event_calendar:bbb_server_url' => "Big Blue Button server URL (must end with slash)",  	'event_calendar:bbb_security_salt' => "Big Blue Button security salt",  	'event_calendar:bbb_create_error' => "Error: unable to create BBB conference, message was: %s", +	'event_calendar:conference_create_error' => "Error: unable to create web conference.",  	'event_calendar:bbb_settings_error' => "Error: must set conference URL and salt in plugin settings", +	'event_calendar:couldnotjoin' => "Error: unable to join conference.",  	'event_calendar:join_conf_button' => "Join conference",  	'event_calendar:poll_suffix' => "(poll)", diff --git a/models/model.php b/models/model.php index 32a9c928a..6680409db 100644 --- a/models/model.php +++ b/models/model.php @@ -184,7 +184,9 @@ function event_calendar_set_event_from_form($event_guid,$group_guid) {  	}  	if ($event->save()) {  		if (!$event_guid && $event->web_conference) { -			event_calendar_create_bbb_conf($event); +			if (!event_calendar_create_bbb_conf($event)) { +				register_error(elgg_echo('event_calendar:conference_create_error')); +			}  		}  		if ($group_guid && (elgg_get_plugin_setting('autogroup', 'event_calendar') == 'yes')) {  			event_calendar_add_personal_events_from_group($event->guid,$group_guid); @@ -2282,7 +2284,7 @@ function event_calendar_queue_reminder($e) {  	}  } -function event_calendar_create_bbb_conf($event) { +/*function event_calendar_create_bbb_conf($event) {  	$bbb_security_salt = elgg_get_plugin_setting('bbb_security_salt','event_calendar');  	$bbb_server_url = rtrim(elgg_get_plugin_setting('bbb_server_url','event_calendar'), '/') . '/';  	if ($bbb_security_salt) { @@ -2311,11 +2313,11 @@ function event_calendar_create_bbb_conf($event) {  	    // close curl resource to free up system resources  	    curl_close($ch); -	    /*error_log("BBB create request:"); -	    error_log($bbb_server_url.'api/create?'.$params); +	    #error_log("BBB create request:"); +	    #error_log($bbb_server_url.'api/create?'.$params); -	    error_log("BBB create response:"); -	    error_log($output);*/ +	    #error_log("BBB create response:"); +	    #error_log($output);  		$xml = new SimpleXMLElement($output);  		if ($xml->returncode == 'SUCCESS') { @@ -2327,6 +2329,108 @@ function event_calendar_create_bbb_conf($event) {  	} else {  		register_error(elgg_echo('event_calendar:bbb_settings_error'));  	} +}*/ + +// utility function for BBB api calls +function event_calendar_bbb_api($api_function,$params=NULL) { +	 +	$bbb_security_salt = elgg_get_plugin_setting('bbb_security_salt','event_calendar'); +	$bbb_server_url = rtrim(elgg_get_plugin_setting('bbb_server_url','event_calendar'), '/') . '/'; +	if ($bbb_security_salt) { +		if (isset($params) && is_array($params) && count($params) > 0) { +			$query = array(); +			foreach($params as $k => $v) { +				$query[] = $k.'='.rawurlencode($v); +			} +			$qs = implode('&',$query); +		} else { +			$qs = ''; +		} +		$checksum = sha1($api_function.$qs.$bbb_security_salt); +		if ($qs) { +			$qs .= "&checksum=$checksum"; +		} +		 +		// create curl resource +	    $ch = curl_init(); +	 +	    // set url +	    curl_setopt($ch, CURLOPT_URL, $bbb_server_url.'api/'.$api_function.'?'.$qs); +	 +	    //return the transfer as a string +	    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); +	 +	    // $output contains the output string +	    $output = curl_exec($ch); +	 +	    // close curl resource to free up system resources +	    curl_close($ch); +	     +	    error_log("BBB api call: ".$api_function); +	    error_log(print_r($params,TRUE));		 +	    error_log("BBB response: \n".$output); +		return $output; +	} else { +		return FALSE; +	}		 +} + +function event_calendar_create_bbb_conf($event) { +	$day_in_minutes = 60*24; +	$now = time(); +	// fix duration bug +	# $duration = (int)(($event->real_end_time-$event->start_date)/60)+$day_in_minutes; +	$duration = (int)(($event->real_end_time-$now)/60)+$day_in_minutes; +	$title = urlencode($event->title); +	$output = event_calendar_bbb_api('create',array('meetingID'=>$event->guid,'name'=>$title,'duration'=>$duration)); +	if ($output) {	     +		$xml = new SimpleXMLElement($output); +		if ($xml->returncode == 'SUCCESS') { +			$event->bbb_attendee_password = (string) $xml->attendeePW; +			$event->bbb_moderator_password = (string) $xml->moderatorPW; +			return TRUE; +		} else { +			return FALSE; +		} +	} else { +		return FALSE; +	} +} + +// checks to see if a BBB conference is actually running +function event_calendar_is_conference_running($event) { +	$output = event_calendar_bbb_api('isMeetingRunning',array('meetingID'=>$event->guid));	 +	if (!$output) { +		return FALSE; +	} else { +		$xml = new SimpleXMLElement($output); +		if ($xml->returncode == 'SUCCESS' && $xml->running == 'true') { +			return TRUE; +		} else { +			return FALSE; +		} +	} +} + +// checks to see if a BBB conference exists +function event_calendar_conference_exists($event) { +	$output = event_calendar_bbb_api('getMeetingInfo',array('meetingID'=>$event->guid,'password'=>$event->bbb_moderator_password));	 +	if (!$output) { +		return FALSE; +	} else { +		$xml = new SimpleXMLElement($output); +		if ($xml->returncode == 'SUCCESS' && $xml->meetingID == $event->guid) { +			return TRUE; +		} else { +			return FALSE; +		} +	} +} + +// forwards to the join link +// this function assumes that the conference is running +function event_calendar_join_conference($event) { +	forward(event_calendar_get_join_bbb_url($event));  }  function event_calendar_get_join_bbb_url($event) { @@ -110,7 +110,7 @@ function event_calendar_init() {  	elgg_register_action("event_calendar/remove_from_group_members","$action_path/remove_from_group_members.php");  	elgg_register_action("event_calendar/manage_subscribers","$action_path/manage_subscribers.php");  	elgg_register_action("event_calendar/modify_full_calendar","$action_path/modify_full_calendar.php"); - +	elgg_register_action("event_calendar/join_conference","$action_path/join_conference.php");  }  /** diff --git a/views/default/event_calendar/conference_button.php b/views/default/event_calendar/conference_button.php index baa30cc68..79fa9c5a2 100644 --- a/views/default/event_calendar/conference_button.php +++ b/views/default/event_calendar/conference_button.php @@ -2,7 +2,7 @@  // A non-admin / non-event-creator only sees the button if they have the event on his/her personal calendar   // and it is at most 15 minutes before the conference starts. -// The button is removed for everyone (even admins) one day after the conference ends. +// The button is removed for everyone (even admins) one day after the event end time.  $event = $vars['event']; @@ -21,10 +21,11 @@ if ($event) {  	}  	if ( $in_time_window ) {  		$button = elgg_view('output/url', array( -			'href' => event_calendar_get_join_bbb_url($event), +			'href' => 'action/event_calendar/join_conference?event_guid='.$event->guid,  			'text' => elgg_echo('event_calendar:join_conf_button'),  			'class' => 'elgg-button elgg-button-action',  			'target' => '_blank', +			'is_action' => TRUE,  		));  		echo '<div class="event-calendar-conf-join-button">'.$button.'</div>'; diff --git a/views/default/forms/event_calendar/edit.php b/views/default/forms/event_calendar/edit.php index 2ba744fc4..c2210c5f8 100644 --- a/views/default/forms/event_calendar/edit.php +++ b/views/default/forms/event_calendar/edit.php @@ -7,7 +7,7 @@ $schedule_options = array(  	elgg_echo('event_calendar:schedule_type:fixed')=>'fixed',  ); -if (elgg_plugin_exists('event_poll')) { +if (elgg_is_active_plugin('event_poll')) {  	$schedule_options = array_merge(array(elgg_echo('event_calendar:schedule_type:poll')=>'poll'),$schedule_options);  }	  | 
