diff --git a/plugin/bbb/lib/bbb.lib.php b/plugin/bbb/lib/bbb.lib.php index e29f85255e..227bd2c513 100755 --- a/plugin/bbb/lib/bbb.lib.php +++ b/plugin/bbb/lib/bbb.lib.php @@ -398,9 +398,9 @@ class bbb api_get_session_id() ); - $meetingName = isset($params['meeting_name']) ? $params['meeting_name'] : $this->getCurrentVideoConferenceName(); - $welcomeMessage = isset($params['welcome_msg']) ? $params['welcome_msg'] : null; - $record = isset($params['record']) && $params['record'] ? 'true' : 'false'; + $meetingName = $params['meeting_name'] ?? $this->generateVideoConferenceName(); + $welcomeMessage = $params['welcome_msg'] ?? null; + $record = $params['record'] ? 'true' : 'false'; //$duration = isset($params['duration']) ? intval($params['duration']) : 0; // This setting currently limits the maximum conference duration, // to avoid lingering sessions on the video-conference server #6261 @@ -499,23 +499,109 @@ class bbb } /** - * @return string + * Get the info from the current open videoconference. + * Otherwise, return false. + * + * @return array|bool */ - public function getCurrentVideoConferenceName() + public function getCurrentVideoConference() { + $whereConditions = [ + 'status = ?' => 1, + ]; + if ($this->isGlobalConferencePerUserEnabled()) { - return 'url_'.$this->userId.'_'.api_get_current_access_url_id(); + $whereConditions[' AND user_id = ?'] = $this->userId; } if ($this->isGlobalConference()) { - return 'url_'.api_get_current_access_url_id(); + $whereConditions[' AND access_url = ?'] = api_get_current_access_url_id(); } if ($this->hasGroupSupport()) { - return api_get_course_id().'-'.api_get_session_id().'-'.api_get_group_id(); + $whereConditions[' AND group_id = ?'] = api_get_group_id(); + } + + $cId = api_get_course_int_id(); + $sessionId = api_get_session_id(); + + if ($cId) { + $whereConditions[' AND c_id = ?'] = api_get_course_int_id(); + } + + if ($sessionId) { + $whereConditions[' AND session_id = ?'] = api_get_session_id(); } - return api_get_course_id().'-'.api_get_session_id(); + return Database::select( + '*', + $this->table, + [ + 'where' => $whereConditions, + 'order' => 'created_at DESC', + ], + 'first' + ); + } + + public function generateVideoConferenceName(string $defaultName = null): string + { + $nameFilter = function ($name) { + return URLify::filter( + $name, + 64, + '', + true, + true, + true, + false + ); + }; + + if (!empty($defaultName)) { + $name = $nameFilter($defaultName); + + if (!empty($name)) { + return $name; + } + } + + $urlId = api_get_current_access_url_id(); + + if ($this->isGlobalConferencePerUserEnabled()) { + return $nameFilter("url_{$this->userId}_$urlId"); + } + + if ($this->isGlobalConference()) { + return $nameFilter("url_$urlId"); + } + + $course = api_get_course_entity(); + $session = api_get_session_entity(); + $group = api_get_group_entity(); + + if ($this->hasGroupSupport()) { + $name = implode( + '-', + [ + $course->getCode(), + $session ? $session->getName() : '', + $group ? $group->getName() : '', + ] + ); + + return $nameFilter($name); + } + + $name = implode( + '-', + [ + $course->getCode(), + $session ? $session->getName() : '', + ] + ); + + return $nameFilter($name); } /** @@ -990,6 +1076,7 @@ class bbb $newMeetingList = array(); foreach ($meetingList as $meetingDB) { $item = array(); + $item['metting_name'] = $meetingDB['meeting_name']; $courseId = $meetingDB['c_id']; $courseInfo = api_get_course_info_by_id($courseId); $courseCode = ''; diff --git a/plugin/bbb/listing.php b/plugin/bbb/listing.php index fa7c7471c8..3fc5b95a6b 100755 --- a/plugin/bbb/listing.php +++ b/plugin/bbb/listing.php @@ -396,7 +396,10 @@ if (!empty($meetings)) { $usersOnline = $bbb->getUsersOnlineInCurrentRoom(); $maxUsers = $bbb->getMaxUsersLimit(); $status = $bbb->isServerRunning(); -$videoConferenceName = $bbb->getCurrentVideoConferenceName(); +$currentOpenConference = $bbb->getCurrentVideoConference(); +$videoConferenceName = $currentOpenConference + ? $currentOpenConference['meeting_name'] + : $bbb->generateVideoConferenceName(); $meetingExists = $bbb->meetingExists($videoConferenceName); $showJoinButton = false; @@ -468,13 +471,40 @@ if ($bbb->isGlobalConference() === false && } } -// Default URL -$urlList[] = Display::url( - $plugin->get_lang('EnterConference'), - $conferenceUrl, - ['target' => '_blank', 'class' => 'btn btn-primary btn-large'] +$frmEnterConference = new FormValidator( + 'enter_conference', + 'get', + api_get_path(WEB_PLUGIN_PATH).'bbb/start.php', + '_blank' +); +$frmEnterConference->addText('name', get_lang('Name')); +$frmEnterConference->applyFilter('name', 'trim'); +$frmEnterConference->addButtonNext($plugin->get_lang('EnterConference')); + +$conferenceUrlQueryParams = []; + +parse_str( + parse_url($conferenceUrl, PHP_URL_QUERY), + $conferenceUrlQueryParams ); +foreach ($conferenceUrlQueryParams as $key => $value) { + $frmEnterConference->addHidden($key, $value); +} + +if ($meetingExists) { + $meetingInfo = $bbb->getMeetingByName($videoConferenceName); + + if (1 === (int) $meetingInfo['status']) { + $frmEnterConference->freeze(['name']); + } +} + +$frmEnterConference->setDefaults(['name' => $videoConferenceName]); + +// Default URL +$enterConferenceLink = $frmEnterConference->returnForm(); + $tpl = new Template($tool_name); $tpl->assign('allow_to_edit', $allowToEdit); @@ -487,7 +517,7 @@ $tpl->assign('bbb_status', $status); $tpl->assign('show_join_button', $showJoinButton); $tpl->assign('message', $message); $tpl->assign('form', $formToString); -$tpl->assign('enter_conference_links', $urlList); +$tpl->assign('enter_conference_links', $enterConferenceLink); $tpl->assign('page_number', $pageNumber); $tpl->assign('page_id', $pageId); diff --git a/plugin/bbb/start.php b/plugin/bbb/start.php index d9272b469f..8cc970bff3 100755 --- a/plugin/bbb/start.php +++ b/plugin/bbb/start.php @@ -68,7 +68,7 @@ if ($bbb->pluginEnabled) { } $meetingParams = []; - $meetingParams['meeting_name'] = $bbb->getCurrentVideoConferenceName(); + $meetingParams['meeting_name'] = $bbb->generateVideoConferenceName($_GET['name'] ?? null); $url = null; if ($bbb->meetingExists($meetingParams['meeting_name'])) { $joinUrl = $bbb->joinMeeting($meetingParams['meeting_name']); diff --git a/plugin/bbb/view/listing.tpl b/plugin/bbb/view/listing.tpl index fb8fd16bed..4892885988 100644 --- a/plugin/bbb/view/listing.tpl +++ b/plugin/bbb/view/listing.tpl @@ -12,39 +12,40 @@
{% if bbb_status == true %} -
+
{{ form }} {% if show_join_button == true %} - {{ enter_conference_links.0 }} -
- {{ 'UrlMeetingToShare'| get_plugin_lang('BBBPlugin') }} -
-
-
- - + {{ enter_conference_links }} +
+ {{ 'UrlMeetingToShare'| get_plugin_lang('BBBPlugin') }} +
+
+
+ + +
-
-

+

{{ 'XUsersOnLine'| get_plugin_lang('BBBPlugin') | format(users_online) }} -

+

- {% if max_users_limit > 0 %} - {% if conference_manager == true %} -

{{ 'MaxXUsersWarning' | get_plugin_lang('BBBPlugin') | format(max_users_limit) }}

- {% elseif users_online >= max_users_limit/2 %} -

{{ 'MaxXUsersWarning' | get_plugin_lang('BBBPlugin') | format(max_users_limit) }}

+ {% if max_users_limit > 0 %} + {% if conference_manager == true %} +

{{ 'MaxXUsersWarning' | get_plugin_lang('BBBPlugin') | format(max_users_limit) }}

+ {% elseif users_online >= max_users_limit/2 %} +

{{ 'MaxXUsersWarning' | get_plugin_lang('BBBPlugin') | format(max_users_limit) }}

+ {% endif %} {% endif %} - {% endif %} +
{% elseif max_users_limit > 0 %} {% if conference_manager == true %} @@ -61,6 +62,7 @@
+ @@ -71,6 +73,7 @@ {% for meeting in meetings %} + {% if meeting.visibility == 0 %} {% else %}
{{ 'Name'|get_lang }} {{ 'CreatedAt'| get_plugin_lang('BBBPlugin') }} {{ 'Status'| get_lang }} {{ 'Records'| get_plugin_lang('BBBPlugin') }}
{{ meeting.metting_name }}{{ meeting.created_at }}