'big_blue_button_record_and_store', 'type' => 'checkbox', ], [ 'name' => 'bbb_enable_conference_in_groups', 'type' => 'checkbox', ], [ 'name' => 'bbb_force_record_generation', 'type' => 'checkbox', ], [ 'name' => 'big_blue_button_students_start_conference_in_groups', 'type' => 'checkbox', ], ]; /** * BBBPlugin constructor. */ protected function __construct() { $settings = [ 'tool_enable' => 'boolean', 'host' => 'text', 'salt' => 'text', 'enable_global_conference' => 'boolean', 'enable_global_conference_per_user' => 'boolean', 'enable_conference_in_course_groups' => 'boolean', 'enable_global_conference_link' => 'boolean', 'disable_download_conference_link' => 'boolean', 'max_users_limit' => 'text', 'global_conference_allow_roles' => [ 'type' => 'select', 'options' => [ PLATFORM_ADMIN => get_lang('Administrator'), COURSEMANAGER => get_lang('Teacher'), STUDENT => get_lang('Student'), STUDENT_BOSS => get_lang('StudentBoss'), ], 'attributes' => ['multiple' => 'multiple'], ], 'allow_regenerate_recording' => 'boolean', // Default course settings, must be the same as $course_settings 'big_blue_button_record_and_store' => 'checkbox', 'bbb_enable_conference_in_groups' => 'checkbox', 'bbb_force_record_generation' => 'checkbox', 'disable_course_settings' => 'boolean', 'meeting_duration' => 'text', ]; if (1 === (int) api_get_current_access_url_id()) { $settings['plugin_bbb_multiple_urls_cron_apply_to_all'] = 'checkbox'; } parent::__construct( '2.11', 'Julio Montoya, Yannick Warnier, Angel Fernando Quiroz Campos, Jose Angel Ruiz, Ghazi Triki, Adnen Manssouri', $settings ); $this->isAdminPlugin = true; } /** * @return BBBPlugin|null */ public static function create() { static $result = null; return $result ? $result : $result = new self(); } /** * @param string $variable * * @return bool */ public function validateCourseSetting($variable) { if ($this->get('disable_course_settings') === 'true') { return false; } $result = true; switch ($variable) { case 'bbb_enable_conference_in_groups': $result = $this->get('enable_conference_in_course_groups') === 'true'; break; case 'bbb_force_record_generation': $result = $this->get('allow_regenerate_recording') === 'true'; break; case 'big_blue_button_record_and_store': } return $result; } /** * * @return array */ public function getCourseSettings() { $settings = []; if ($this->get('disable_course_settings') !== 'true') { $settings = parent::getCourseSettings(); } return $settings; } /** * * @return \Plugin */ public function performActionsAfterConfigure() { $result = $this->get('disable_course_settings') === 'true'; if ($result) { $valueConference = $this->get('bbb_enable_conference_in_groups') === 'true' ? 1 : 0; self::update_course_field_in_all_courses('bbb_enable_conference_in_groups', $valueConference); $valueForceRecordGeneration = $this->get('bbb_force_record_generation') === 'true' ? 1 : 0; self::update_course_field_in_all_courses('bbb_force_record_generation', $valueForceRecordGeneration); $valueForceRecordStore = $this->get('big_blue_button_record_and_store') === 'true' ? 1 : 0; self::update_course_field_in_all_courses('big_blue_button_record_and_store', $valueForceRecordStore); } return $this; } /** * Install */ public function install() { $sql = "CREATE TABLE IF NOT EXISTS plugin_bbb_meeting ( id INT unsigned NOT NULL auto_increment PRIMARY KEY, c_id INT unsigned NOT NULL DEFAULT 0, group_id INT unsigned NOT NULL DEFAULT 0, user_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 '', record INT NOT NULL DEFAULT 0, status INT NOT NULL DEFAULT 0, created_at VARCHAR(255) NOT NULL, closed_at VARCHAR(255) NOT NULL, calendar_id INT DEFAULT 0, welcome_msg VARCHAR(255) NOT NULL DEFAULT '', session_id INT unsigned DEFAULT 0, remote_id CHAR(30), internal_meeting_id VARCHAR(255) DEFAULT NULL, visibility TINYINT NOT NULL DEFAULT 1, voice_bridge INT NOT NULL DEFAULT 1, access_url INT NOT NULL DEFAULT 1, video_url TEXT NULL, has_video_m4v TINYINT NOT NULL DEFAULT 0 )"; Database::query($sql); Database::query( "CREATE TABLE IF NOT EXISTS plugin_bbb_room ( id int NOT NULL AUTO_INCREMENT PRIMARY KEY, meeting_id int NOT NULL, participant_id int(11) NOT NULL, in_at datetime, out_at datetime, close INT NOT NULL DEFAULT 0 );" ); $fieldLabel = 'plugin_bbb_course_users_limit'; $fieldType = ExtraField::FIELD_TYPE_INTEGER; $fieldTitle = $this->get_lang('MaxUsersInConferenceRoom'); $fieldDefault = '0'; $extraField = new ExtraField('course'); $fieldId = CourseManager::create_course_extra_field( $fieldLabel, $fieldType, $fieldTitle, $fieldDefault ); $extraField->find($fieldId); $extraField->update( [ 'id' => $fieldId, 'variable' => 'plugin_bbb_course_users_limit', 'changeable' => 1, 'visible_to_self' => 1, 'visible_to_others' => 0, ] ); $fieldLabel = 'plugin_bbb_session_users_limit'; $extraField = new ExtraField('session'); $fieldId = SessionManager::create_session_extra_field( $fieldLabel, $fieldType, $fieldTitle, $fieldDefault ); $extraField->find($fieldId); $extraField->update( [ 'id' => $fieldId, 'variable' => 'plugin_bbb_session_users_limit', 'changeable' => 1, 'visible_to_self' => 1, 'visible_to_others' => 0, ] ); Database::query( "CREATE TABLE IF NOT EXISTS plugin_bbb_meeting_format ( id int unsigned not null PRIMARY KEY AUTO_INCREMENT, meeting_id int unsigned not null, format_type varchar(255) not null, resource_url text not null );" ); // Copy icons into the main/img/icons folder $iconName = 'bigbluebutton'; $iconsList = [ '64/'.$iconName.'.png', '64/'.$iconName.'_na.png', '32/'.$iconName.'.png', '32/'.$iconName.'_na.png', '22/'.$iconName.'.png', '22/'.$iconName.'_na.png', ]; $sourceDir = api_get_path(SYS_PLUGIN_PATH).'bbb/resources/img/'; $destinationDir = api_get_path(SYS_CODE_PATH).'img/icons/'; foreach ($iconsList as $icon) { $src = $sourceDir.$icon; $dest = $destinationDir.$icon; copy($src, $dest); } // Installing course settings $this->install_course_fields_in_all_courses(true); } /** * Uninstall */ public function uninstall() { $t_settings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); $t_options = Database::get_main_table(TABLE_MAIN_SETTINGS_OPTIONS); $t_tool = Database::get_course_table(TABLE_TOOL_LIST); $variables = [ 'bbb_salt', 'bbb_host', 'bbb_tool_enable', 'enable_global_conference', 'enable_global_conference_per_user', 'enable_global_conference_link', 'disable_download_conference_link', 'enable_conference_in_course_groups', 'bbb_plugin', 'bbb_plugin_host', 'bbb_plugin_salt', 'max_users_limit', 'global_conference_allow_roles' ]; $urlId = api_get_current_access_url_id(); foreach ($variables as $variable) { $sql = "DELETE FROM $t_settings WHERE variable = '$variable' AND access_url = $urlId"; Database::query($sql); } $em = Database::getManager(); $sm = $em->getConnection()->getSchemaManager(); if ($sm->tablesExist('plugin_bbb_meeting')) { Database::query("DELETE FROM plugin_bbb_meeting WHERE access_url = $urlId"); } // Only delete tables if it's uninstalled from main url. if (1 == $urlId) { $extraField = new ExtraField('course'); $extraFieldInfo = $extraField->get_handler_field_info_by_field_variable( 'plugin_bbb_course_users_limit' ); if (!empty($extraFieldInfo)) { $extraField->delete($extraFieldInfo['id']); } $extraField = new ExtraField('session'); $extraFieldInfo = $extraField->get_handler_field_info_by_field_variable( 'plugin_bbb_session_users_limit' ); if (!empty($extraFieldInfo)) { $extraField->delete($extraFieldInfo['id']); } $sql = "DELETE FROM $t_options WHERE variable = 'bbb_plugin'"; Database::query($sql); // hack to get rid of Database::query warning (please add c_id...) $sql = "DELETE FROM $t_tool WHERE name = 'bbb' AND c_id != 0"; Database::query($sql); if ($sm->tablesExist('plugin_bbb_meeting_format')) { Database::query('DROP TABLE IF EXISTS plugin_bbb_meeting_format'); } if ($sm->tablesExist('plugin_bbb_room')) { Database::query('DROP TABLE IF EXISTS plugin_bbb_room'); } if ($sm->tablesExist('plugin_bbb_meeting')) { Database::query('DROP TABLE IF EXISTS plugin_bbb_meeting'); } // Deleting course settings $this->uninstall_course_fields_in_all_courses($this->course_settings); // Remove icons from the main/img/icons folder $iconName = 'bigbluebutton'; $iconsList = [ '64/'.$iconName.'.png', '64/'.$iconName.'_na.png', '32/'.$iconName.'.png', '32/'.$iconName.'_na.png', '22/'.$iconName.'.png', '22/'.$iconName.'_na.png', ]; $destinationDir = api_get_path(SYS_CODE_PATH).'img/icons/'; foreach ($iconsList as $icon) { $dest = $destinationDir.$icon; if (is_file($dest)) { @unlink($dest); } } } } /** * Update */ public function update() { $sql = "SHOW COLUMNS FROM plugin_bbb_room WHERE Field = 'close'"; $res = Database::query($sql); if (Database::num_rows($res) === 0) { $sql = "ALTER TABLE plugin_bbb_room ADD close int unsigned NULL"; $res = Database::query($sql); if (!$res) { echo Display::return_message($this->get_lang('ErrorUpdateFieldDB'), 'warning'); } Database::update( 'plugin_bbb_room', ['close' => BBBPlugin::ROOM_CLOSE] ); } } /** * Set the course setting in all courses * * @param bool $variable Course setting to update * @param bool $value New values of the course setting */ public function update_course_field_in_all_courses($variable, $value) { // Update existing courses to add the new course setting value $table = Database::get_main_table(TABLE_MAIN_COURSE); $sql = "SELECT id FROM $table ORDER BY id"; $res = Database::query($sql); $courseSettingTable = Database::get_course_table(TABLE_COURSE_SETTING); while ($row = Database::fetch_assoc($res)) { Database::update( $courseSettingTable, ['value' => $value], ['variable = ? AND c_id = ?' => [$variable, $row['id']]] ); } } }