]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
join now recreates conference if necessary
authorKevin Jardine <kevinjardine@yahoo.com>
Fri, 7 Sep 2012 09:29:38 +0000 (11:29 +0200)
committerKevin Jardine <kevinjardine@yahoo.com>
Fri, 7 Sep 2012 09:29:38 +0000 (11:29 +0200)
actions/event_calendar/join_conference.php [new file with mode: 0644]
languages/en.php
models/model.php
start.php
views/default/event_calendar/conference_button.php
views/default/forms/event_calendar/edit.php

diff --git a/actions/event_calendar/join_conference.php b/actions/event_calendar/join_conference.php
new file mode 100644 (file)
index 0000000..9eb8f0d
--- /dev/null
@@ -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');
+}
index 3fd9cf7cb1e23d3753fc874f656e5b3c94662f52..3b6f7f249159966681d7d9b638ab7e6245700a0a 100644 (file)
@@ -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)",
index 32a9c928a37fb1ec313709e8bda9a1e128155245..6680409db2e19c4533f1cc3d91a4915df72eef15 100644 (file)
@@ -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) {
index 49312599f45f6016fd095bfde17405d479a40e1b..ad635c59858d14632c09d418d34e9f2da61c35b4 100644 (file)
--- a/start.php
+++ b/start.php
@@ -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");
 }
 
 /**
index baa30cc68889aecde2d7cbe115dc8e21f687fb8b..79fa9c5a242d4cb85495552271e407dbde4a56bf 100644 (file)
@@ -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>';
index 2ba744fc447239878f9d84d5359b2fea555fd4bb..c2210c5f807b0e9bbc4eaa270c651dc935419304 100644 (file)
@@ -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);
 }