diff --git a/main/img/icons/22/om_integration.png b/main/img/icons/22/om_integration.png new file mode 100644 index 0000000000..f941effceb Binary files /dev/null and b/main/img/icons/22/om_integration.png differ diff --git a/main/img/icons/64/openmeetings.png b/main/img/icons/64/openmeetings.png new file mode 100644 index 0000000000..b746bd6105 Binary files /dev/null and b/main/img/icons/64/openmeetings.png differ diff --git a/main/img/icons/64/openmeetings_na.png b/main/img/icons/64/openmeetings_na.png new file mode 100644 index 0000000000..5b6c0a0427 Binary files /dev/null and b/main/img/icons/64/openmeetings_na.png differ diff --git a/plugin/openmeetings/config.php b/plugin/openmeetings/config.php new file mode 100644 index 0000000000..957d9ed380 --- /dev/null +++ b/plugin/openmeetings/config.php @@ -0,0 +1,13 @@ +install(); \ No newline at end of file diff --git a/plugin/openmeetings/lang/english.php b/plugin/openmeetings/lang/english.php new file mode 100644 index 0000000000..930f54e77f --- /dev/null +++ b/plugin/openmeetings/lang/english.php @@ -0,0 +1,54 @@ + + */ + +//Needed in order to show the plugin title +$strings['plugin_title'] = "OpenMeetings"; +$strings['plugin_comment'] = "Add a videoconference room in a Chamilo course using OpenMeetings"; + +$strings['Videoconference'] = "Videoconference"; +$strings['MeetingOpened'] = "Meeting opened"; +$strings['MeetingClosed'] = "Meeting closed"; +$strings['MeetingClosedComment'] = "If you have asked for your sessions to be recorded, the recording will be available in the list below when it has been completely generated."; +$strings['CloseMeeting'] = "Close meeting"; + +$strings['VideoConferenceXCourseX'] = "Videoconference #%s course %s"; +$strings['VideoConferenceAddedToTheCalendar'] = "Videoconference added to the calendar"; +$strings['VideoConferenceAddedToTheLinkTool'] = "Videoconference added to the link tool"; + +$strings['GoToTheVideoConference'] = "Go to the videoconference"; + +$strings['Records'] = "Recording"; +$strings['Meeting'] = "Meeting"; + +$strings['ViewRecord'] = "View recording"; +$strings['CopyToLinkTool'] = "Copy to link tool"; + +$strings['EnterConference'] = "Enter the videoconference"; +$strings['RecordList'] = "Recording list"; +$strings['ServerIsNotRunning'] = "Videoconference server is not running"; +$strings['ServerIsNotConfigured'] = "Videoconference server is not configured"; + +$strings['XUsersOnLine'] = "%s user(s) online"; + +$strings['host'] = 'OpenMeetings host'; +$strings['host_help'] = 'This is the full address of your OpenMeeetings server interface. Might be http://localhost:5080/openmeetings, an IP address (e.g. http://192.168.13.54:5080/openmeetings) or a domain name (e.g. http://my.video.com:5080/openmeetings).'; + +$strings['salt'] = 'OpenMeetings salt'; +$strings['salt_help'] = 'This is the security key of your OpenMeetings server, which will allow your server to authentify the Chamilo installation. Refer to the OpenMeetings documentation to locate it.'; + +$strings['tool_enable'] = 'OpenMeetings videoconference tool enabled'; +$strings['tool_enable_help'] = 'Choose whether you want to enable the OpenMeetings videoconference tool. Once enabled, it will show as an additional course tool in all courses homepage, and teachers will be able to launch a conference at any time. Students will not be able to launch a conference, only join one. If you don\'t have an OpenMeetings server, please set one up or ask the Chamilo official providers for a quote. OpenMeetings is a free (as in freedom *and* beer), but its installation requires a set of technical skills that might not be immediately available to all. You can install it on your own or seek professional help to assist you or do it for you. This help, however, will generate a certain cost. In the pure logic of the free software, we offer you the tools to make your work easier and recommend professionals (the Chamilo Official Providers) that will be able to help you if this were too difficult.
'; + +$strings['openmeetings_welcome_message'] = 'Welcome message'; +$strings['openmeetings_record_and_store'] = 'Record and store sessions'; + +$strings['plugin_tool_openmeetings'] = 'Video'; + +$strings['ThereAreNotRecordingsForTheMeetings'] = 'There are not recording for the meeting sessions'; +$strings['NoRecording'] = 'No recording'; + diff --git a/plugin/openmeetings/lang/french.php b/plugin/openmeetings/lang/french.php new file mode 100644 index 0000000000..8d2708dd46 --- /dev/null +++ b/plugin/openmeetings/lang/french.php @@ -0,0 +1,47 @@ +en installer un avant de poursuivre, ou demander un devis à l'un des fournisseurs officiels de Chamilo. OpenMeetings est un outil de logiciel libre (et gratuit), mais son installation pourrait présenter une certaine complexité et demander des compétences qui ne sont peut-être pas à la portée de tous. Vous pouvez l'installer vous-même à partir de la documentation (disponible publiquement) de OpenMeetings, ou recherchez un soutien professionnel. Ce soutien pourrait générer certains coûts (au moins le temps de la personne qui vous assiste dans l'opération). Dans le plus pur esprit du logiciel libre, nous vous fournissons les outils pour simplifier votre travail dans la mesure de nos possibilités, et nous vous recommandons des professionnels (les fournisseurs officiels de Chamilo) pour vous venir en aide au cas où ceux-ci seraient insuffisants.
"; + +$strings['openmeetings_welcome_message'] = 'Message de bienvenue de OpenMeetings'; +$strings['openmeetings_record_and_store'] = 'Enregistrer les sessions de vidéoconférence'; + +$strings['plugin_tool_openmeetings'] = 'Vidéo'; + +$strings['ThereAreNotRecordingsForTheMeetings'] = 'Aucun enregistrement disponible'; +$strings['NoRecording'] = "Pas d'enregistrement"; + diff --git a/plugin/openmeetings/lang/spanish.php b/plugin/openmeetings/lang/spanish.php new file mode 100644 index 0000000000..7692aa729f --- /dev/null +++ b/plugin/openmeetings/lang/spanish.php @@ -0,0 +1,50 @@ +configure uno antes de seguir, o pida una cotización a uno de los proveedores oficiales de Chamilo. OpenMeetings es una herramienta de software libre (y gratuita), pero su instalación requiere de competencias que quizás no sean inmediatamente disponibles para todos. Puede instalarla usted mismo o buscar ayuda profesional. Esta ayuda podría no obstante generar algunos costos (por lo menos el tiempo de la persona quien lo ayude). En el puro espíritu del software libre, le ofrecemos las herramientas para hacer su trabajo más simple, en la medida de nuestras posibilidades, y le recomendamos profesionales (los proveedores oficiales de Chamilo) para ayudarlo en caso esto fuera demasiado complicado.
'; + +$strings['openmeetings_welcome_message'] = 'Mensaje de bienvenida de '; +$strings['openmeetings_record_and_store'] = 'Grabar las sesiones de videoconferencia'; + +$strings['plugin_tool_openmeetings'] = 'Video'; + +$strings['ThereAreNotRecordingsForTheMeetings'] = 'No hay grabaciones de sesiones de videoconferencia'; +$strings['NoRecording'] = 'No hay grabación'; + diff --git a/plugin/openmeetings/lib/openmeetings.class.php b/plugin/openmeetings/lib/openmeetings.class.php new file mode 100644 index 0000000000..6b7d741bb7 --- /dev/null +++ b/plugin/openmeetings/lib/openmeetings.class.php @@ -0,0 +1,546 @@ +get('tool_enable'); + $om_host = $plugin->get('host'); + $om_user = $plugin->get('user'); + $om_pass = $plugin->get('pass'); + global $_configuration; + $accessUrl = api_get_access_url($_configuration['access_url']); + $this->externalType = substr($accessUrl['url'],strpos($accessUrl['url'],'://')+3,-1); + if (strcmp($this->externalType,'localhost') == 0) { + $this->externalType = substr(api_get_path(WEB_PATH),strpos(api_get_path(WEB_PATH),'://')+3,-1); + } + $this->externalType = 'chamilolms.'.$this->externalType; + + $this->table = \Database::get_main_table('plugin_openmeetings'); + + if ($om_plugin) { + $user_info = api_get_user_info(); + $this->user_complete_name = $user_info['complete_name']; + $this->user = $om_user; + $this->pass = $om_pass; + $this->url = $om_host; + + // Setting OM api + define('CONFIG_OPENMEETINGS_USER', $this->user); + define('CONFIG_OPENMEETINGS_PASS', $this->pass); + define('CONFIG_OPENMEETINGS_SERVER_URL', $this->url); + + $this->gateway = new \OpenMeetingsGateway($this->url, $this->user, $this->pass); + $this->plugin_enabled = $om_plugin; + // The room has a name composed of C + course ID + '-' + session ID + $this->chamiloCourseId = api_get_course_int_id(); + $this->chamiloSessionId = api_get_session_id(); + $this->roomName = 'C'.$this->chamiloCourseId.'-'.$this->chamiloSessionId; + $return = $this->gateway->loginUser(); + if ($return == 0) { + $msg = 'Could not initiate session with server through OpenMeetingsGateway::loginUser()'; + error_log(__FILE__.'+'.__LINE__.': '.$msg); + die($msg); + } + $this->sessionId = $this->gateway->sessionId; + } + } + /** + * Checks whether a user is teacher in the current course + * @return bool True if the user can be considered a teacher in this course, false otherwise + */ + function isTeacher() + { + return api_is_course_admin() || api_is_coach() || api_is_platform_admin(); + } + /** + * Login the user with OM Server. This generates a session ID that is + * specific to the current user, but that does not require specific user data + * + * It is similar to opening a PHP session. In fact, the session ID is kept + * inside the $_SESSION['openmeetings_session'] session variable + * @return bool True if the user is correct and false when is incorrect + * @deprecated loginUser now called at object instanciation + */ + /** + function loginUser() + { + try { + //Verifying if there is already an active session + if (empty($_SESSION['openmeetings_session'])) { + // Login user returns either 0 or >0, depending on the results + // Technically, as long as the SOAP user has been configured in OpenMeetings and OpenMeetings is on, this should always succeed. + if ($this->gateway->loginUser()) { + $this->sessionId = $_SESSION['openmeetings_session'] = $this->gateway->session_id; + return true; + } else { + error_log('loginUser did not succeed'); + return false; + } + } else { + $this->sessionId = $_SESSION['openmeetings_session']; + return true; + } + } catch (SoapFault $e) { + error_log(__FILE__.'+'.__LINE__.' Warning: We have detected some problems. Fault: '.$e->faultstring); + return false; + } + } + */ + /* + * Creating a Room for the meeting + * @return bool True if the user is correct and false when is incorrect + */ + function createMeeting($params) + { + //$id = \Database::insert($this->table, $params); + // First, try to see if there is an active room for this course and session + $roomId = null; + $meetingData = \Database::select('*', $this->table, array('where' => array('c_id = ?' => $this->chamiloCourseId, ' AND session_id = ? ' => $this->chamiloSessionId)), 'first'); + if ($meetingData != false && count($meetingData) > 0) { + //error_log(print_r($meetingData,1)); + //error_log('Found previous room reference - reusing'); + // There has been a room in the past for this course. It should + // still be on the server, so update (instead of creating a new one) + // This fills the following attributes: status, name, comment, chamiloCourseId, chamiloSessionId + $room = new Room(); + $room->loadRoomId($meetingData['room_id']); + $roomArray = (array)$room; + $roomArray['SID'] = $this->sessionId; + $roomId = $this->gateway->updateRoomWithModeration($room); + if ($roomId != $meetingData['room_id']) { + $msg = 'Something went wrong: the updated room ID ('.$roomId.') is not the same as the one we had ('.$meetingData['room_id'].')'; + error_log($msg); + die($msg); + } + + } else { + //error_log('Found no previous room - creating'); + $room = new Room(); + $room->SID = $this->sessionId; + $room->name = $this->roomName; + $room->roomtypes_id = $room->roomtypes_id; + $room->comment = urlencode(get_lang('Course').': ' . $params['meeting_name'] . ' Plugin for Chamilo'); + $room->numberOfPartizipants = $room->numberOfPartizipants; + $room->ispublic = $room->getString('isPublic'); + $room->appointment = $room->getString('appointment'); + $room->isDemoRoom = $room->getString('isDemoRoom'); + $room->demoTime = $room->demoTime; + $room->isModeratedRoom = $room->getString('isModeratedRoom'); + $roomId = $this->gateway->createRoomWithModAndType($room); + } + + if (!empty($roomId)) { + /* + // Find the biggest room_id so far, and create a new one + if (empty($roomId)) { + $roomData = \Database::select('MAX(room_id) as room_id', $this->table, array(), 'first'); + $roomId = $roomData['room_id'] + 1; + }*/ + + $params['status'] = '1'; + $params['meeting_name'] = $room->name; + $params['created_at'] = api_get_utc_datetime(); + $params['room_id'] = $roomId; + $params['c_id'] = api_get_course_int_id(); + $params['session_id'] = api_get_session_id(); + + $id = \Database::insert($this->table, $params); + + $this->joinMeeting($id); + } else { + return -1; + } + } + /** + * Returns a meeting "join" URL + * @param string The name of the meeting (usually the course code) + * @return mixed The URL to join the meeting, or false on error + * @todo implement moderator pass + * @assert ('') === false + * @assert ('abcdefghijklmnopqrstuvwxyzabcdefghijklmno') === false + */ + function joinMeeting($meetingId) + { + if (empty($meetingId)) { + return false; + } + $meetingData = \Database::select('*', $this->table, array('where' => array('id = ? AND status = 1 ' => $meetingId)), 'first'); + + if (empty($meetingData)) { + if ($this->debug) error_log("meeting does not exist: $meetingId "); + return false; + } + $params = array( 'room_id' => $meetingData['room_id'] ); + + $returnVal = $this->setUserObjectAndGenerateRoomHashByURLAndRecFlag( $params ); + //$urlWithoutProtocol = str_replace("http://", CONFIG_OPENMEETINGS_SERVER_URL); + //$imgWithoutProtocol = str_replace("http://", $_SESSION['_user']['avatar'] ); + + $iframe = $this->url . "/?" . + "secureHash=" . $returnVal; + + printf("