Completed
Push — master ( 43b232...a6a187 )
by Jesus
02:48
created

locallib.php ➔ bigbluebuttonbn_getRecordedMeetings()   C

Complexity

Conditions 10
Paths 4

Size

Total Lines 47
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 8
Bugs 2 Features 2
Metric Value
cc 10
eloc 27
c 8
b 2
f 2
nc 4
nop 2
dl 0
loc 47
rs 5.1578

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Internal library of functions for module BigBlueButtonBN.
4
 *
5
 * @package   mod
6
 * @subpackage bigbluebuttonbn
7
 * @author    Fred Dixon  (ffdixon [at] blindsidenetworks [dt] com)
8
 * @author    Jesus Federico  (jesus [at] blindsidenetworks [dt] com)
9
 * @copyright 2010-2015 Blindside Networks Inc.
10
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v2 or later
11
 */
12
13
defined('MOODLE_INTERNAL') || die;
14
15
global $BIGBLUEBUTTONBN_CFG, $CFG;
16
17
require_once(dirname(__FILE__).'/lib.php');
18
19
const BIGBLUEBUTTONBN_FORCED = true;
20
21
const BIGBLUEBUTTONBN_ROLE_VIEWER = 'viewer';
22
const BIGBLUEBUTTONBN_ROLE_MODERATOR = 'moderator';
23
const BIGBLUEBUTTONBN_METHOD_GET = 'GET';
24
const BIGBLUEBUTTONBN_METHOD_POST = 'POST';
25
26
const BIGBLUEBUTTON_EVENT_ACTIVITY_VIEWED = 'activity_viewed';
27
const BIGBLUEBUTTON_EVENT_MEETING_CREATED = 'meeting_created';
28
const BIGBLUEBUTTON_EVENT_MEETING_ENDED = 'meeting_ended';
29
const BIGBLUEBUTTON_EVENT_MEETING_JOINED = 'meeting_joined';
30
const BIGBLUEBUTTON_EVENT_MEETING_LEFT = "meeting_left";
31
const BIGBLUEBUTTON_EVENT_RECORDING_DELETED = 'recording_deleted';
32
const BIGBLUEBUTTON_EVENT_RECORDING_IMPORTED = 'recording_imported';
33
const BIGBLUEBUTTON_EVENT_RECORDING_PUBLISHED = 'recording_published';
34
const BIGBLUEBUTTON_EVENT_RECORDING_UNPUBLISHED = 'recording_unpublished';
35
36
function bigbluebuttonbn_logs(array $bbbsession, $event, array $overrides = [], $meta = NULL ) {
37
    global $DB;
38
39
    $log = new stdClass();
40
41
    $log->courseid = isset($overrides['courseid'])? $overrides['courseid']: $bbbsession['course']->id;
42
    $log->bigbluebuttonbnid = isset($overrides['bigbluebuttonbnid'])? $overrides['bigbluebuttonbnid']: $bbbsession['bigbluebuttonbn']->id;
43
    $log->userid = isset($overrides['userid'])? $overrides['userid']: $bbbsession['userID'];
44
    $log->meetingid = isset($overrides['meetingid'])? $overrides['meetingid']: $bbbsession['meetingid'];
45
    $log->timecreated = isset($overrides['timecreated'])? $overrides['timecreated']: time();
46
    $log->log = $event;
47
    if ( isset($meta) ) {
48
        $log->meta = $meta;
49
    } else if( $event == BIGBLUEBUTTONBN_LOG_EVENT_CREATE) {
50
        $log->meta = '{"record":'.($bbbsession['record']? 'true': 'false').'}';
51
    }
52
53
    $returnid = $DB->insert_record('bigbluebuttonbn_logs', $log);
0 ignored issues
show
Unused Code introduced by
$returnid is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
54
}
55
56
 ////////////////////////////
57
//  BigBlueButton API Calls  //
58
 ////////////////////////////
59
function bigbluebuttonbn_getJoinURL( $meetingID, $userName, $PW, $SALT, $URL, $logoutURL ) {
60
    $url_join = $URL."api/join?";
61
    $params = 'meetingID='.urlencode($meetingID).'&fullName='.urlencode($userName).'&password='.urlencode($PW).'&logoutURL='.urlencode($logoutURL);
62
    $url = $url_join.$params.'&checksum='.sha1("join".$params.$SALT);
63
    return $url;
64
}
65
66
function bigbluebuttonbn_getCreateMeetingURL($name, $meetingID, $attendeePW, $moderatorPW, $welcome, $logoutURL, $SALT, $URL, $record = 'false', $duration=0, $voiceBridge=0, $maxParticipants=0, $metadata=array() ) {
67
    $url_create = $URL."api/create?";
68
69
    $params = 'name='.urlencode($name).'&meetingID='.urlencode($meetingID).'&attendeePW='.urlencode($attendeePW).'&moderatorPW='.urlencode($moderatorPW).'&logoutURL='.urlencode($logoutURL).'&record='.$record;
70
71
    $voiceBridge = intval($voiceBridge);
72
    if ( $voiceBridge > 0 && $voiceBridge < 79999)
73
        $params .= '&voiceBridge='.$voiceBridge;
74
75
    $duration = intval($duration);
76
    if( $duration > 0 )
77
        $params .= '&duration='.$duration;
78
79
    $maxParticipants = intval($maxParticipants);
80
    if( $maxParticipants > 0 )
81
        $params .= '&maxParticipants='.$maxParticipants;
82
83
    if( trim( $welcome ) )
84
        $params .= '&welcome='.urlencode($welcome);
85
86
    foreach ($metadata as $key => $value) {
87
        $params .= '&'.$key.'='.urlencode($value);
88
    }
89
90
    $url = $url_create.$params.'&checksum='.sha1("create".$params.$SALT);
91
    return $url;
92
}
93
94
function bigbluebuttonbn_getIsMeetingRunningURL( $meetingID, $URL, $SALT ) {
95
    $base_url = $URL."api/isMeetingRunning?";
96
    $params = 'meetingID='.urlencode($meetingID);
97
    $url = $base_url.$params.'&checksum='.sha1("isMeetingRunning".$params.$SALT);
98
    return $url;
99
}
100
101 View Code Duplication
function bigbluebuttonbn_getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
102
    $base_url = $URL."api/getMeetingInfo?";
103
    $params = 'meetingID='.urlencode($meetingID).'&password='.urlencode($modPW);
104
    $url = $base_url.$params.'&checksum='.sha1("getMeetingInfo".$params.$SALT);
105
    return $url;
106
}
107
108
function bigbluebuttonbn_getMeetingsURL( $URL, $SALT ) {
109
    $base_url = $URL."api/getMeetings?";
110
    $url = $base_url.'&checksum='.sha1("getMeetings".$SALT);
111
    return $url;
112
}
113
114 View Code Duplication
function bigbluebuttonbn_getEndMeetingURL( $meetingID, $modPW, $URL, $SALT ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
115
    $base_url = $URL."api/end?";
116
    $params = 'meetingID='.urlencode($meetingID).'&password='.urlencode($modPW);
117
    $url = $base_url.$params.'&checksum='.sha1("end".$params.$SALT);
118
    return $url;
119
}
120
121
function bigbluebuttonbn_getRecordingsURL( $URL, $SALT, $meetingID=null ) {
122
    $base_url_record = $URL."api/getRecordings?";
123
    if( $meetingID == null ) {
124
        $params = "";
125
    } else {
126
        $params = "meetingID=".urlencode($meetingID);
127
    }
128
    $url = $base_url_record.$params."&checksum=".sha1("getRecordings".$params.$SALT);
129
    return $url;
130
}
131
132
function bigbluebuttonbn_getDeleteRecordingsURL( $recordID, $URL, $SALT ) {
133
    $url_delete = $URL."api/deleteRecordings?";
134
    $params = 'recordID='.urlencode($recordID);
135
    $url = $url_delete.$params.'&checksum='.sha1("deleteRecordings".$params.$SALT);
136
    return $url;
137
}
138
139
function bigbluebuttonbn_getPublishRecordingsURL( $recordID, $set, $URL, $SALT ) {
140
    $url_publish = $URL."api/publishRecordings?";
141
    $params = 'recordID='.$recordID."&publish=".$set;
142
    $url = $url_publish.$params.'&checksum='.sha1("publishRecordings".$params.$SALT);
143
    return $url;
144
}
145
146
function bigbluebuttonbn_getCreateMeetingArray( $username, $meetingID, $welcomeString, $mPW, $aPW, $SALT, $URL, $logoutURL, $record='false', $duration=0, $voiceBridge=0, $maxParticipants=0, $metadata=array(), $presentation_name=null, $presentation_url=null ) {
147
    $create_meeting_url = bigbluebuttonbn_getCreateMeetingURL($username, $meetingID, $aPW, $mPW, $welcomeString, $logoutURL, $SALT, $URL, $record, $duration, $voiceBridge, $maxParticipants, $metadata);
148
    if( !is_null($presentation_name) && !is_null($presentation_url) ) {
149
        $xml = bigbluebuttonbn_wrap_xml_load_file( $create_meeting_url,
150
                BIGBLUEBUTTONBN_METHOD_POST,
151
                "<?xml version='1.0' encoding='UTF-8'?><modules><module name='presentation'><document url='".$presentation_url."' /></module></modules>"
152
                );
153
    } else {
154
        $xml = bigbluebuttonbn_wrap_xml_load_file( $create_meeting_url );
155
    }
156
157
    if ( $xml ) {
158
        if ($xml->meetingID)
159
            return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey, 'meetingID' => $xml->meetingID, 'attendeePW' => $xml->attendeePW, 'moderatorPW' => $xml->moderatorPW, 'hasBeenForciblyEnded' => $xml->hasBeenForciblyEnded );
160
        else
161
            return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey );
162
    } else {
163
        return null;
164
    }
165
}
166
167
function bigbluebuttonbn_getMeetingsArray($meetingID, $URL, $SALT ) {
0 ignored issues
show
Unused Code introduced by
The parameter $meetingID is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
168
    $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getMeetingsURL($URL, $SALT) );
169
170
    if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey ) {    //The meetings were returned
171
        return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
172
173
    } else if($xml && $xml->returncode == 'SUCCESS'){                    //If there were meetings already created
174
        foreach ($xml->meetings->meeting as $meeting) {
175
            $meetings[] = array( 'meetingID' => $meeting->meetingID, 'moderatorPW' => $meeting->moderatorPW, 'attendeePW' => $meeting->attendeePW, 'hasBeenForciblyEnded' => $meeting->hasBeenForciblyEnded, 'running' => $meeting->running );
0 ignored issues
show
Coding Style Comprehensibility introduced by
$meetings was never initialized. Although not strictly required by PHP, it is generally a good practice to add $meetings = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
176
        }
177
        return $meetings;
0 ignored issues
show
Bug introduced by
The variable $meetings does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
178
179 View Code Duplication
    } else if( $xml ) { //If the xml packet returned failure it displays the message to the user
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
180
        return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
181
182
    } else { //If the server is unreachable, then prompts the user of the necessary action
183
        return null;
184
    }
185
}
186
187
function bigbluebuttonbn_getMeetingInfo( $meetingID, $modPW, $URL, $SALT ) {
188
    $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) );
189
    return $xml;
190
}
191
192
function bigbluebuttonbn_getMeetingInfoArray( $meetingID, $modPW, $URL, $SALT ) {
193
    $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getMeetingInfoURL( $meetingID, $modPW, $URL, $SALT ) );
194
195
    if( $xml && $xml->returncode == 'SUCCESS' && $xml->messageKey == null){//The meeting info was returned
196
        return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey );
197
198
    } else if($xml && $xml->returncode == 'SUCCESS'){ //If there were meetings already created
199
        return array('returncode' => $xml->returncode, 'meetingID' => $xml->meetingID, 'moderatorPW' => $xml->moderatorPW, 'attendeePW' => $xml->attendeePW, 'hasBeenForciblyEnded' => $xml->hasBeenForciblyEnded, 'running' => $xml->running, 'recording' => $xml->recording, 'startTime' => $xml->startTime, 'endTime' => $xml->endTime, 'participantCount' => $xml->participantCount, 'moderatorCount' => $xml->moderatorCount, 'attendees' => $xml->attendees, 'metadata' => $xml->metadata );
200
201 View Code Duplication
    } else if( ($xml && $xml->returncode == 'FAILED') || $xml) { //If the xml packet returned failure it displays the message to the user
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
202
        return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
203
204
    } else { //If the server is unreachable, then prompts the user of the necessary action
205
        return null;
206
    }
207
}
208
209
function bigbluebuttonbn_getRecordingsArray( $meetingIDs, $URL, $SALT ) {
210
    $recordings = array();
211
212
    if ( is_array($meetingIDs) ) {
213
        // getRecordings is executes using a method POST (supported only on BBB 1.0 and later)
214
        $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getRecordingsURL( $URL, $SALT ), BIGBLUEBUTTONBN_METHOD_POST, $meetingIDs );
215
    } else {
216
        // getRecordings is executes using a method GET supported by any version of BBB
217
        $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getRecordingsURL( $URL, $SALT, $meetingIDs ) );
218
    }
219
220
    if ( $xml && $xml->returncode == 'SUCCESS' && isset($xml->recordings) ) { //If there were meetings already created
221 View Code Duplication
        foreach ( $xml->recordings->recording as $recording ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
222
            $playbackArray = array();
223
            foreach ( $recording->playback->format as $format ) {
224
                $playbackArray[(string) $format->type] = array( 'type' => (string) $format->type, 'url' => (string) $format->url, 'length' => (string) $format->length );
225
            }
226
227
            //Add the metadata to the recordings array
228
            $metadataArray = array();
229
            $metadata = get_object_vars($recording->metadata);
230
            foreach ( $metadata as $key => $value ) {
231
                if ( is_object($value) ) $value = '';
232
                $metadataArray['meta_'.$key] = $value;
233
            }
234
235
            $recordings[] = 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, 'playbacks' => $playbackArray ) + $metadataArray;
236
        }
237
238
        usort($recordings, 'bigbluebuttonbn_recordingBuildSorter');
239
    }
240
241
    return $recordings;
242
}
243
244
function bigbluebuttonbn_index_recordings($recordings, $index_key='recordID') {
245
    $indexed_recordings = array();
246
247
    foreach ($recordings as $recording) {
248
        $indexed_recordings[$recording[$index_key]] = $recording;
249
    }
250
251
    return $indexed_recordings;
252
}
253
254
function bigbluebuttonbn_getRecordingArray( $recordingID, $meetingID, $URL, $SALT ) {
255
    $recording = array();
256
257
    $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getRecordingsURL( $URL, $SALT, $meetingID ) );
258
259
    if ( $xml && $xml->returncode == 'SUCCESS' && isset($xml->recordings) ) { //If there were meetings already created
260 View Code Duplication
        foreach ($xml->recordings->recording as $recording) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
261
            if( $recording->recordID == $recordingID ) {
262
                $playbackArray = array();
263
                foreach ( $recording->playback->format as $format ){
264
                    $playbackArray[(string) $format->type] = array( 'type' => (string) $format->type, 'url' => (string) $format->url );
265
                }
266
267
                //Add the metadata to the recordings array
268
                $metadataArray = array();
269
                $metadata = get_object_vars($recording->metadata);
270
                foreach ($metadata as $key => $value) {
271
                    if(is_object($value)) $value = '';
272
                    $metadataArray['meta_'.$key] = $value;
273
                }
274
275
                $recording = 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, 'playbacks' => $playbackArray ) + $metadataArray;
276
                break;
277
            }
278
        }
279
    }
280
281
    return $recording;
282
}
283
284
function bigbluebuttonbn_recordingBuildSorter($a, $b){
285
    if( $a['startTime'] < $b['startTime']) return -1;
286
    else if( $a['startTime'] == $b['startTime']) return 0;
287
    else return 1;
288
}
289
290 View Code Duplication
function bigbluebuttonbn_doDeleteRecordings( $recordIDs, $URL, $SALT ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
291
    $ids = 	explode(",", $recordIDs);
292
    foreach( $ids as $id){
293
        $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getDeleteRecordingsURL($id, $URL, $SALT) );
294
        if( $xml && $xml->returncode != 'SUCCESS' )
295
            return false;
296
    }
297
    return true;
298
}
299
300 View Code Duplication
function bigbluebuttonbn_doPublishRecordings( $recordIDs, $set, $URL, $SALT ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
301
    $ids = 	explode(",", $recordIDs);
302
    foreach( $ids as $id){
303
        $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getPublishRecordingsURL($id, $set, $URL, $SALT) );
304
        if( $xml && $xml->returncode != 'SUCCESS' )
305
            return false;
306
    }
307
    return true;
308
}
309
310
function bigbluebuttonbn_doEndMeeting( $meetingID, $modPW, $URL, $SALT ) {
311
    $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getEndMeetingURL( $meetingID, $modPW, $URL, $SALT ) );
312
313
    if( $xml ) { //If the xml packet returned failure it displays the message to the user
314
        return array('returncode' => $xml->returncode, 'message' => $xml->message, 'messageKey' => $xml->messageKey);
315
    }
316
    else { //If the server is unreachable, then prompts the user of the necessary action
317
        return null;
318
    }
319
}
320
321
function bigbluebuttonbn_isMeetingRunning( $meetingID, $URL, $SALT ) {
322
    $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getIsMeetingRunningURL( $meetingID, $URL, $SALT ) );
323
    if ( $xml && $xml->returncode == 'SUCCESS' ) {
324
        return ( ( $xml->running == 'true' ) ? true : false);
325
    } else {
326
        return ( false );
327
    }
328
}
329
330
331
function bigbluebuttonbn_getServerVersion( $URL ){
332
    $xml = bigbluebuttonbn_wrap_xml_load_file( $URL."api" );
333
    if ( $xml && $xml->returncode == 'SUCCESS' ) {
334
        return $xml->version;
335
    } else {
336
        return NULL;
337
    }
338
}
339
340
function bigbluebuttonbn_getMeetingXML( $meetingID, $URL, $SALT ) {
341
    $xml = bigbluebuttonbn_wrap_xml_load_file( bigbluebuttonbn_getIsMeetingRunningURL( $meetingID, $URL, $SALT ) );
342
    if ( $xml && $xml->returncode == 'SUCCESS') {
343
        return ( str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML())));
344
    } else {
345
        return 'false';
346
    }
347
}
348
349
function bigbluebuttonbn_wrap_xml_load_file($url, $method=BIGBLUEBUTTONBN_METHOD_GET, $data=null) {
350
    if ( bigbluebuttonbn_debugdisplay() ) error_log("Request to: ".$url);
351
352
    if (extension_loaded('curl')) {
353
        $c = new curl();
354
        $c->setopt( Array( "SSL_VERIFYPEER" => true));
355
        if( $method == BIGBLUEBUTTONBN_METHOD_POST ) {
356
            if( !is_null($data) ) {
357
                if( !is_array($data) ) {
358
                    $options['CURLOPT_HTTPHEADER'] = array(
0 ignored issues
show
Coding Style Comprehensibility introduced by
$options was never initialized. Although not strictly required by PHP, it is generally a good practice to add $options = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
359
                            'Content-Type: text/xml',
360
                            'Content-Length: '.strlen($data),
361
                            'Content-Language: en-US'
362
                        );
363
                    $response = $c->post($url, $data, $options);
364
365
                } else {
366
                    $response = $c->post($url, $data);
367
                }
368
369
            } else {
370
                $response = $c->post($url);
371
            }
372
373
        } else {
374
            $response = $c->get($url);
375
        }
376
377
        if ($response) {
378
            $previous = libxml_use_internal_errors(true);
379
            try {
380
                $xml = new SimpleXMLElement($response, LIBXML_NOCDATA);
381
                return $xml;
382
            } catch (Exception $e){
383
                libxml_use_internal_errors($previous);
384
                $error = 'Caught exception: '.$e->getMessage();
385
                error_log($error);
386
                return NULL;
387
            }
388
        } else {
389
            error_log("No response on wrap_simplexml_load_file");
390
            return NULL;
391
        }
392
393
    } else {
394
        $previous = libxml_use_internal_errors(true);
395
        try {
396
            $xml = simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA);
397
            return $xml;
398
        } catch  (Exception $e){
399
            libxml_use_internal_errors($previous);
400
            return NULL;
401
        }
402
    }
403
}
404
405
function bigbluebuttonbn_get_role_name($role_shortname){
406
    $role = bigbluebuttonbn_get_db_moodle_roles($role_shortname);
407
    if( $role != null && $role->name != "") {
408
        $role_name = $role->name;
409
    } else {
410
        switch ($role_shortname) {
411
            case 'manager':         $role_name = get_string('manager', 'role'); break;
412
            case 'coursecreator':   $role_name = get_string('coursecreators'); break;
413
            case 'editingteacher':  $role_name = get_string('defaultcourseteacher'); break;
414
            case 'teacher':         $role_name = get_string('noneditingteacher'); break;
415
            case 'student':         $role_name = get_string('defaultcoursestudent'); break;
416
            case 'guest':           $role_name = get_string('guest'); break;
417
            case 'user':            $role_name = get_string('authenticateduser'); break;
418
            case 'frontpage':       $role_name = get_string('frontpageuser', 'role'); break;
419
            // We should not get here, the role UI should require the name for custom roles!
420
            default:                $role_name = $role_shortname; break;
421
        }
422
    }
423
424
    return $role_name;
425
}
426
427
function bigbluebuttonbn_get_roles($rolename='all', $format='json'){
428
    $roles = bigbluebuttonbn_get_db_moodle_roles($rolename);
429
    $roles_array = array();
430
    foreach($roles as $role){
431
        if( $format=='json' ) {
432
            array_push($roles_array,
433
                    array( "id" => $role->shortname,
434
                        "name" => bigbluebuttonbn_get_role_name($role->shortname)
435
                    )
436
            );
437
        } else {
438
            $roles_array[$role->shortname] = bigbluebuttonbn_get_role_name($role->shortname);
439
        }
440
    }
441
    return $roles_array;
442
}
443
444
function bigbluebuttonbn_get_roles_json($rolename='all'){
445
    return json_encode(bigbluebuttonbn_get_roles($rolename));
446
}
447
448
function bigbluebuttonbn_get_users_json($users, $full=false) {
449
    if( $full ) {
450
        return json_encode($users);
451
    } else {
452
        $users_array = array();
453
        foreach($users as $user){
454
            array_push($users_array,
455
                    array( "id" => $user->id,
456
                            "name" => $user->firstname.' '.$user->lastname
457
                    )
458
            );
459
        }
460
        return json_encode($users_array);
461
    }
462
}
463
464
function bigbluebuttonbn_get_participant_list($bigbluebuttonbn=null, $context=null){
465
    global $CFG, $USER;
466
467
    $participant_list_array = array();
468
469
    if( $bigbluebuttonbn != null ) {
470
        $participant_list = json_decode($bigbluebuttonbn->participants);
471
        if (is_array($participant_list)) {
472
            foreach($participant_list as $participant){
473
                array_push($participant_list_array,
474
                        array(
475
                            "selectiontype" => $participant->selectiontype,
476
                            "selectionid" => $participant->selectionid,
477
                            "role" => $participant->role
478
                        )
479
                );
480
            }
481
        }
482
    } else {
483
        array_push($participant_list_array,
484
                array(
485
                    "selectiontype" => "all",
486
                    "selectionid" => "all",
487
                    "role" => BIGBLUEBUTTONBN_ROLE_VIEWER
488
                )
489
        );
490
491
        $moderator_defaults = bigbluebuttonbn_get_cfg_moderator_default();
492
        if ( !isset($moderator_defaults) ) {
493
            $moderator_defaults = array('owner');
494
        } else {
495
            $moderator_defaults = explode(',', $moderator_defaults);
496
        }
497
        foreach( $moderator_defaults as $moderator_default ) {
498
            if( $moderator_default == 'owner' ) {
499
                $users = bigbluebuttonbn_get_users($context);
500
                foreach( $users as $user ){
501
                    if( $user->id == $USER->id ){
502
                        array_push($participant_list_array,
503
                                array(
504
                                        "selectiontype" => "user",
505
                                        "selectionid" => $USER->id,
506
                                        "role" => BIGBLUEBUTTONBN_ROLE_MODERATOR
507
                                )
508
                        );
509
                        break;
510
                    }
511
                }
512
            } else {
513
                array_push($participant_list_array,
514
                        array(
515
                                "selectiontype" => "role",
516
                                "selectionid" => $moderator_default,
517
                                "role" => BIGBLUEBUTTONBN_ROLE_MODERATOR
518
                        )
519
                );
520
            }
521
        }
522
    }
523
524
    return $participant_list_array;
525
}
526
527
function bigbluebuttonbn_get_participant_list_json($bigbluebuttonbnid=null){
528
    return json_encode(bigbluebuttonbn_get_participant_list($bigbluebuttonbnid));
529
}
530
531
function bigbluebuttonbn_is_moderator($user, $roles, $participants) {
532
    $participant_list = json_decode($participants);
533
534
    if (is_array($participant_list)) {
535
        // Iterate looking for all configuration
536 View Code Duplication
        foreach($participant_list as $participant){
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
537
            if( $participant->selectiontype == 'all' ) {
538
                if ( $participant->role == BIGBLUEBUTTONBN_ROLE_MODERATOR )
539
                    return true;
540
            }
541
        }
542
543
        //Iterate looking for roles
544
        $db_moodle_roles = bigbluebuttonbn_get_db_moodle_roles();
545
        foreach($participant_list as $participant){
546
            if( $participant->selectiontype == 'role' ) {
547
                foreach( $roles as $role ) {
548
                    $db_moodle_role = bigbluebuttonbn_moodle_db_role_lookup($db_moodle_roles, $role->roleid);
549
                    if( $participant->selectionid == $db_moodle_role->shortname ) {
550
                        if ( $participant->role == BIGBLUEBUTTONBN_ROLE_MODERATOR )
551
                            return true;
552
                    }
553
                }
554
            }
555
        }
556
557
        //Iterate looking for users
558 View Code Duplication
        foreach($participant_list as $participant){
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
559
            if( $participant->selectiontype == 'user' ) {
560
                if( $participant->selectionid == $user ) {
561
                    if ( $participant->role == BIGBLUEBUTTONBN_ROLE_MODERATOR )
562
                        return true;
563
                }
564
            }
565
        }
566
    }
567
568
    return false;
569
}
570
571
function bigbluebuttonbn_moodle_db_role_lookup($db_moodle_roles, $role_id) {
572
    foreach( $db_moodle_roles as $db_moodle_role ){
573
        if( $role_id ==  $db_moodle_role->id ) {
574
            return $db_moodle_role;
575
        }
576
    }
577
}
578
579
function bigbluebuttonbn_get_error_key($messageKey, $defaultKey = null) {
580
    $key = $defaultKey;
581
    if ( $messageKey == "checksumError" ){
582
        $key = 'index_error_checksum';
583
    } else if ( $messageKey == 'maxConcurrent' ) {
584
        $key = 'view_error_max_concurrent';
585
    }
586
    return $key;
587
}
588
589
function bigbluebuttonbn_voicebridge_unique($voicebridge, $id=null) {
590
    global $DB;
591
592
    $is_unique = true;
593
    if( $voicebridge != 0 ) {
594
        $table = "bigbluebuttonbn";
595
        $select = "voicebridge = ".$voicebridge;
596
        if( $id ) $select .= " AND id <> ".$id;
597
        if ( $rooms = $DB->get_records_select($table, $select)  ) {
0 ignored issues
show
Unused Code introduced by
$rooms is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
598
            $is_unique = false;
599
        }
600
    }
601
602
    return $is_unique;
603
}
604
605
function bigbluebuttonbn_get_duration($openingtime, $closingtime) {
0 ignored issues
show
Unused Code introduced by
The parameter $openingtime is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
606
    global $CFG;
607
608
    $duration = 0;
609
    $now = time();
610
    if( $closingtime > 0 && $now < $closingtime ) {
611
        $duration = ceil(($closingtime - $now)/60);
612
        $compensation_time = intval(bigbluebuttonbn_get_cfg_scheduled_duration_compensation());
613
        $duration = intval($duration) + $compensation_time;
614
    }
615
616
    return $duration;
617
}
618
619
function bigbluebuttonbn_get_presentation_array($context, $presentation, $id=null) {
620
    $presentation_name = null;
621
    $presentation_url = null;
622
    $presentation_icon = null;
623
    $presentation_mimetype_description = null;
624
625
    if( !empty($presentation) ) {
626
        $fs = get_file_storage();
627
        $files = $fs->get_area_files($context->id, 'mod_bigbluebuttonbn', 'presentation', 0, 'itemid, filepath, filename', false);
628
        if (count($files) < 1) {
0 ignored issues
show
Unused Code introduced by
This if statement is empty and can be removed.

This check looks for the bodies of if statements that have no statements or where all statements have been commented out. This may be the result of changes for debugging or the code may simply be obsolete.

These if bodies can be removed. If you have an empty if but statements in the else branch, consider inverting the condition.

if (rand(1, 6) > 3) {
//print "Check failed";
} else {
    print "Check succeeded";
}

could be turned into

if (rand(1, 6) <= 3) {
    print "Check succeeded";
}

This is much more concise to read.

Loading history...
629
            //resource_print_filenotfound($resource, $cm, $course);
0 ignored issues
show
Unused Code Comprehensibility introduced by
73% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
630
            //die;
631
            //exit;
632
        } else {
633
            $file = reset($files);
634
            unset($files);
635
            $presentation_name = $file->get_filename();
636
            $presentation_icon = file_file_icon($file, 24);
637
            $presentation_mimetype_description = get_mimetype_description($file);
638
639
            if( !is_null($id) ) {
640
                //Create the nonce component for granting a temporary public access
641
                $cache = cache::make_from_params(cache_store::MODE_APPLICATION, 'mod_bigbluebuttonbn', 'presentation_cache');
642
                $presentation_nonce_key = sha1($id);
643
                $presentation_nonce_value = bigbluebuttonbn_generate_nonce();
644
                $cache->set($presentation_nonce_key, array( "value" => $presentation_nonce_value, "counter" => 0 ));
645
646
                //The item id was adapted for granting public access to the presentation once in order to allow BigBlueButton to gather the file
647
                $url = moodle_url::make_pluginfile_url($file->get_contextid(), $file->get_component(), $file->get_filearea(), $presentation_nonce_value, $file->get_filepath(), $file->get_filename());
648
            } else {
649
                $url = moodle_url::make_pluginfile_url($file->get_contextid(), $file->get_component(), $file->get_filearea(), null, $file->get_filepath(), $file->get_filename());
650
            }
651
            $presentation_url = $url->out(false);
652
        }
653
    }
654
655
    $presentation_array = array( "url" => $presentation_url, "name" => $presentation_name, "icon" => $presentation_icon, "mimetype_description" => $presentation_mimetype_description);
656
657
    return $presentation_array;
658
}
659
660
function bigbluebuttonbn_generate_nonce() {
661
662
    $mt = microtime();
663
    $rand = mt_rand();
664
665
    return md5($mt.$rand);
666
}
667
668
function bigbluebuttonbn_random_password( $length = 8 ) {
669
670
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?";
671
    $password = substr( str_shuffle( $chars ), 0, $length );
672
673
    return $password;
674
}
675
676
function bigbluebuttonbn_get_moodle_version_major() {
677
    global $CFG;
678
679
    $version_array = explode('.', $CFG->version);
680
    return $version_array[0];
681
}
682
683
function bigbluebuttonbn_event_log_standard($event_type, $bigbluebuttonbn, $context, $cm) {
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
684
    $context = context_module::instance($cm->id);
685
    $event_properties = array('context' => $context, 'objectid' => $bigbluebuttonbn->id);
686
687
    switch ($event_type) {
688
        case BIGBLUEBUTTON_EVENT_MEETING_JOINED:
689
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_meeting_joined::create($event_properties);
690
            break;
691
        case BIGBLUEBUTTON_EVENT_MEETING_CREATED:
692
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_meeting_created::create($event_properties);
693
            break;
694
        case BIGBLUEBUTTON_EVENT_MEETING_ENDED:
695
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_meeting_ended::create($event_properties);
696
            break;
697
        case BIGBLUEBUTTON_EVENT_MEETING_LEFT:
698
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_meeting_left::create($event_properties);
699
            break;
700
        case BIGBLUEBUTTON_EVENT_RECORDING_PUBLISHED:
701
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_recording_published::create($event_properties);
702
            break;
703
        case BIGBLUEBUTTON_EVENT_RECORDING_UNPUBLISHED:
704
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_recording_unpublished::create($event_properties);
705
            break;
706
        case BIGBLUEBUTTON_EVENT_RECORDING_DELETED:
707
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_recording_deleted::create($event_properties);
708
            break;
709
        case BIGBLUEBUTTON_EVENT_ACTIVITY_VIEWED:
710
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_activity_viewed::create($event_properties);
711
            break;
712
        case BIGBLUEBUTTON_EVENT_ACTIVITY_MANAGEMENT_VIEWED:
713
            $event = \mod_bigbluebuttonbn\event\bigbluebuttonbn_activity_management_viewed::create($event_properties);
714
            break;
715
    }
716
717
    $event->trigger();
0 ignored issues
show
Bug introduced by
The variable $event does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
718
}
719
720
function bigbluebuttonbn_event_log_legacy($event_type, $bigbluebuttonbn, $context, $cm) {
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
721
    global $DB;
722
723
    switch ($event_type) {
724
        case BIGBLUEBUTTON_EVENT_MEETING_JOINED:
725
            $event = 'join';
726
            break;
727
        case BIGBLUEBUTTON_EVENT_MEETING_CREATED:
728
            $event = 'create';
729
            break;
730
        case BIGBLUEBUTTON_EVENT_MEETING_ENDED:
731
            $event = 'end';
732
            break;
733
        case BIGBLUEBUTTON_EVENT_MEETING_LEFT:
734
            $event = 'left';
735
            break;
736
        case BIGBLUEBUTTON_EVENT_RECORDING_PUBLISHED:
737
            $event = 'publish';
738
            break;
739
        case BIGBLUEBUTTON_EVENT_RECORDING_UNPUBLISHED:
740
            $event = 'unpublish';
741
            break;
742
        case BIGBLUEBUTTON_EVENT_RECORDING_DELETED:
743
            $event = 'delete';
744
            break;
745
        case BIGBLUEBUTTON_EVENT_ACTIVITY_VIEWED:
746
            $event = 'view';
747
            break;
748
        case BIGBLUEBUTTON_EVENT_ACTIVITY_MANAGEMENT_VIEWED:
749
            $event = 'view all';
750
            break;
751
        default:
752
            return;
753
    }
754
    $course = $DB->get_record('course', array('id' => $bigbluebuttonbn->course), '*', MUST_EXIST);
755
756
    add_to_log($course->id, 'bigbluebuttonbn', $event, '', $bigbluebuttonbn->name, $cm->id);
757
}
758
759
function bigbluebuttonbn_event_log($event_type, $bigbluebuttonbn, $context, $cm) {
760
    global $CFG;
761
762
    $version_major = bigbluebuttonbn_get_moodle_version_major();
763
    if ( $version_major < '2014051200' ) {
764
        //This is valid before v2.7
765
        bigbluebuttonbn_event_log_legacy($event_type, $bigbluebuttonbn, $context, $cm);
766
767
    } else {
768
        //This is valid after v2.7
769
        bigbluebuttonbn_event_log_standard($event_type, $bigbluebuttonbn, $context, $cm);
770
    }
771
}
772
773
function bigbluebuttonbn_bbb_broker_get_recordings($meetingid, $password, $forced=false) {
0 ignored issues
show
Unused Code introduced by
The parameter $meetingid is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $password is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $forced is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
774
    global $CFG;
775
776
    $recordings = array();
0 ignored issues
show
Unused Code introduced by
$recordings is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
777
    $endpoint = bigbluebuttonbn_get_cfg_server_url();
0 ignored issues
show
Unused Code introduced by
$endpoint is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
778
    $shared_secret = bigbluebuttonbn_get_cfg_shared_secret();
0 ignored issues
show
Unused Code introduced by
$shared_secret is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
779
    $cache_ttl = bigbluebuttonbn_get_cfg_waitformoderator_cache_ttl();
0 ignored issues
show
Unused Code introduced by
$cache_ttl is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
780
781
    $cache = cache::make_from_params(cache_store::MODE_APPLICATION, 'mod_bigbluebuttonbn', 'meetings_cache');
0 ignored issues
show
Unused Code introduced by
$cache is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
782
}
783
784
function bigbluebuttonbn_bbb_broker_participant_joined($meetingid, $is_moderator) {
785
    $cache = cache::make_from_params(cache_store::MODE_APPLICATION, 'mod_bigbluebuttonbn', 'meetings_cache');
786
    $result = $cache->get($meetingid);
787
    $meeting_info = json_decode($result['meeting_info']);
788
    $meeting_info->participantCount += 1;
789
    if( $is_moderator ) {
790
        $meeting_info->moderatorCount += 1;
791
    }
792
    $cache->set($meetingid, array('creation_time' => $result['creation_time'], 'meeting_info' => json_encode($meeting_info) ));
793
}
794
795
function bigbluebuttonbn_bbb_broker_is_meeting_running($meeting_info) {
796
    $meeting_running = ( isset($meeting_info) && isset($meeting_info->returncode) && $meeting_info->returncode == 'SUCCESS' );
797
798
    return $meeting_running;
799
}
800
801
function bigbluebuttonbn_bbb_broker_get_meeting_info($meetingid, $password, $forced=false) {
802
    global $CFG;
803
804
    $meeting_info = array();
0 ignored issues
show
Unused Code introduced by
$meeting_info is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
805
    $endpoint = bigbluebuttonbn_get_cfg_server_url();
806
    $shared_secret = bigbluebuttonbn_get_cfg_shared_secret();
807
    $cache_ttl = bigbluebuttonbn_get_cfg_waitformoderator_cache_ttl();
808
809
    $cache = cache::make_from_params(cache_store::MODE_APPLICATION, 'mod_bigbluebuttonbn', 'meetings_cache');
810
    $result = $cache->get($meetingid);
811
    $now = time();
812
    if( isset($result) && $now < ($result['creation_time'] + $cache_ttl) && !$forced ) {
813
        //Use the value in the cache
814
        $meeting_info = json_decode($result['meeting_info']);
815
    } else {
816
        //Ping again and refresh the cache
817
        $meeting_info = (array) bigbluebuttonbn_getMeetingInfo( $meetingid, $password, $endpoint, $shared_secret );
818
        $cache->set($meetingid, array('creation_time' => time(), 'meeting_info' => json_encode($meeting_info) ));
819
    }
820
821
    return $meeting_info;
822
}
823
824
function bigbluebuttonbn_bbb_broker_do_end_meeting($meetingid, $password){
825
    global $CFG;
826
827
    $endpoint = bigbluebuttonbn_get_cfg_server_url();
828
    $shared_secret = bigbluebuttonbn_get_cfg_shared_secret();
829
830
    bigbluebuttonbn_doEndMeeting($meetingid, $password, $endpoint, $shared_secret);
831
}
832
833
function bigbluebuttonbn_bbb_broker_do_publish_recording($recordingid, $publish=true){
834
    global $CFG;
835
836
    $endpoint = bigbluebuttonbn_get_cfg_server_url();
837
    $shared_secret = bigbluebuttonbn_get_cfg_shared_secret();
838
839
    bigbluebuttonbn_doPublishRecordings($recordingid, ($publish)? 'true': 'false', $endpoint, $shared_secret);
840
}
841
842
function bigbluebuttonbn_bbb_broker_do_publish_recording_imported($recordingid, $courseID, $bigbluebuttonbnID, $publish=true){
0 ignored issues
show
Unused Code introduced by
The parameter $courseID is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
843
    global $DB;
844
845
    //Locate the record to be updated
846
    $records = $DB->get_records('bigbluebuttonbn_logs', array('bigbluebuttonbnid' => $bigbluebuttonbnID, 'log' => BIGBLUEBUTTONBN_LOG_EVENT_IMPORT));
847
848
    $recordings_imported = array();
0 ignored issues
show
Unused Code introduced by
$recordings_imported is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
849
    foreach ($records as $key => $record) {
850
        $meta = json_decode($record->meta, true);
851
        if( $recordingid == $meta['recording']['recordID'] ) {
852
            // Found, prepare data for the update
853
            $meta['recording']['published'] = ($publish)? 'true': 'false';
854
            $records[$key]->meta = json_encode($meta);
855
856
            // Proceed with the update
857
            $DB->update_record("bigbluebuttonbn_logs", $records[$key]);
858
        }
859
    }
860
}
861
862
function bigbluebuttonbn_bbb_broker_do_delete_recording($recordingid){
863
    global $CFG;
864
865
    $endpoint = bigbluebuttonbn_get_cfg_server_url();
866
    $shared_secret = bigbluebuttonbn_get_cfg_shared_secret();
867
868
    bigbluebuttonbn_doDeleteRecordings($recordingid, $endpoint, $shared_secret);
869
}
870
871
function bigbluebuttonbn_bbb_broker_do_delete_recording_imported($recordingid, $courseID, $bigbluebuttonbnID){
0 ignored issues
show
Unused Code introduced by
The parameter $courseID is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
872
    global $DB;
873
874
    //Locate the record to be updated
875
    $records = $DB->get_records('bigbluebuttonbn_logs', array('bigbluebuttonbnid' => $bigbluebuttonbnID, 'log' => BIGBLUEBUTTONBN_LOG_EVENT_IMPORT));
876
877
    $recordings_imported = array();
0 ignored issues
show
Unused Code introduced by
$recordings_imported is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
878
    foreach ($records as $key => $record) {
879
        $meta = json_decode($record->meta, true);
880
        if( $recordingid == $meta['recording']['recordID'] ) {
881
            // Execute delete
882
            $DB->delete_records("bigbluebuttonbn_logs", array('id' => $key));
883
        }
884
    }
885
}
886
887
function bigbluebuttonbn_bbb_broker_validate_parameters($params) {
888
    $error = '';
889
890
    if ( !isset($params['callback']) ) {
891
        $error = $bigbluebuttonbn_bbb_broker_add_error($error, 'This call must include a javascript callback.');
0 ignored issues
show
Bug introduced by
The variable $bigbluebuttonbn_bbb_broker_add_error does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
892
    }
893
894
    if ( !isset($params['action']) ) {
895
        $error = $bigbluebuttonbn_bbb_broker_add_error($error, 'Action parameter must be included.');
896
    } else {
897
        switch ( strtolower($params['action']) ){
898
            case 'server_ping':
899
            case 'meeting_info':
900
            case 'meeting_end':
901
                if ( !isset($params['id']) ) {
902
                    $error = $bigbluebuttonbn_bbb_broker_add_error($error, 'The meetingID must be specified.');
903
                }
904
                break;
905
            case 'recording_list':
906
            case 'recording_info':
907
            case 'recording_publish':
908
            case 'recording_unpublish':
909
            case 'recording_delete':
910
            case 'recording_import':
911
                if ( !isset($params['id']) ) {
912
                    $error = bigbluebuttonbn_bbb_broker_add_error($error, 'The recordingID must be specified.');
913
                }
914
                break;
915
            case 'recording_ready':
916
                if( empty($params['signed_parameters']) ) {
917
                    $error = bigbluebuttonbn_bbb_broker_add_error($error, 'A JWT encoded string must be included as [signed_parameters].');
918
                }
919
                break;
920
            default:
921
                $error = bigbluebuttonbn_bbb_broker_add_error($error, 'Action '.$params['action'].' can not be performed.');
922
        }
923
    }
924
925
    return $error;
926
}
927
928
function bigbluebuttonbn_bbb_broker_add_error($org_msg, $new_msg='') {
929
    $error = $org_msg;
930
931
    if( !empty($new_msg) ) {
932
        if( !empty($error) ) $error .= ' ';
933
        $error .= $new_msg;
934
    }
935
936
    return $error;
937
}
938
939
function bigbluebuttonbn_get_recording_data_row($bbbsession, $recording, $tools=["publishing", "deleting"]) {
940
    global $OUTPUT, $CFG, $USER;
941
942
    $row = null;
943
944
    if ( $bbbsession['managerecordings'] || $recording['published'] == 'true' ) {
945
        $length = 0;
0 ignored issues
show
Unused Code introduced by
$length is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
946
        $duration = intval(array_values($recording['playbacks'])[0]['length']);
947
948
        //For backward compatibility
949
        if( isset($recording['meta_contextactivity']) ) {
950
            $meta_activity = str_replace('"', '\"', $recording['meta_contextactivity']);
0 ignored issues
show
Unused Code introduced by
$meta_activity is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
951
        } if( isset($recording['meta_bbb-recording-name']) ) {
952
            $meta_activity = str_replace('"', '\"', $recording['meta_bbb-recording-name']);
953
        } else {
954
            $meta_activity = str_replace('"', '\"', $recording['meetingName']);
955
        }
956
957
        if( isset($recording['meta_contextactivitydescription']) ) {
958
            $meta_description = str_replace('"', '\"', $recording['meta_contextactivitydescription']);
959
        } else if( isset($recording['meta_bbb-recording-description']) ) {
960
            $meta_description = str_replace('"', '\"', $recording['meta_bbb-recording-description']);
961
        } else {
962
            $meta_description = '';
963
        }
964
965
        //Set recording_types
966
        if ( isset($recording['imported']) ) {
967
            $attributes = 'data-imported="true" title='.get_string('view_recording_link_warning', 'bigbluebuttonbn');
968
        } else {
969
            $attributes = 'data-imported="false"';
970
        }
971
972
        $recording_types = '';
973
        if ($recording['published'] == 'true') {
974
            $recording_types .= '<div id="playbacks-'.$recording['recordID'].'" '.$attributes.'>';
975
        } else {
976
            $recording_types .= '<div id="playbacks-'.$recording['recordID'].'" '.$attributes.'" hidden>';
977
        }
978
        foreach ( $recording['playbacks'] as $playback ) {
979
            $recording_types .= $OUTPUT->action_link($playback['url'], get_string('view_recording_format_'.$playback['type'], 'bigbluebuttonbn'), null, array('title' => get_string('view_recording_format_'.$playback['type'], 'bigbluebuttonbn'), 'target' => '_new') ).'&#32;';
980
        }
981
        $recording_types .= '</div>';
982
983
        //Initialize variables for styling text
984
        $head = $tail = '';
985
986
        //Set actionbar, if user is allowed to manage recordings
987
        $actionbar = '';
988
        if ( $bbbsession['managerecordings'] ) {
989
            // Set style for imported links
990
            if( isset($recording['imported']) ) {
991
                $recordings_imported_count = 0;
992
                $tag_tail = ' '.get_string('view_recording_link', 'bigbluebuttonbn');
993
                $head = '<i>';
994
                $tail = '</i>';
995
996
            } else {
997
                $recordings_imported_array = bigbluebuttonbn_getRecordingsImportedAllInstancesArray($recording['recordID']);
998
                $recordings_imported_count = count($recordings_imported_array);
999
                $tag_tail = '';
1000
            }
1001
1002
            $url = '#';
1003
            $action = null;
1004
1005
1006
            if (in_array("publishing", $tools)) {
1007
                ///Set action [show|hide]
1008
                if ( $recording['published'] == 'true' ){
1009
                    $manage_tag = 'hide';
1010
                    $manage_action = 'unpublish';
1011
                } else {
1012
                    $manage_tag = 'show';
1013
                    $manage_action = 'publish';
1014
                }
1015
                $onclick = 'M.mod_bigbluebuttonbn.broker_manageRecording("'.$manage_action.'", "'.$recording['recordID'].'", "'.$recording['meetingID'].'");';
1016
1017
                if ( bigbluebuttonbn_get_cfg_recording_icons_enabled() ) {
1018
                    //With icon for publish/unpublish
1019
                    $icon_attributes = array('id' => 'recording-btn-'.$manage_action.'-'.$recording['recordID']);
1020
                    $icon = new pix_icon('t/'.$manage_tag, get_string($manage_tag).$tag_tail, 'moodle', $icon_attributes);
1021
                    $link_attributes = array('id' => 'recording-link-'.$manage_action.'-'.$recording['recordID'], 'onclick' => $onclick, 'data-links' => $recordings_imported_count);
1022
                    $actionbar .= $OUTPUT->action_icon($url, $icon, $action, $link_attributes, false);
1023
1024
                } else {
1025
                    //With text for publish/unpublish
1026
                    $link_attributes = array('title' => get_string($manage_tag).$tag_tail, 'class' => 'btn btn-xs', 'onclick' => $onclick, 'data-links' => $recordings_imported_count);
1027
                    $actionbar .= $OUTPUT->action_link($url, get_string($manage_tag).$tag_tail, $action, $link_attributes);
1028
                    $actionbar .= "&nbsp;";
1029
                }
1030
            }
1031
1032
            if (in_array("deleting", $tools)) {
1033
                $onclick = 'M.mod_bigbluebuttonbn.broker_manageRecording("delete", "'.$recording['recordID'].'", "'.$recording['meetingID'].'");';
1034
1035
                if ( bigbluebuttonbn_get_cfg_recording_icons_enabled() ) {
1036
                    //With icon for delete
1037
                    $icon_attributes = array('id' => 'recording-btn-delete-'.$recording['recordID']);
1038
                    $icon = new pix_icon('t/delete', get_string('delete').$tag_tail, 'moodle', $icon_attributes);
1039
                    $link_attributes = array('id' => 'recording-link-delete-'.$recording['recordID'], 'onclick' => $onclick, 'data-links' => $recordings_imported_count);
1040
                    $actionbar .= $OUTPUT->action_icon($url, $icon, $action, $link_attributes, false);
1041
1042
                } else {
1043
                    //With text for delete
1044
                    $link_attributes = array('title' => get_string('delete').$tag_tail, 'class' => 'btn btn-xs btn-danger', 'onclick' => $onclick, 'data-links' => $recordings_imported_count);
1045
                    $actionbar .= $OUTPUT->action_link($url, get_string('delete').$tag_tail, $action, $link_attributes);
1046
                }
1047
            }
1048
1049
            if (in_array("importing", $tools)) {
1050
                $onclick = 'M.mod_bigbluebuttonbn.broker_manageRecording("import", "'.$recording['recordID'].'", "'.$recording['meetingID'].'");';
1051
1052
                if ( bigbluebuttonbn_get_cfg_recording_icons_enabled() ) {
1053
                    //With icon for import
1054
                    $icon_attributes = array('id' => 'recording-btn-import-'.$recording['recordID']);
1055
                    $icon = new pix_icon('i/import', get_string('import'), 'moodle', $icon_attributes);
1056
                    $link_attributes = array('id' => 'recording-link-import-'.$recording['recordID'], 'onclick' => $onclick);
1057
                    $actionbar .= $OUTPUT->action_icon($url, $icon, $action, $link_attributes, false);
1058
1059
                } else {
1060
                    //With text for import
1061
                    $link_attributes = array('title' => get_string('import'), 'class' => 'btn btn-xs btn-danger', 'onclick' => $onclick);
1062
                    $actionbar .= $OUTPUT->action_link($url, get_string('import'), $action, $link_attributes);
1063
                }
1064
            }
1065
        }
1066
1067
        //Set corresponding format
1068
        $format = '%a %h %d, %Y %H:%M:%S %Z';
1069
        $formattedStartDate = userdate($startTime / 1000, $format, usertimezone($USER->timezone));
0 ignored issues
show
Bug introduced by
The variable $startTime does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
1070
1071
        $row = new stdClass();
1072
        $row->recording = "{$head}{$recording_types}{$tail}";
1073
        $row->activity = "{$head}{$meta_activity}{$tail}";
1074
        $row->description = "{$head}{$meta_description}{$tail}";
1075
        $row->date = floatval($recording['startTime']);
1076
        $row->date_formatted = "{$head}{$formattedStartDate}{$tail}";
1077
        $row->duration = "{$head}{$duration}{$tail}";
1078
        if ( $bbbsession['managerecordings'] ) {
1079
            $row->actionbar = $actionbar;
1080
        }
1081
    }
1082
1083
    return $row;
1084
}
1085
1086
function bigbluebuttonbn_get_recording_columns($bbbsession, $recordings) {
0 ignored issues
show
Unused Code introduced by
The parameter $recordings is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1087
    ///Set strings to show
1088
    $view_recording_recording = get_string('view_recording_recording', 'bigbluebuttonbn');
1089
    $view_recording_activity = get_string('view_recording_activity', 'bigbluebuttonbn');
1090
    $view_recording_description = get_string('view_recording_description', 'bigbluebuttonbn');
1091
    $view_recording_date = get_string('view_recording_date', 'bigbluebuttonbn');
1092
    $view_recording_duration = get_string('view_recording_duration', 'bigbluebuttonbn');
1093
    $view_recording_actionbar = get_string('view_recording_actionbar', 'bigbluebuttonbn');
1094
1095
    ///Initialize table headers
1096
    $recordingsbn_columns = array(
1097
        array("key" =>"recording", "label" => $view_recording_recording, "width" => "125px", "allowHTML" => true),
1098
        array("key" =>"activity", "label" => $view_recording_activity, "sortable" => true, "width" => "175px"),
1099
        array("key" =>"description", "label" => $view_recording_description, "sortable" => true, "width" => "250px"),
1100
        array("key" =>"date", "label" => $view_recording_date, "sortable" => true, "width" => "220px"),
1101
        array("key" =>"duration", "label" => $view_recording_duration, "width" => "50px")
1102
        );
1103
1104
    if ( $bbbsession['managerecordings'] ) {
1105
        array_push($recordingsbn_columns, array("key" =>"actionbar", "label" => $view_recording_actionbar, "width" => "75px", "allowHTML" => true));
1106
    }
1107
1108
    return $recordingsbn_columns;
1109
}
1110
1111
function bigbluebuttonbn_get_recording_data($bbbsession, $recordings, $tools=["publishing", "deleting"]) {
1112
    $table_data = array();
1113
1114
    ///Build table content
1115
    if ( isset($recordings) && !array_key_exists('messageKey', $recordings)) {  // There are recordings for this meeting
1116
        foreach ( $recordings as $recording ) {
1117
            $row = bigbluebuttonbn_get_recording_data_row($bbbsession, $recording, $tools);
1118
            if( $row != null ) {
1119
                array_push($table_data, $row);
1120
            }
1121
        }
1122
    }
1123
1124
    return $table_data;
1125
}
1126
1127
function bigbluebuttonbn_get_recording_table($bbbsession, $recordings, $tools=['publishing','deleting']) {
1128
    global $OUTPUT, $CFG;
1129
1130
    ///Set strings to show
1131
    $view_recording_recording = get_string('view_recording_recording', 'bigbluebuttonbn');
1132
    $view_recording_course = get_string('view_recording_course', 'bigbluebuttonbn');
0 ignored issues
show
Unused Code introduced by
$view_recording_course is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1133
    $view_recording_activity = get_string('view_recording_activity', 'bigbluebuttonbn');
1134
    $view_recording_description = get_string('view_recording_description', 'bigbluebuttonbn');
1135
    $view_recording_date = get_string('view_recording_date', 'bigbluebuttonbn');
1136
    $view_recording_length = get_string('view_recording_length', 'bigbluebuttonbn');
0 ignored issues
show
Unused Code introduced by
$view_recording_length is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1137
    $view_recording_duration = get_string('view_recording_duration', 'bigbluebuttonbn');
1138
    $view_recording_actionbar = get_string('view_recording_actionbar', 'bigbluebuttonbn');
1139
    $view_duration_min = get_string('view_recording_duration_min', 'bigbluebuttonbn');
0 ignored issues
show
Unused Code introduced by
$view_duration_min is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1140
1141
    ///Declare the table
1142
    $table = new html_table();
1143
    $table->data = array();
1144
1145
    ///Initialize table headers
1146
    if ( $bbbsession['managerecordings'] ) {
1147
        $table->head  = array ($view_recording_recording, $view_recording_activity, $view_recording_description, $view_recording_date, $view_recording_duration, $view_recording_actionbar);
1148
        $table->align = array ('left', 'left', 'left', 'left', 'center', 'left');
1149
    } else {
1150
        $table->head  = array ($view_recording_recording, $view_recording_activity, $view_recording_description, $view_recording_date, $view_recording_duration);
1151
        $table->align = array ('left', 'left', 'left', 'left', 'center');
1152
    }
1153
1154
    ///Build table content
1155
    if ( isset($recordings) && !array_key_exists('messageKey', $recordings)) {  // There are recordings for this meeting
1156
        foreach ( $recordings as $recording ){
1157
            $row = new html_table_row();
1158
            $row->id = 'recording-td-'.$recording['recordID'];
1159
            if ( isset($recording['imported']) ) {
1160
                $row->attributes['data-imported'] = 'true';
1161
                $row->attributes['title'] = get_string('view_recording_link_warning', 'bigbluebuttonbn');
1162
            } else {
1163
                $row->attributes['data-imported'] = 'false';
1164
            }
1165
1166
            $row_data = bigbluebuttonbn_get_recording_data_row($bbbsession, $recording, $tools);
1167
            if( $row_data != null ) {
1168
                $row_data->date_formatted = str_replace(" ", "&nbsp;", $row_data->date_formatted);
1169
                if ( $bbbsession['managerecordings'] ) {
1170
                    $row->cells = array ($row_data->recording, $row_data->activity, $row_data->description, $row_data->date_formatted, $row_data->duration, $row_data->actionbar );
1171
                } else {
1172
                    $row->cells = array ($row_data->recording, $row_data->activity, $row_data->description, $row_data->date_formatted, $row_data->duration );
1173
                }
1174
1175
                array_push($table->data, $row);
1176
            }
1177
        }
1178
    }
1179
1180
    return $table;
1181
}
1182
1183
function bigbluebuttonbn_send_notification_recording_ready($bigbluebuttonbn) {
1184
    $sender = get_admin();
1185
1186
    // Prepare message
1187
    $msg = new stdClass();
1188
1189
    /// Build the message_body
1190
    $msg->activity_type = "";
1191
    $msg->activity_title = $bigbluebuttonbn->name;
1192
    $message_text = '<p>'.get_string('email_body_recording_ready_for', 'bigbluebuttonbn').' '.$msg->activity_type.' &quot;'.$msg->activity_title.'&quot; '.get_string('email_body_recording_ready_is_ready', 'bigbluebuttonbn').'.</p>';
1193
1194
    bigbluebuttonbn_send_notification($sender, $bigbluebuttonbn, $message_text);
1195
}
1196
1197
function bigbluebuttonbn_server_offers($capability_name){
1198
    global $CFG;
1199
1200
    $capability_offered = null;
1201
1202
    $endpoint = bigbluebuttonbn_get_cfg_server_url();
1203
    $shared_secret = bigbluebuttonbn_get_cfg_shared_secret();
1204
1205
    //Validates if the server may have extended capabilities
1206
    $parse = parse_url($endpoint);
1207
    $host = $parse['host'];
1208
    $host_ends = explode(".", $host);
1209
    $host_ends_length = count($host_ends);
1210
1211
    if( $host_ends_length > 0 && $host_ends[$host_ends_length -1] == 'com' &&  $host_ends[$host_ends_length -2] == 'blindsidenetworks' ) {
1212
        //Validate the capabilities offered
1213
        $capabilities = bigbluebuttonbn_getCapabilitiesArray( $endpoint, $shared_secret );
1214
        if( $capabilities ) {
1215
            foreach ($capabilities as $capability) {
1216
                if( $capability["name"] == $capability_name)
1217
                    $capability_offered = $capability;
1218
            }
1219
        }
1220
    }
1221
1222
    return $capability_offered;
1223
}
1224
1225
function bigbluebuttonbn_server_offers_bn_capabilities(){
1226
    //Validates if the server may have extended capabilities
1227
    $parsed_url = parse_url(bigbluebuttonbn_get_cfg_server_url());
1228
    $host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
1229
    $host_ends = explode(".", $host);
1230
    $host_ends_length = count($host_ends);
1231
1232
    return ( $host_ends_length > 0 && $host_ends[$host_ends_length -1] == 'com' && $host_ends[$host_ends_length -2] == 'blindsidenetworks' );
1233
}
1234
1235
function bigbluebuttonbn_get_locales_for_ui() {
1236
    $locales = array(
1237
            'not_started' => get_string('view_message_conference_not_started', 'bigbluebuttonbn'),
1238
            'wait_for_moderator' => get_string('view_message_conference_wait_for_moderator', 'bigbluebuttonbn'),
1239
            'in_progress' => get_string('view_message_conference_in_progress', 'bigbluebuttonbn'),
1240
            'started_at' => get_string('view_message_session_started_at', 'bigbluebuttonbn'),
1241
            'session_no_users' => get_string('view_message_session_no_users', 'bigbluebuttonbn'),
1242
            'session_has_user' => get_string('view_message_session_has_user', 'bigbluebuttonbn'),
1243
            'session_has_users' => get_string('view_message_session_has_users', 'bigbluebuttonbn'),
1244
            'has_joined' => get_string('view_message_has_joined', 'bigbluebuttonbn'),
1245
            'have_joined' => get_string('view_message_have_joined', 'bigbluebuttonbn'),
1246
            'user' => get_string('view_message_user', 'bigbluebuttonbn'),
1247
            'users' => get_string('view_message_users', 'bigbluebuttonbn'),
1248
            'viewer' => get_string('view_message_viewer', 'bigbluebuttonbn'),
1249
            'viewers' => get_string('view_message_viewers', 'bigbluebuttonbn'),
1250
            'moderator' => get_string('view_message_moderator', 'bigbluebuttonbn'),
1251
            'moderators' => get_string('view_message_moderators', 'bigbluebuttonbn'),
1252
            'publish' => get_string('view_recording_list_actionbar_publish', 'bigbluebuttonbn'),
1253
            'publishing' => get_string('view_recording_list_actionbar_publishing', 'bigbluebuttonbn'),
1254
            'unpublish' => get_string('view_recording_list_actionbar_unpublish', 'bigbluebuttonbn'),
1255
            'unpublishing' => get_string('view_recording_list_actionbar_unpublishing', 'bigbluebuttonbn'),
1256
            'modal_title' => get_string('view_recording_modal_title', 'bigbluebuttonbn'),
1257
            'modal_button' => get_string('view_recording_modal_button', 'bigbluebuttonbn'),
1258
            'userlimit_reached' => get_string('view_error_userlimit_reached', 'bigbluebuttonbn'),
1259
            'recording' => get_string('view_recording', 'bigbluebuttonbn'),
1260
            'recording_link' => get_string('view_recording_link', 'bigbluebuttonbn'),
1261
            'recording_link_warning' => get_string('view_recording_link_warning', 'bigbluebuttonbn'),
1262
            'unpublish_confirmation' => get_string('view_recording_unpublish_confirmation', 'bigbluebuttonbn'),
1263
            'unpublish_confirmation_warning_s' => get_string('view_recording_unpublish_confirmation_warning_s', 'bigbluebuttonbn'),
1264
            'unpublish_confirmation_warning_p' => get_string('view_recording_unpublish_confirmation_warning_p', 'bigbluebuttonbn'),
1265
            'delete_confirmation' => get_string('view_recording_delete_confirmation', 'bigbluebuttonbn'),
1266
            'delete_confirmation_warning_s' => get_string('view_recording_delete_confirmation_warning_s', 'bigbluebuttonbn'),
1267
            'delete_confirmation_warning_p' => get_string('view_recording_delete_confirmation_warning_p', 'bigbluebuttonbn'),
1268
            'import_confirmation' => get_string('view_recording_import_confirmation', 'bigbluebuttonbn'),
1269
    );
1270
    return $locales;
1271
}
1272
1273
function bigbluebuttonbn_get_cfg_server_url_default() {
1274
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1275
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_server_url)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_server_url: (isset($CFG->bigbluebuttonbn_server_url)? $CFG->bigbluebuttonbn_server_url: (isset($CFG->BigBlueButtonBNServerURL)? $CFG->BigBlueButtonBNServerURL: 'http://test-install.blindsidenetworks.com/bigbluebutton/')));
1276
}
1277
1278
function bigbluebuttonbn_get_cfg_shared_secret_default() {
1279
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1280
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_shared_secret)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_shared_secret: (isset($CFG->bigbluebuttonbn_shared_secret)? $CFG->bigbluebuttonbn_shared_secret: (isset($CFG->BigBlueButtonBNSecuritySalt)? $CFG->BigBlueButtonBNSecuritySalt: '8cd8ef52e8e101574e400365b55e11a6')));
1281
}
1282
1283
function bigbluebuttonbn_get_cfg_voicebridge_editable() {
1284
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1285
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_voicebridge_editable)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_voicebridge_editable: (isset($CFG->bigbluebuttonbn_voicebridge_editable)? $CFG->bigbluebuttonbn_voicebridge_editable: false));
1286
}
1287
1288
function bigbluebuttonbn_get_cfg_recording_default() {
1289
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1290
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recording_default)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recording_default: (isset($CFG->bigbluebuttonbn_recording_default)? $CFG->bigbluebuttonbn_recording_default: true));
1291
}
1292
1293
function bigbluebuttonbn_get_cfg_recording_editable() {
1294
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1295
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recording_editable)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recording_editable: (isset($CFG->bigbluebuttonbn_recording_editable)? $CFG->bigbluebuttonbn_recording_editable: true));
1296
}
1297
1298
function bigbluebuttonbn_get_cfg_recording_tagging_default() {
1299
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1300
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recordingtagging_default)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recordingtagging_default: (isset($CFG->bigbluebuttonbn_recordingtagging_default)? $CFG->bigbluebuttonbn_recordingtagging_default: false));
1301
}
1302
1303
function bigbluebuttonbn_get_cfg_recording_tagging_editable() {
1304
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1305
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recordingtagging_editable)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recordingtagging_editable: (isset($CFG->bigbluebuttonbn_recordingtagging_editable)? $CFG->bigbluebuttonbn_recordingtagging_editable: false));
1306
}
1307
1308
function bigbluebuttonbn_get_cfg_recording_icons_enabled() {
1309
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1310
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recording_icons_enabled)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recording_icons_enabled: (isset($CFG->bigbluebuttonbn_recording_icons_enabled)? $CFG->bigbluebuttonbn_recording_icons_enabled: true));
1311
}
1312
1313
function bigbluebuttonbn_get_cfg_importrecordings_enabled() {
1314
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1315
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_importrecordings_enabled)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_importrecordings_enabled: (isset($CFG->bigbluebuttonbn_importrecordings_enabled)? $CFG->bigbluebuttonbn_importrecordings_enabled: false));
1316
}
1317
1318
function bigbluebuttonbn_get_cfg_waitformoderator_default() {
1319
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1320
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_default)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_default: (isset($CFG->bigbluebuttonbn_waitformoderator_default)? $CFG->bigbluebuttonbn_waitformoderator_default: false));
1321
}
1322
1323
function bigbluebuttonbn_get_cfg_waitformoderator_editable() {
1324
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1325
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_editable)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_editable: (isset($CFG->bigbluebuttonbn_waitformoderator_editable)? $CFG->bigbluebuttonbn_waitformoderator_editable: true));
1326
}
1327
1328
function bigbluebuttonbn_get_cfg_waitformoderator_ping_interval() {
1329
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1330
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_ping_interval)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_ping_interval: (isset($CFG->bigbluebuttonbn_waitformoderator_ping_interval)? $CFG->bigbluebuttonbn_waitformoderator_ping_interval: 15));
1331
}
1332
1333
function bigbluebuttonbn_get_cfg_waitformoderator_cache_ttl() {
1334
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1335
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_cache_ttl)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_waitformoderator_cache_ttl: (isset($CFG->bigbluebuttonbn_waitformoderator_cache_ttl)? $CFG->bigbluebuttonbn_waitformoderator_cache_ttl: 60));
1336
}
1337
1338
function bigbluebuttonbn_get_cfg_userlimit_default() {
1339
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1340
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_userlimit_default)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_userlimit_default: (isset($CFG->bigbluebuttonbn_userlimit_default)? $CFG->bigbluebuttonbn_userlimit_default: 0));
1341
}
1342
1343
function bigbluebuttonbn_get_cfg_userlimit_editable() {
1344
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1345
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_userlimit_editable)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_userlimit_editable: (isset($CFG->bigbluebuttonbn_userlimit_editable)? $CFG->bigbluebuttonbn_userlimit_editable: false));
1346
}
1347
1348
function bigbluebuttonbn_get_cfg_preuploadpresentation_enabled() {
1349
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1350
    if (extension_loaded('curl')) {
1351
        // This feature only works if curl is installed
1352
        return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_preuploadpresentation_enabled)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_preuploadpresentation_enabled: (isset($CFG->bigbluebuttonbn_preuploadpresentation_enabled)? $CFG->bigbluebuttonbn_preuploadpresentation_enabled: false));
1353
    } else {
1354
        return false;
1355
    }
1356
}
1357
1358
function bigbluebuttonbn_get_cfg_sendnotifications_enabled() {
1359
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1360
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_sendnotifications_enabled)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_sendnotifications_enabled: (isset($CFG->bigbluebuttonbn_sendnotifications_enabled)? $CFG->bigbluebuttonbn_sendnotifications_enabled: false));
1361
}
1362
1363
function bigbluebuttonbn_get_cfg_recordingready_enabled() {
1364
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1365
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recordingready_enabled)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_recordingready_enabled: (isset($CFG->bigbluebuttonbn_recordingready_enabled)? $CFG->bigbluebuttonbn_recordingready_enabled: false));
1366
}
1367
1368
function bigbluebuttonbn_get_cfg_moderator_default() {
1369
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1370
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_moderator_default)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_moderator_default: (isset($CFG->bigbluebuttonbn_moderator_default)? $CFG->bigbluebuttonbn_moderator_default: 'owner'));
1371
}
1372
1373
function bigbluebuttonbn_get_cfg_scheduled_duration_enabled() {
1374
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1375
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_scheduled_duration_enabled)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_scheduled_duration_enabled: (isset($CFG->bigbluebuttonbn_scheduled_duration_enabled)? $CFG->bigbluebuttonbn_scheduled_duration_enabled: false));
1376
}
1377
1378
function bigbluebuttonbn_get_cfg_scheduled_duration_compensation() {
1379
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1380
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_scheduled_duration_compensation)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_scheduled_duration_compensation: (isset($CFG->bigbluebuttonbn_scheduled_duration_compensation)? $CFG->bigbluebuttonbn_scheduled_duration_compensation: 10));
1381
}
1382
1383
function bigbluebuttonbn_get_cfg_scheduled_pre_opening() {
1384
    global $BIGBLUEBUTTONBN_CFG, $CFG;
1385
    return (isset($BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_scheduled_pre_opening)? $BIGBLUEBUTTONBN_CFG->bigbluebuttonbn_scheduled_pre_opening: (isset($CFG->bigbluebuttonbn_scheduled_pre_opening)? $CFG->bigbluebuttonbn_scheduled_pre_opening: 10));
1386
}
1387
1388
function bigbluebuttonbn_import_get_courses_for_select(array $bbbsession) {
1389
1390
    if( $bbbsession['administrator'] ) {
1391
        $courses = get_courses('all', 'c.id ASC', 'c.id,c.shortname,c.fullname');
1392
        //It includes the name of the site as a course (category 0), so remove the first one
1393
        unset($courses["1"]);
1394
    } else {
1395
        $courses = enrol_get_users_courses($bbbsession['userID'], false, 'id,shortname,fullname');
1396
    }
1397
1398
    $courses_for_select = [];
1399
    foreach($courses as $course) {
1400
        if( $course->id != $bbbsession['course']->id ) {
1401
            $courses_for_select[$course->id] = $course->fullname;
1402
        }
1403
    }
1404
    return $courses_for_select;
1405
}
1406
1407
function bigbluebuttonbn_getRecordedMeetingsDeleted($courseID, $bigbluebuttonbnID=NULL) {
1408
    global $DB;
1409
1410
    $records_deleted = array();
1411
1412
    $filter = array('courseid' => $courseID, 'log' => BIGBLUEBUTTONBN_LOG_EVENT_DELETE );
1413
    if ( $bigbluebuttonbnID != NULL ) {
1414
        $filter['id'] = $bigbluebuttonbnID;
1415
    }
1416
1417
    $bigbluebuttonbns_deleted = $DB->get_records('bigbluebuttonbn_logs', $filter);
1418
1419
    foreach ($bigbluebuttonbns_deleted as $key => $bigbluebuttonbn_deleted) {
1420
        $records = $DB->get_records('bigbluebuttonbn_logs', array('courseid' => $courseID, 'log' => BIGBLUEBUTTONBN_LOG_EVENT_CREATE));
1421
1422
        if( !empty($records) ) {
1423
            //Remove duplicates
1424
            $unique_records = array();
1425
            foreach ($records as $key => $record) {
1426
                if (array_key_exists($record->meetingid, $unique_records) ) {
1427
                    unset($records[$key]);
1428
                } else {
1429
                    $meta = json_decode($record->meta);
1430
                    if ( !$meta->record ) {
1431
                        unset($records[$key]);
1432
                    } else if ( $bigbluebuttonbn_deleted->meetingid != substr($record->meetingid, 0, strlen($bigbluebuttonbn_deleted->meetingid))) {
1433
                        unset($records[$key]);
1434
                    } else {
1435
                        array_push($unique_records, $record->meetingid);
1436
                    }
1437
                }
1438
            }
1439
1440
            $records_deleted = array_merge($records_deleted, $records);
1441
        }
1442
    }
1443
1444
    return $records_deleted;
1445
}
1446
1447
function bigbluebuttonbn_getRecordedMeetings($courseID, $bigbluebuttonbnID=NULL) {
1448
    global $DB;
1449
1450
    $records = Array();
1451
1452
    $filter = array('course' => $courseID);
1453
    if ( $bigbluebuttonbnID != NULL ) {
1454
        $filter['id'] = $bigbluebuttonbnID;
1455
    }
1456
    $bigbluebuttonbns = $DB->get_records('bigbluebuttonbn', $filter);
1457
1458
    if ( !empty($bigbluebuttonbns) ) {
1459
        $table = 'bigbluebuttonbn_logs';
1460
1461
        //Prepare select for loading records based on existent bigbluebuttonbns
1462
        $select = "";
1463
        foreach ($bigbluebuttonbns as $key => $bigbluebuttonbn) {
1464
            $select .= strlen($select) == 0? "(": " OR ";
1465
            $select .= "bigbluebuttonbnid=".$bigbluebuttonbn->id;
1466
        }
1467
        $select .= ") AND log='".BIGBLUEBUTTONBN_LOG_EVENT_CREATE."'";
1468
1469
        //Execute select for loading records based on existent bigbluebuttonbns
1470
        $records = $DB->get_records_select($table, $select);
1471
1472
        //Remove duplicates
1473
        $unique_records = array();
1474
        foreach ($records as $key => $record) {
1475
            $record_key = $record->meetingid.','.$record->bigbluebuttonbnid.','.$record->meta;
1476
            if( array_search($record_key, $unique_records) === false ) {
1477
                array_push($unique_records, $record_key);
1478
            } else {
1479
                unset($records[$key]);
1480
            }
1481
        }
1482
1483
        //Remove the ones with record=false
1484
        foreach ($records as $key => $record) {
1485
            $meta = json_decode($record->meta);
1486
            if ( !$meta || !$meta->record ) {
1487
                unset($records[$key]);
1488
            }
1489
        }
1490
    }
1491
1492
    return $records;
1493
}
1494
1495
function bigbluebuttonbn_getRecordingsArrayByCourse($courseID, $URL, $SALT) {
1496
    $recordings = array();
1497
1498
    // Load the meetingIDs to be used in the getRecordings request
1499
    $meetingID = '';
1500
    if ( is_numeric($courseID) ) {
1501
        $results = bigbluebuttonbn_getRecordedMeetings($courseID);
1502 View Code Duplication
        if( $results ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1503
            //Eliminates duplicates
1504
            $mIDs = array();
1505
            foreach ($results as $result) {
1506
                $mIDs[$result->meetingid] = $result->meetingid;
1507
            }
1508
            //Generates the meetingID string
1509
            foreach ($mIDs as $mID) {
1510
                if (strlen($meetingID) > 0) $meetingID .= ',';
1511
                $meetingID .= $mID;
1512
            }
1513
        }
1514
    }
1515
1516
    // If there were meetingIDs excecute the getRecordings request
1517
    if ( $meetingID != '' ) {
1518
        $recordings = bigbluebuttonbn_getRecordingsArray($meetingID, $URL, $SALT);
1519
    }
1520
1521
    return $recordings;
1522
}
1523
1524
function bigbluebuttonbn_import_get_recordings_imported($records) {
1525
    $recordings_imported = array();
1526
1527
    foreach ($records as $key => $record) {
1528
        $meta = json_decode($record->meta, true);
1529
        $recordings_imported[] = $meta['recording'];
1530
    }
1531
1532
    return $recordings_imported;
1533
}
1534
1535
function bigbluebuttonbn_import_exlcude_recordings_already_imported($courseID, $bigbluebuttonbnID, $recordings) {
1536
    $recordings_already_imported = bigbluebuttonbn_getRecordingsImportedArray($courseID, $bigbluebuttonbnID);
1537
    $recordings_already_imported_indexed = bigbluebuttonbn_index_recordings($recordings_already_imported);
1538
1539
    foreach ($recordings as $key => $recording) {
1540
        if( isset($recordings_already_imported_indexed[$recording['recordID']]) ) {
1541
            unset($recordings[$key]);
1542
        }
1543
    }
1544
    return $recordings;
1545
}
1546
1547
function bigbluebutton_output_recording_table($bbbsession, $recordings, $tools=['publishing','deleting']) {
1548
1549
    if ( isset($recordings) && !empty($recordings) ) {  // There are recordings for this meeting
1550
        $table = bigbluebuttonbn_get_recording_table($bbbsession, $recordings, $tools);
1551
    }
1552
1553
    $output = '';
1554
    if( isset($table->data) ) {
1555
        //Print the table
1556
        $output .= '<div id="bigbluebuttonbn_html_table">'."\n";
1557
        $output .= html_writer::table($table)."\n";
0 ignored issues
show
Bug introduced by
The variable $table does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1558
        $output .= '</div>'."\n";
1559
1560
    } else {
1561
        $output .= get_string('view_message_norecordings', 'bigbluebuttonbn').'<br>'."\n";
1562
    }
1563
1564
    return $output;
1565
}
1566
1567
function bigbluebuttonbn_getRecordingsImported($courseID, $bigbluebuttonbnID=NULL) {
1568
    global $DB;
1569
1570
    if ( $bigbluebuttonbnID != NULL ) {
1571
        // Fetch only those related to the $courseID and $bigbluebuttonbnID requested
1572
        $recordings_imported = $DB->get_records('bigbluebuttonbn_logs', array('courseid' => $courseID, 'bigbluebuttonbnid' => $bigbluebuttonbnID, 'log' => BIGBLUEBUTTONBN_LOG_EVENT_IMPORT));
1573
    } else {
1574
        // Fetch all the ones corresponding to the $courseID requested
1575
        $recordings_imported = $DB->get_records('bigbluebuttonbn_logs', array('courseid' => $courseID, 'log' => BIGBLUEBUTTONBN_LOG_EVENT_IMPORT));
1576
    }
1577
    return $recordings_imported;
1578
}
1579
1580
function bigbluebuttonbn_getRecordingsImportedArray($courseID, $bigbluebuttonbnID=NULL) {
1581
    $recordings_imported = bigbluebuttonbn_getRecordingsImported($courseID, $bigbluebuttonbnID);
1582
    $recordings_imported_array = bigbluebuttonbn_import_get_recordings_imported($recordings_imported);
1583
    return $recordings_imported_array;
1584
}
1585
1586
function bigbluebuttonbn_getRecordingsImportedAllInstances($recordID) {
1587
    global $DB, $CFG;
1588
1589
    $recordings_imported = $DB->get_records_sql('SELECT * FROM '.$CFG->prefix.'bigbluebuttonbn_logs WHERE log=? AND '.$DB->sql_like('meta', '?'), array( BIGBLUEBUTTONBN_LOG_EVENT_IMPORT, '%'.$recordID.'%' ));
1590
    return $recordings_imported;
1591
}
1592
1593
function bigbluebuttonbn_getRecordingsImportedAllInstancesArray($recordID) {
1594
    $recordings_imported = bigbluebuttonbn_getRecordingsImportedAllInstances($recordID);
1595
    $recordings_imported_array = bigbluebuttonbn_import_get_recordings_imported($recordings_imported);
1596
    return $recordings_imported_array;
1597
}
1598
1599
function bigbluebuttonbn_debugdisplay() {
1600
    global $CFG;
1601
1602
    return (bool)$CFG->debugdisplay;
1603
}
1604
1605
function bigbluebuttonbn_html2text($html, $len) {
1606
    $text = strip_tags($html);
1607
    $text = str_replace("&nbsp;", ' ', $text);
1608
    if( strlen($text) > $len )
1609
        $text = substr($text, 0, $len)."...";
1610
    else
1611
        $text = substr($text, 0, $len);
1612
    return $text;
1613
}