Improving bbb plugin and adding record support see BT#3123 (not finished yet)

skala
Julio Montoya 13 years ago
parent fcbb67335c
commit 9ccb8b8df8
  1. 497
      plugin/bbb/bbb.lib.php
  2. 6
      plugin/bbb/bbb_api.php
  3. 9
      plugin/bbb/config.php
  4. 30
      plugin/bbb/course_install.php
  5. 54
      plugin/bbb/install.php
  6. 51
      plugin/bbb/listing.php
  7. 40
      plugin/bbb/listing.tpl
  8. 4
      plugin/bbb/plugin.php
  9. 111
      plugin/bbb/start.php
  10. 23
      plugin/bbb/uninstall.php

@ -1,180 +1,209 @@
<?php
/**
* This file contains the helper libraries for the BigBlueButton conference plugin.
* It is based on code written by Dual Code Inc in GNU/GPLv2
* Copyright (C) 2010 Dual Code Inc. (www.dualcode.com)
* Copyright (C) 2010 BeezNest Belgium SPRL (www.beeznest.com) - Yannick Warnier - y@beeznest.com
* This script initiates a videoconference session, calling the BigBlueButton API
* @package chamilo.plugin.bigbluebutton
*/
/**
* Inserts an item into the plugin_bbb table
*/
function bigbluebutton_insert_record($table,$object) {
//ignore the first param (used for compatibility with existing code)
$table = Database::get_main_table('plugin_bbb');
$sql = "INSERT INTO $table (course_id, name, meeting_name, meeting_id, attendee_pw, moderator_pw, auto_login, new_window, welcome_msg)" .
"VALUES (" .
intval($object->course) .", " .
"'".Database::escape_string($object->name)."'," .
"'".Database::escape_string($object->meetingname)."'," .
"'".Database::escape_string($object->meetingid)."'," .
"'".Database::escape_string($object->attendeepw)."'," .
"'".Database::escape_string($object->moderatorpw)."'," .
"'".Database::escape_string($object->autologin)."'," .
"'".Database::escape_string($object->newwindow)."'," .
"'".Database::escape_string($object->welcomemsg)."'" .
")";
Database::query($sql);
return Database::insert_id();
}
/**
* Updates a bigbluebutton record
*/
function bigbluebutton_update_record($table, $object) {
//ignore the first param (used for compatibility with existing code) $table = Database::get_main_table('plugin_bbb');
$sql = "UPDATE $table (course_id, name, meeting_name, meeting_id, attendee_pw, moderator_pw, auto_login, new_window, welcome_msg)" .
" SET course_id = ".intval($object->course) .", " .
" name = '".Database::escape_string($object->name)."'," .
" meeting_name = '".Database::escape_string($object->meetingname)."'," .
" meeting_id = '".Database::escape_string($object->meetingid)."'," .
" attendee_pw = '".Database::escape_string($object->attendeepw)."'," .
" moderator_pw = '".Database::escape_string($object->moderatorpw)."'," .
" auto_login = '".Database::escape_string($object->autologin)."'," .
" new_window = '".Database::escape_string($object->newwindow)."'," .
" welcome_msg = '".Database::escape_string($object->welcomemsg)."'," .
" WHERE id = " .intval($object->id).
")";
Database::query($sql);
return $oject->id;
}
/**
* Gets a bigbluebutton room record from an ID
*/
function bigbluebutton_get_record($table,$field,$id) {
//ignore the first param (used for compatibility with existing code)
$table = Database::get_main_table('plugin_bbb');
$sql = "SELECT * FROM $table WHERE id = ".intval($id);
$res = Database::query($sql);
if (Database::num_rows($res)>0) {
$row = Database::fetch_assoc($res);
$room = null;
$room->id = $id;
$room->course = $row['course_id'];
$room->name = $row['name'];
$room->meetingname = $row['meeting_name'];
$room->meetingid = $row['meeting_id'];
$room->attendeepw = $row['attendee_pw'];
$room->moderatorpw = $row['moderator_pw'];
$room->autologin = $row['auto_login'];
$room->newwindow = $row['new_window'];
$room->welcomemsg = $row['welcome_msg'];
return $room;
} else {
return null;
}
}
/**
* Gets a bigbluebutton room record from an ID
*/
function bigbluebutton_delete_records($table,$field,$id) {
//ignore the first param (used for compatibility with existing code)
$table = Database::get_main_table('plugin_bbb');
$sql = "DELETE FROM $table WHERE id = ".intval($id);
}
/**
* Add an event
*/
function bigbluebutton_add_event($event) {
//
}
/**
* Given an object containing all the necessary data,
* (defined by the form in mod.html) this function
* will create a new instance and return the id number
* of the new instance.
*/
function bigbluebutton_add_instance($bigbluebutton) {
$bigbluebutton->timemodified = time();
if ($returnid = bigbluebutton_insert_record('bigbluebutton', $bigbluebutton)) {
$event = NULL;
$event->courseid = $bigbluebutton->course;
$event->name = $bigbluebutton->name;
$event->meetingname = $bigbluebutton->meetingname;
$event->meetingid = $bigbluebutton->meetingid;
$event->attendeepw = $bigbluebutton->attendeepw;
$event->moderatorpw = $bigbluebutton->moderatorpw;
$event->autologin = $bigbluebutton->autologin;
$event->newwindow = $bigbluebutton->newwindow;
$event->welcomemsg = $bigbluebutton->welcomemsg;
bigbluebutton_add_event($event);
}
return $returnid;
}
/**
* Given an object containing all the necessary data,
* (defined by the form in mod.html) this function
* will update an existing instance with new data.
*/
function bigbluebutton_update_instance($bigbluebutton) {
$bigbluebutton->timemodified = time();
$bigbluebutton->id = $bigbluebutton->instance;
if ($returnid = bigbluebutton_update_record('bigbluebutton', $bigbluebutton)) {
/*
$event = NULL;
if ($event->id = bigbluebutton_get_field('event', 'id', 'modulename', 'bigbluebutton', 'instance', $bigbluebutton->id)) {
$event->courseid = $bigbluebutton->course;
$event->name = $bigbluebutton->name;
$event->meetingname = $bigbluebutton->meetingname;
$event->meetingid = $bigbluebutton->meetingid;
$event->attendeepw = $bigbluebutton->attendeepw;
$event->moderatorpw = $bigbluebutton->moderatorpw;
$event->autologin = $bigbluebutton->autologin;
$event->newwindow = $bigbluebutton->newwindow;
$event->welcomemsg = $bigbluebutton->welcomemsg;
bigbluebutton_update_event($event);
}*/
}
return $returnid;
}
/**
* Given an ID of an instance of this module,
* this function will permanently delete the instance
* and any data that depends on it.
*/
function bigbluebutton_delete_instance($id) {
if (! $bigbluebutton = bigbluebutton_get_record('bigbluebutton', 'id', $id)) {
class bbb {
var $url;
var $salt;
var $api;
var $user_complete_name = null;
var $protocol = 'http://';
var $debug = true;
var $logout_url = null;
function __construct() {
// initialize video server settings from global settings
$settings = api_get_settings('Extra','list',api_get_current_access_url_id());
$bbb_settings = array();
foreach ($settings as $setting) {
if (substr($setting['variable'],0,4)==='bbb_') {
$bbb_settings[$setting['variable']] = $setting['selected_value'];
}
}
$bbb_plugin = $bbb_settings['bbb_plugin'] === 'true';
$bbb_host = $bbb_settings['bbb_plugin_host'];
$bbb_salt = $bbb_settings['bbb_plugin_salt'];
$course_code = api_get_course_id();
$this->logout_url = api_get_path(WEB_COURSE_PATH).$course_code;
if ($bbb_plugin) {
$user_info = api_get_user_info();
$this->user_complete_name = $user_info['complete_name'];
$this->salt = $bbb_salt;
$this->url = $bbb_host.'/bigbluebutton/';
$this->table = Database::get_main_table('plugin_bbb_meeting');
return true;
}
return false;
}
function create_meeting($params) {
$params['c_id'] = api_get_course_int_id();
$course_code = api_get_course_id();
$attende_password = $params['attendee_pw'] = isset($params['moderator_pw']) ? $params['moderator_pw'] : api_get_course_id();
$moderator_password = $params['moderator_pw'] = isset($params['moderator_pw']) ? $params['moderator_pw'] : api_get_course_id().'mod';
$params['record'] = api_get_course_setting('big_blue_button_record_and_store', $course_code) == 1 ? true : false;
$max = api_get_course_setting('big_blue_button_max_students_allowed', $course_code);
$max = isset($max) ? $max : -1;
$params['status'] = 1;
if ($this->debug) error_log("enter create_meeting ".print_r($params, 1));
$params['created_at'] = api_get_utc_datetime();
$id = Database::insert($this->table, $params);
if ($id) {
if ($this->debug) error_log("create_meeting $id ");
$meeting_name = isset($params['meeting_name']) ? $params['meeting_name'] : api_get_course_id();
$welcome_msg = isset($params['welcome_msg']) ? $params['welcome_msg'] : null;
$record = isset($params['record']) && $params['record'] ? 'true' : 'false';
$duration = isset($params['duration']) ? intval($params['duration']) : 0;
$result = true;
# Delete any dependent records here #
if (! bigbluebutton_delete_records('bigbluebutton', 'id', $bigbluebutton->id)) {
$result = false;
// ??
$voiceBridge = 0;
$metadata = array('maxParticipants' => $max);
return $this->protocol.BigBlueButtonBN::createMeetingAndGetJoinURL($this->user_complete_name, $meeting_name, $id, $welcome_msg, $moderator_password, $attende_password,
$this->salt, $this->url, $this->logout_url, $record, $duration, $voiceBridge, $metadata);
//$id = Database::update($this->table, array('created_at' => ''));
}
}
/*
$pagetypes = page_import_types('mod/bigbluebutton/');
foreach($pagetypes as $pagetype) {
if(!delete_records('block_instance', 'pageid', $bigbluebutton->id, 'pagetype', $pagetype)) {
$result = false;
function is_meeting_exist($meeting_name) {
$course_id = api_get_course_int_id();
$meeting_data = Database::select('*', $this->table, array('where' => array('c_id = ? AND meeting_name = ? AND status = 1 ' => array($course_id, $meeting_name))), 'first');
if ($this->debug) error_log("is_meeting_exist ".print_r($meeting_data,1));
if (empty($meeting_data)) {
return false;
} else {
return true;
}
}
*/
/*
if (! bigbluebutton_delete_records('event', 'modulename', 'bigbluebutton', 'instance', $bigbluebutton->id)) {
$result = false;
/**
* @todo implement moderator pass
*/
function join_meeting($meeting_name) {
$pass = $this->get_user_metting_password();
$meeting_data = Database::select('*', $this->table, array('where' => array('meeting_name = ? AND status = 1 ' => $meeting_name)), 'first');
if (empty($meeting_data)) {
if ($this->debug) error_log("meeting does not exist: $meeting_name ");
return false;
}
$meeting_is_running = BigBlueButtonBN::isMeetingRunning($meeting_data['id'], $this->url, $this->salt);
$url = false;
if ($this->debug) error_log("meeting is running".$meeting_is_running);
if (isset($meeting_is_running)) {
$url = $this->protocol.BigBlueButtonBN::joinURL($meeting_data['id'], $this->user_complete_name, $pass, $this->salt, $this->url);
}
if ($this->debug) error_log("url :".$url);
return $url;
}
function get_course_meetings() {
$pass = $this->get_user_metting_password();
$meeting_list = Database::select('*', $this->table, array('where' => array('c_id = ? ' => api_get_course_int_id())));
$new_meeting_list = array();
foreach ($meeting_list as $meeting) {
$item_meeting = $meeting;
$item_meeting['info'] = BigBlueButtonBN::getMeetingInfoArray($meeting['id'], $pass, $this->url, $this->salt);
if ($meeting['info']['returncode'] == 'FAILED') {
} else {
$item_meeting['end_url'] = api_get_self().'?action=end&id='.$meeting['id'];
}
$record_array = array();
if ($meeting['record'] == 1) {
$records = BigBlueButtonBN::getRecordingsArray($meeting['id'], $this->url, $this->salt);
if (!empty($records)) {
foreach ($records as $record) {
//var_dump($record);
if (is_array($record) && isset($record['recordID']) && isset($record['playbacks'])) {
foreach ($record['playbacks'] as $item) {
$url = Display::url(get_lang('ViewRecord'), $item['url'], array('target' => '_blank'));
//$url .= api_get_self().'?action=publish&id='.$record['recordID'];
$record_array[] = $url;
}
}
}
}
$item_meeting['show_links'] = implode('<br />', $record_array);
}
$item_meeting['created_at'] = api_get_local_time($item_meeting['created_at']);
//created_at
$item_meeting['publish_url'] = api_get_self().'?action=publish&id='.$meeting['id'];
$item_meeting['unpublish_url'] = api_get_self().'?action=unpublish&id='.$meeting['id'];
if ($meeting['status'] == 1) {
$item_meeting['go_url'] = $this->protocol.BigBlueButtonBN::joinURL($meeting['id'], $this->user_complete_name, $pass, $this->salt, $this->url);
}
$new_meeting_list[] = $item_meeting;
}
return $new_meeting_list;
}
*/
return $result;
function publish_meeting($id) {
return BigBlueButtonBN::setPublishRecordings($id, 'true', $this->url, $this->salt);
}
function unpublish_meeting($id) {
return BigBlueButtonBN::setPublishRecordings($id, 'false', $this->url, $this->salt);
}
function end_meeting($id) {
$pass = $this->get_user_metting_password();
BigBlueButtonBN::endMeeting($id, $pass, $this->url, $this->salt);
Database::update($this->table, array('status' => 0), array('id = ? ' => $id));
}
function get_user_metting_password() {
$teacher = api_is_course_admin() || api_is_coach() || api_is_platform_admin();
if ($teacher) {
return api_get_course_id().'mod';
} else {
return api_get_course_id();
}
}
/**
* Get users online in the current course room
*/
function get_users_online_in_current_room() {
$course_id = api_get_course_int_id();
$meeting_data = Database::select('*', $this->table, array('where' => array('c_id = ? AND status = 1 ' => $course_id)), 'first');
if (empty($meeting_data)) {
return 0;
}
$pass = $this->get_user_metting_password();
//$meeting_is_running = BigBlueButtonBN::isMeetingRunning($meeting_data['id'], $this->url, $this->salt);
$info = BigBlueButtonBN::getMeetingInfoArray($meeting_data['id'], $pass, $this->url, $this->salt);
if (!empty($info) && isset($info['participantCount'])) {
return $info['participantCount'];
}
return 0;
}
}
/**
* Create string where we check if the meeting is running
*/
@ -206,19 +235,34 @@ function wc_isMeetingRunning($myIP,$mySecuritySalt,$myMeetingID) {
/**
* Create meeting if it's not already running
*/
function wc_createMeeting($myIP,$mySecuritySalt,$myMeetingName,$myMeetingID,$myAttendeePW,$myModeratorPW,$myWelcomeMsg,$myLogoutURL) {
function wc_createMeeting($myIP, $mySecuritySalt, $myMeetingName, $myMeetingID, $myAttendeePW, $myModeratorPW, $myWelcomeMsg, $myLogoutURL, $record = false, $duration = null) {
$createAPI = "/bigbluebutton/api/create?";
$myVoiceBridge = rand(70000,79999);
$queryStr = "name=".urlencode($myMeetingName)."&meetingID=".urlencode($myMeetingID)."&attendeePW=".urlencode($myAttendeePW)."&moderatorPW=".urlencode($myModeratorPW)."&voiceBridge=".$myVoiceBridge."&welcome=".urlencode($myWelcomeMsg)."&logoutURL=".urlencode($myLogoutURL);
if (isset($record)) {
$record = 'true';
} else {
$record = 'false';
}
$duration_param = '';
if (!empty($duration)) {
$duration_param = '&duration='.intval($duration);
}
$queryStr = "name=".urlencode($myMeetingName)."&meetingID=".urlencode($myMeetingID)."&attendeePW=".urlencode($myAttendeePW)."&moderatorPW=".urlencode($myModeratorPW).
"&voiceBridge=".$myVoiceBridge."&welcome=".urlencode($myWelcomeMsg)."&logoutURL=".urlencode($myLogoutURL)."&record=".$record.$duration_param;
$checksum = sha1('create'.$queryStr.$mySecuritySalt);
$secQueryURL = "http://".$myIP.$createAPI.$queryStr."&checksum=".$checksum;
$myResponse = @file_get_contents($secQueryURL);
if ($myResponse === false) { return false; }
$secQueryURL = "http://".$myIP.$createAPI.$queryStr."&checksum=".$checksum;
$myResponse = @file_get_contents($secQueryURL);
if ($myResponse === false) {
return false;
}
$doc= new DOMDocument();
$doc->loadXML($myResponse);
$returnCodeNode = $doc->getElementsByTagName("returncode");
$returnCode = $returnCodeNode->item(0)->nodeValue;
$returnCode = $returnCodeNode->item(0)->nodeValue;
if ($returnCode=="SUCCESS") {
return $returnCode;
} else {
@ -368,3 +412,118 @@ function wc_getRunningMeetings($myIP,$mySecuritySalt) {
}
return $meetings;
}
function wc_getRecordingsURL($meetingID, $URL, $SALT) {
$base_url_record = $URL."api/getRecordings?";
$params = "meetingID=".urlencode($meetingID);
return ($base_url_record.$params."&checksum=".sha1("getRecordings".$params.$SALT) );
}
/**
*This method calls getMeetings on the bigbluebuttonbn server, then calls getMeetingInfo for each meeting and concatenates the result.
*
*@param URL -- the url of the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*
*@return
* - Null if the server is unreachable
* - If FAILED then returns an array containing a returncode, messageKey, message.
* - If SUCCESS then returns an array of all the meetings. Each element in the array is an array containing a meetingID,
moderatorPW, attendeePW, hasBeenForciblyEnded, running.
*/
function wc_getRecordingsArray($meetingID, $URL, $SALT ) {
$xml = _wrap_simplexml_load_file(wc_getRecordingsURL( $meetingID, $URL, $SALT));
if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey ) {
////The meetings were returned
return array('returncode' => (string) $xml->returncode, 'message' => (string) $xml->message, 'messageKey' => (string) $xml->messageKey);
} else if($xml && $xml->returncode == 'SUCCESS') { //If there were meetings already created
$recordings = array();
foreach ($xml->recordings->recording as $recording) {
$recordings[(string) $recording->recordID] = array( 'recordID' => (string) $recording->recordID, 'meetingID' => (string) $recording->meetingID, 'meetingName' => (string) $recording->name, 'published' => (string) $recording->published, 'startTime' => (string) $recording->startTime, 'endTime' => (string) $recording->endTime );
$recordings[(string) $recording->recordID]['playbacks'] = array();
foreach ( $recording->playback->format as $format ){
$recordings[(string) $recording->recordID]['playbacks'][(string) $format->type] = array( 'type' => (string) $format->type, 'url' => (string) $format->url );
}
// THIS IS FOR TESTING MULTIPLE FORMATS, DO REMOVE IT FOR FINAL RELEASE
//$recordings[(string) $recording->recordID]['playbacks']['desktop'] = array( 'type' => 'desktop', 'url' => (string) $recording->playback->format->url );
//Add the metadata to the recordings array
$metadata = get_object_vars($recording->metadata);
while ($data = current($metadata)) {
$recordings[(string) $recording->recordID]['meta_'.key($metadata)] = $data;
next($metadata);
}
}
ksort($recordings);
return $recordings;
} else if( $xml ) { //If the xml packet returned failure it displays the message to the user
return array('returncode' => (string) $xml->returncode, 'message' => (string) $xml->message, 'messageKey' => (string) $xml->messageKey);
} else { //If the server is unreachable, then prompts the user of the necessary action
return NULL;
}
}
function _wrap_simplexml_load_file($url){
if (extension_loaded('curl')) {
$ch = curl_init() or die ( curl_error() );
$timeout = 10;
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec( $ch );
curl_close( $ch );
if($data)
return (new SimpleXMLElement($data,LIBXML_NOCDATA));
else
return false;
}
return (simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA));
}
function getMeetingsURL($URL, $SALT) {
$base_url = $URL."api/getMeetings?";
$params = '';
return ( $base_url.$params.'&checksum='.sha1("getMeetings".$params.$SALT));
}
/**
*This method calls getMeetings on the bigbluebuttonbn server, then calls getMeetingInfo for each meeting and concatenates the result.
*
*@param URL -- the url of the bigbluebuttonbn server
*@param SALT -- the security salt of the bigbluebuttonbn server
*
*@return
* - Null if the server is unreachable
* - If FAILED then returns an array containing a returncode, messageKey, message.
* - If SUCCESS then returns an array of all the meetings. Each element in the array is an array containing a meetingID,
moderatorPW, attendeePW, hasBeenForciblyEnded, running.
*/
function getMeetingsArray( $URL, $SALT ) {
if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey ) {//The meetings were returned
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
}
else if($xml && $xml->returncode == 'SUCCESS'){ //If there were meetings already created
foreach ($xml->meetings->meeting as $meeting)
{
$meetings[] = array( 'meetingID' => $meeting->meetingID, 'moderatorPW' => $meeting->moderatorPW, 'attendeePW' => $meeting->attendeePW, 'hasBeenForciblyEnded' => $meeting->hasBeenForciblyEnded, 'running' => $meeting->running );
}
return $meetings;
}
else if( $xml ) { //If the xml packet returned failure it displays the message to the user
return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
}
else { //If the server is unreachable, then prompts the user of the necessary action
return null;
}
}

@ -135,7 +135,7 @@ class BigBlueButtonBN {
$params = 'name='.urlencode($name).'&meetingID='.urlencode($meetingID).'&attendeePW='.urlencode($attendeePW).'&moderatorPW='.urlencode($moderatorPW).'&voiceBridge='.$voiceBridge.'&logoutURL='.urlencode($logoutURL).'&record='.$record.$meta;
$duration = intval($duration);
if( $duration > 0 )
$params .= '&duration='.$duration;
@ -224,9 +224,9 @@ class BigBlueButtonBN {
*
*@return The joinURL if successful or an error message if unsuccessful
*/
public static function createMeetingAndGetJoinURL( $username, $meetingID, $welcomeString, $mPW, $aPW, $SALT, $URL, $logoutURL, $record = 'false', $duration=0, $voiceBridge=0, $metadata = array() ) {
public static function createMeetingAndGetJoinURL( $username, $meeting_name, $meetingID, $welcomeString, $mPW, $aPW, $SALT, $URL, $logoutURL, $record = 'false', $duration=0, $voiceBridge=0, $metadata = array()) {
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::createMeetingURL($username, $meetingID, $aPW, $mPW, $welcomeString, $logoutURL, $SALT, $URL, $record, $duration, $voiceBridge, $metadata ) );
$xml = BigBlueButtonBN::_wrap_simplexml_load_file( BigBlueButtonBN::createMeetingURL($meeting_name, $meetingID, $aPW, $mPW, $welcomeString, $logoutURL, $SALT, $URL, $record, $duration, $voiceBridge, $metadata ) );
if( $xml && $xml->returncode == 'SUCCESS' ) {
return ( BigBlueButtonBN::joinURL( $meetingID, $username, $mPW, $SALT, $URL ) );

@ -0,0 +1,9 @@
<?php
$variables = array( 'big_blue_button_meeting_name',
'big_blue_button_attendee_password',
'big_blue_button_moderator_password',
'big_blue_button_welcome_message',
'big_blue_button_max_students_allowed',
);

@ -10,14 +10,42 @@
$t_course = Database::get_course_table(TABLE_COURSE_SETTING);
// $course_id is set in the add_course.lib.inc.php
if (!empty($course_id)) {
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_welcome_message','','plugins')";
$r = Database::query($sql_course);
/*
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_meeting_name','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_attendee_password','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_moderator_password','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_welcome_message','','plugins')";
//New BBB settings
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_max_students_allowed','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_open_new_window','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_student_must_wait_until_moderator','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_join_start_date','','plugins')";
$r = Database::query($sql_course);
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_join_end_date','','plugins')";
$r = Database::query($sql_course);*/
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_record_and_store','','plugins')";
$r = Database::query($sql_course);
$t_tool = Database::get_course_table(TABLE_TOOL_LIST);
$sql_course = "INSERT INTO $t_tool VALUES ($course_id, NULL, 'videoconference','../../plugin/bbb/start.php','visio.gif','".string2binary(api_get_setting('course_create_active_tools', 'videoconference'))."','0','squaregrey.gif','NO','_blank','plugin','0')";
$r = Database::query($sql_course);

@ -7,6 +7,9 @@
/**
* Initialization
*/
require 'config.php';
$t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
$t_options = Database::get_main_table(TABLE_MAIN_SETTINGS_OPTIONS);
/**
@ -26,17 +29,16 @@ $sql = "INSERT INTO $t_settings (variable, subkey, type, category, selected_valu
('bbb_plugin_salt', '', 'textfield', 'Extra', '', 'BigBlueButtonSecuritySaltTitle','BigBlueButtonSecuritySaltComment',NULL,NULL, 1,1)";
Database::query($sql);
$table = Database::get_main_table('plugin_bbb');
$table = Database::get_main_table('plugin_bbb_meeting');
$sql = "CREATE TABLE $table ( " .
"id BIGINT unsigned NOT NULL auto_increment PRIMARY KEY, " .
"course_id INT unsigned NOT NULL DEFAULT 0, " .
"name VARCHAR(255) NOT NULL DEFAULT '', " .
"meeting_name VARCHAR(255) NOT NULL DEFAULT '', " .
"meeting_id VARCHAR(255) NOT NULL DEFAULT '', " .
"id INT unsigned NOT NULL auto_increment PRIMARY KEY, " .
"c_id INT unsigned NOT NULL DEFAULT 0, " .
"meeting_name VARCHAR(255) NOT NULL DEFAULT '', " .
"attendee_pw VARCHAR(255) NOT NULL DEFAULT '', " .
"moderator_pw VARCHAR(255) NOT NULL DEFAULT '', " .
"auto_login VARCHAR(255) NOT NULL DEFAULT '', " .
"new_window VARCHAR(255) NOT NULL DEFAULT '', " .
"moderator_pw VARCHAR(255) NOT NULL DEFAULT '', " .
"record INT NOT NULL DEFAULT 0, " .
"status INT NOT NULL DEFAULT 0, " .
"created_at VARCHAR(255) NOT NULL, " .
"welcome_msg VARCHAR(255) NOT NULL DEFAULT '')";
Database::query($sql);
@ -45,35 +47,17 @@ $t_courses = Database::get_main_table(TABLE_MAIN_COURSE);
$sql = "SELECT id, code FROM $t_courses ORDER BY id";
$res = Database::query($sql);
while ($row = Database::fetch_assoc($res)) {
$t_course = Database::get_course_table(TABLE_COURSE_SETTING);
$course_id = $row['id'];
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_meeting_name' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_meeting_name','','plugins')";
$r = Database::query($sql_course);
foreach ($variables as $variable) {
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = '$variable' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, '$variable','','plugins')";
$r = Database::query($sql_course);
}
}
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_attendee_password' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable, value, category) VALUES ($course_id, 'big_blue_button_attendee_password','','plugins')";
$r = Database::query($sql_course);
}
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_moderator_password' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable, value, category) VALUES ($course_id, 'big_blue_button_moderator_password','','plugins')";
$r = Database::query($sql_course);
}
$sql = "SELECT value FROM $t_course WHERE c_id = $course_id AND variable = 'big_blue_button_welcome_message' ";
$result = Database::query($sql);
if (!Database::num_rows($result)) {
$sql_course = "INSERT INTO $t_course (c_id, variable,value,category) VALUES ($course_id, 'big_blue_button_welcome_message','','plugins')";
$r = Database::query($sql_course);
}
$t_tool = Database::get_course_table(TABLE_TOOL_LIST);
$sql = "SELECT name FROM $t_tool WHERE c_id = $course_id AND name = 'videoconference' ";

@ -0,0 +1,51 @@
<?php
/**
* This script initiates a videoconference session, calling the BigBlueButton API
* @package chamilo.plugin.bigbluebutton
*/
/**
* Initialization
*/
require_once '../../main/inc/global.inc.php';
require_once 'bbb.lib.php';
require_once 'bbb_api.php';
$course_code = api_get_course_id();
$bbb = new bbb();
$action = isset($_GET['action']) ? $_GET['action'] : null;
switch ($action) {
case 'end':
$bbb->end_meeting($_GET['id']);
break;
case 'save_to_documents':
$bbb->save_recording_to_document($_GET['id']);
break;
case 'publish':
$result = $bbb->publish_meeting($_GET['id']);
break;
case 'unpublish':
$result = $bbb->unpublish_meeting($_GET['id']);
break;
}
$meetings = $bbb->get_course_meetings();
$users_online = $bbb->get_users_online_in_current_room();
$tpl = new Template($tool_name);
$tpl->assign('meetings', $meetings);
$conference_url = api_get_path(WEB_PLUGIN_PATH).'bbb/start.php?'.api_get_cidreq();
$tpl->assign('conference_url', $conference_url);
$tpl->assign('users_online', $users_online);
$tpl->assign('actions', $actions);
$tpl->assign('message', $message);
$listing_tpl = 'bbb/listing.tpl';
$content = $tpl->fetch($listing_tpl);
$tpl->assign('content', $content);
$tpl->display_one_col_template();

@ -0,0 +1,40 @@
<div class ="row">
<div class ="span12" style="text-align:center">
<a href="{{ conference_url }}" class="btn btn-primary btn-large">
{{ 'EnterTheConference'|get_lang }}
</a>
<span id="users_online" class="label label-warning">{{ users_online }} user online</span>
</div>
<div class ="span12">
<table class="table">
<tr>
<th>{{'id'|get_lang}}</th>
<th>{{'Meeting'|get_lang}}</th>
<th>{{'Date'|get_lang}}</th>
<th>{{'Actions'|get_lang}}</th>
</tr>
{% for meeting in meetings %}
<tr>
<td>{{ meeting.id }}</td>
<td>{{ meeting.meeting_name }}</td>
<td>{{ meeting.created_at }}</td>
<td>
{% if meeting.record == 1 %}
{{ meeting.show_links }}
<!-- <a href="{{ meeting.publish_url}} "> Publish </a>
<a href="{{ meeting.unpublish_url}} "> UnPublish </a> -->
{% endif %}
{% if meeting.status == 1 %}
<a href="{{ meeting.end_url }} "> Close </a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
</div>

@ -15,6 +15,6 @@ $plugin_info['comment']="Open Source Videoconference tool";
//the locations where this plugin can be shown
$plugin_info['location']=array('course_tool_plugin');
//the plugin version
$plugin_info['version']='0.9';
$plugin_info['version']='1.0';
//the plugin author
$plugin_info['author']='Yannick Warnier';
$plugin_info['author']='Julio Montoya & Yannick Warnier';

@ -8,41 +8,48 @@
*/
require_once '../../main/inc/global.inc.php';
require_once 'bbb.lib.php';
//The script receives the course_code (cidReq), which allows it to get the corresponding data
$cid = api_get_real_course_id();
$ccode = api_get_course_id();
// initialize conference settings from course settings
$meeting_name = api_get_course_setting('big_blue_button_meeting_name',$ccode);
if (empty($meeting_name) or $meeting_name==-1) { $meeting_name = $ccode; }
$meeting_att_pw = api_get_course_setting('big_blue_button_meeting_attendee_pw',$ccode);
if (empty($meeting_att_pw) or $meeting_att_pw==-1) { $meeting_att_pw = $ccode; }
$meeting_mod_pw = api_get_course_setting('big_blue_button_meeting_moderator_pw',$ccode);
if (empty($meeting_mod_pw) or $meeting_mod_pw==-1) { $meeting_mod_pw = $ccode.'mod'; }
$meeting_wel_ms = api_get_course_setting('big_blue_button_meeting_welcome_message',$ccode);
if (empty($meeting_wel_ms) or $meeting_wel_ms==-1) { $meeting_wel_ms = ''; }
require_once 'bbb_api.php';
// initialize video server settings from global settings
$settings = api_get_settings('Extra','list',api_get_current_access_url_id());
$bbb_settings = array();
foreach ($settings as $setting) {
if (substr($setting['variable'],0,4)==='bbb_') {
$bbb_settings[$setting['variable']] = $setting['selected_value'];
$course_code = api_get_course_id();
$meeting_params = array();
$meeting_params['meeting_name'] = api_get_course_id();
$bbb = new bbb();
if ($bbb) {
if ($bbb->is_meeting_exist($meeting_params['meeting_name'])) {
$url = $bbb->join_meeting($meeting_params['meeting_name']);
if ($url) {
header('location: '.$url);
exit;
} else {
$url = $bbb->create_meeting($meeting_params);
header('location: '.$url);
exit;
}
} else {
$url = $bbb->create_meeting($meeting_params);
header('location: '.$url);
exit;
}
} else {
if (api_is_platform_admin()) {
Display::display_warning_message(get_lang('NotConfigured'));
}
}
$bbb_plugin = $bbb_settings['bbb_plugin'] === 'true';
$bbb_host = $bbb_settings['bbb_plugin_host'];
$bbb_salt = $bbb_settings['bbb_plugin_salt'];
if (!$bbb_plugin) {
//the BigBlueButton plugin is not enabled (strangely), return to course homepage
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$ccode);
}
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$course_code);
exit;
/*
$teacher = api_is_course_admin() || api_is_coach() || api_is_platform_admin();
$user_info = api_get_user_info(api_get_user_id());
$full_user_name = api_get_person_name($user_info['firstname'],$user_info['lastname']);
$user_id = api_get_user_id();
$is_running = wc_isMeetingRunning($bbb_host,$bbb_salt,$meeting_name);
$is_running = wc_isMeetingRunning($bbb_host, $bbb_salt, $meeting_name);
if ($is_running == 'true') {
// The conference is running, everything is fine, join
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
@ -51,33 +58,41 @@ if ($is_running == 'true') {
// The conference room does not seem to be running...
// First, try harder and ignore the "running" status
$meetings = wc_getRunningMeetings($bbb_host,$bbb_salt);
$found = false;
foreach ($meetings as $meeting) {
//Try to find our meeting room in the list...
if ($meeting['meetingID'] == $meeting_name) {
$meeting_info = wc_getMeetingInfo($bbb_host,$bbb_salt,$meeting_name,$meeting_mod_pw);
error_log('Found passive meeting created '.($meeting_info['createTime']).' seconds ago with '.count($meeting_info['attendees']).' attendees - joining as '.($teacher?'teacher':'student'));
//if the user is a teacher, or if there are already attendees in
// the conference room, then allow joining it
if ($teacher or count($meeting_info['attendees'])>0) {
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
exit;
if (!empty($meetings)) {
foreach ($meetings as $meeting) {
//Try to find our meeting room in the list...
if ($meeting['meetingID'] == $meeting_name) {
$meeting_info = wc_getMeetingInfo($bbb_host,$bbb_salt,$meeting_name,$meeting_mod_pw);
error_log('Found passive meeting created '.($meeting_info['createTime']).' seconds ago with '.count($meeting_info['attendees']).' attendees - joining as '.($teacher?'teacher':'student'));
//if the user is a teacher, or if there are already attendees in
// the conference room, then allow joining it
if ($teacher or count($meeting_info['attendees'])>0) {
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
exit;
}
}
}
}
// That conference room is really not running or it has no
// accompanying moderator subscribed
// That conference room is really not running or it has no accompanying moderator subscribed
//if (1) {
if ($teacher) {
// The user is a teacher, so he has the right to create the
// room, so create it and join it
wc_createMeeting($bbb_host,$bbb_salt,$meeting_name,$meeting_name,$meeting_att_pw,$meeting_mod_pw,$meeting_wel_ms,api_get_path(WEB_COURSE_PATH).'/'.$ccode);
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
exit;
} else {
// There is no conference room for this course and the user
// is a mere student, so he cannot start a conference room by
// himself: a teacher has to launch it first
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$ccode);
exit;
//var_dump($bbb_host,$bbb_salt,$meeting_name,$meeting_name,$meeting_att_pw,$meeting_mod_pw,$meeting_wel_ms,api_get_path(WEB_COURSE_PATH).'/'.$course_code);
$result = wc_createMeeting($bbb_host, $bbb_salt, $meeting_name, $meeting_name, $meeting_att_pw, $meeting_mod_pw, $meeting_wel_ms, api_get_path(WEB_COURSE_PATH).'/'.$course_code, $record_conference);
if ($result) {
header('location: '.wc_joinMeetingURL($bbb_host,$bbb_salt,$full_user_name,$meeting_name,($teacher?$meeting_mod_pw:$meeting_att_pw),$user_id));
exit;
}
}
// There is no conference room for this course and the user
// is a mere student, so he cannot start a conference room by
// himself: a teacher has to launch it first
header('location: '.api_get_path(WEB_COURSE_PATH).'/'.$course_code);
exit;
}
*/

@ -8,8 +8,12 @@
/**
* Queries
*/
require 'config.php';
$t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
$t_options = Database::get_main_table(TABLE_MAIN_SETTINGS_OPTIONS);
$sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin'";
Database::query($sql);
$sql = "DELETE FROM $t_options WHERE variable = 'bbb_plugin'";
@ -18,22 +22,21 @@ $sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin_host'";
Database::query($sql);
$sql = "DELETE FROM $t_settings WHERE variable = 'bbb_plugin_salt'";
Database::query($sql);
$sql = "DROP TABLE IF EXISTS plugin_bbb";
$sql = "DROP TABLE IF EXISTS plugin_bbb_meeting";
Database::query($sql);
// update existing courses to add conference settings
$t_courses = Database::get_main_table(TABLE_MAIN_COURSE);
$sql = "SELECT id, code, db_name FROM $t_courses ORDER BY id";
$sql = "SELECT id, code FROM $t_courses ORDER BY id";
$res = Database::query($sql);
while ($row = Database::fetch_assoc($res)) {
$t_course = Database::get_course_table(TABLE_COURSE_SETTING);
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_meeting_name'";
$r = Database::query($sql_course);
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_attendee_password'";
$r = Database::query($sql_course);
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_moderator_password'";
$r = Database::query($sql_course);
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = 'big_blue_button_welcome_message'";
$r = Database::query($sql_course);
foreach ($variables as $variable) {
$sql_course = "DELETE FROM $t_course WHERE c_id = ".$row['id']." AND variable = '$variable'";
$r = Database::query($sql_course);
}
$t_tool = Database::get_course_table(TABLE_TOOL_LIST);
$sql_course = "DELETE FROM $t_tool WHERE c_id = ".$row['id']." AND link = '../../plugin/bbb/start.php'";
$r = Database::query($sql_course);

Loading…
Cancel
Save