<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace mod_bigbluebuttonbn\output;
use html_table;
use html_writer;
use mod_bigbluebuttonbn\instance;
use mod_bigbluebuttonbn\meeting;
use mod_bigbluebuttonbn\plugin;
use renderable;
use renderer_base;
use stdClass;
/**
* Renderer for the Index page.
*
* @package mod_bigbluebuttonbn
* @copyright 2010 onwards, Blindside Networks Inc
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class index implements renderable {
/** @var stdClass */
protected $course;
/** @var stdClass[] */
protected $instances;
/**
* Constructor for the index renderable.
*
* @param stdClass $course
* @param instance[] List of bbbbn instances
*/
public function __construct(stdClass $course, array $instances) {
$this->course = $course;
$this->instances = $instances;
}
/**
* Get the table for the index page.
*
* @param renderer_base $output
* @return html_table
*/
public function get_table(renderer_base $output): html_table {
// Print the list of instances.
$table = new html_table();
if (course_format_uses_sections($this->course->format)) {
$sectionheading = get_string('sectionname', "format_{$this->course->format}");
} else {
$sectionheading = '';
}
$table->head = [
$sectionheading,
get_string('index_heading_name', plugin::COMPONENT),
get_string('index_heading_group', plugin::COMPONENT),
get_string('index_heading_users', plugin::COMPONENT),
get_string('index_heading_viewer', plugin::COMPONENT),
get_string('index_heading_moderator', plugin::COMPONENT),
get_string('index_heading_recording', plugin::COMPONENT),
get_string('index_heading_actions', plugin::COMPONENT),
];
$table->align = ['center', 'left', 'center', 'center', 'center', 'center', 'center'];
foreach ($this->instances as $instance) {
$this->add_instance_to_table($output, $table, $instance);
}
return $table;
}
/**
* Add details of the bigbluebuttonbn instance to the table.
*
* @param renderer_base $output
* @param html_table $table
* @param instance $instance
*/
protected function add_instance_to_table(renderer_base $output, html_table $table, instance $instance): void {
$cm = $instance->get_cm();
if (!$cm->uservisible) {
return;
}
if (groups_get_activity_groupmode($cm) == 0) {
$table->data[] = $this->add_room_row_to_table($output, $instance);
} else {
// Add 'All participants' room information.
$table->data[] = $this->add_room_row_to_table($output, $instance, 0);
// Add data for the groups belonging to the bbb instance, if any.
$groups = groups_get_activity_allowed_groups($cm);
foreach ($groups as $group) {
$table->data[] = $this->add_room_row_to_table($output, $instance, $group->id);
}
}
}
/**
* Displays the general view.
*
* @param renderer_base $output
* @param instance $instance
* @param int|null $group
* @return array
*/
protected function add_room_row_to_table(renderer_base $output, instance $instance, ?int $group = null): array {
if ($group) {
$instance = instance::get_group_instance_from_instance($instance, $group);
}
$meeting = new meeting($instance);
if (course_format_uses_sections($this->course->format)) {
$sectionname = get_section_name($this->course, $instance->get_cm()->sectionnum);
} else {
$sectionname = '';
}
$viewurl = $instance->get_view_url();
if ($groupid = $instance->get_group_id()) {
$viewurl->param('group', $groupid);
}
$joinurl = html_writer::link($viewurl, format_string($instance->get_meeting_name()));
// The meeting info was returned.
if ($meeting->is_running()) {
return [
$sectionname,
$joinurl,
$instance->get_group_name(),
$this->get_room_usercount($meeting),
$this->get_room_attendee_list($meeting, 'VIEWER'),
$this->get_room_attendee_list($meeting, 'MODERATOR'),
$this->get_room_record_info($output, $instance),
$this->get_room_actions($output, $instance, $meeting),
];
}
return [$sectionname, $joinurl, $instance->get_group_name(), '', '', '', '', ''];
}
/**
* Count the number of users in the meeting.
*
* @param meeting $meeting
* @return int
*/
protected function get_room_usercount(meeting $meeting): int {
return count($meeting->get_attendees());
}
/**
* Returns attendee list.
*
* @param meeting $meeting
* @param string $role
* @return string
*/
protected function get_room_attendee_list(meeting $meeting, string $role): string {
$attendees = [];
> // Iterate attendees, matching by their "role" property.
foreach ($meeting->get_attendees() as $attendee) {
< if ((string) $attendee->role == $role) {
< $attendees[] = $attendee->fullName;
> if (strcmp((string) $attendee['role'], $role) === 0) {
> $attendees[] = $attendee['fullName'];
}
}
return implode(', ', $attendees);
}
/**
* Returns indication of recording enabled.
*
* @param renderer_base $output
* @param instance $instance
* @return string
*/
protected function get_room_record_info(renderer_base $output, instance $instance): string {
if ($instance->is_recorded()) {
// If it has been set when meeting created, set the variable on/off.
return get_string('index_enabled', 'bigbluebuttonbn');
}
return '';
}
/**
* Returns room actions.
*
* @param renderer_base $output
* @param instance $instance
* @param meeting $meeting
* @return string
*/
protected function get_room_actions(renderer_base $output, instance $instance, meeting $meeting): string {
if ($instance->is_moderator()) {
return $output->render_from_template('mod_bigbluebuttonbn/end_session_button', (object) [
'bigbluebuttonbnid' => $instance->get_instance_id(),
'groupid' => $instance->get_group_id(),
'statusrunning' => $meeting->is_running(),
]);
}
return '';
}
}