Completed
Push — master ( 1d1df5...87b1fe )
by Jesus
07:01
created

M.mod_bigbluebuttonbn.rooms.msg_attendees_in   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 1 Features 0
Metric Value
cc 4
nc 4
nop 2
dl 0
loc 20
rs 9.2
c 5
b 1
f 0
1
// This file is part of Moodle - http://moodle.org/
2
//
3
// Moodle is free software: you can redistribute it and/or modify
4
// it under the terms of the GNU General Public License as published by
5
// the Free Software Foundation, either version 3 of the License, or
6
// (at your option) any later version.
7
//
8
// Moodle is distributed in the hope that it will be useful,
9
// but WITHOUT ANY WARRANTY; without even the implied warranty of
10
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
// GNU General Public License for more details.
12
//
13
// You should have received a copy of the GNU General Public License
14
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
15
16
/** global: M */
17
/** global: Y */
18
19
M.mod_bigbluebuttonbn = M.mod_bigbluebuttonbn || {};
20
21
M.mod_bigbluebuttonbn.rooms = {
22
23
    datasource: null,
24
    bigbluebuttonbn: {},
25
    panel: null,
26
    pinginterval: null,
27
28
    /**
29
     * Initialise the broker code.
30
     *
31
     * @method init
32
     */
33
    init: function(bigbluebuttonbn) {
34
        this.datasource = new Y.DataSource.Get({
35
            source: M.cfg.wwwroot + "/mod/bigbluebuttonbn/bbb_broker.php?"
36
        });
37
        this.bigbluebuttonbn = bigbluebuttonbn;
38
        this.pinginterval = bigbluebuttonbn.ping_interval;
39
        if (this.pinginterval === 0) {
40
            this.pinginterval = 10000;
41
        }
42
43
        if (this.bigbluebuttonbn.profile_features.includes('all') || this.bigbluebuttonbn.profile_features.includes('showroom')) {
44
            this.init_room();
45
        }
46
    },
47
48
    init_room: function() {
49
        if (this.bigbluebuttonbn.activity !== 'open') {
50
            var status_bar = [M.util.get_string('view_message_conference_has_ended', 'bigbluebuttonbn')];
51
            if (this.bigbluebuttonbn.activity !== 'ended') {
52
                status_bar = [
53
                    M.util.get_string('view_message_conference_not_started', 'bigbluebuttonbn'),
54
                    this.bigbluebuttonbn.opening,
55
                    this.bigbluebuttonbn.closing
56
                  ];
57
            }
58
            Y.DOM.addHTML(Y.one('#status_bar'), this.init_status_bar(status_bar));
59
            return;
60
        }
61
        this.update_room();
62
    },
63
64
    update_room: function(f) {
65
        var forced = 'false';
66
        if (typeof f !== 'undefined' && f) {
67
            forced = 'true';
68
        }
69
        var id = this.bigbluebuttonbn.meetingid;
70
        var bnid = this.bigbluebuttonbn.bigbluebuttonbnid;
71
72
        this.datasource.sendRequest({
73
            request: 'action=meeting_info&id=' + id + '&bigbluebuttonbn=' + bnid + '&forced=' + forced,
74
            callback: {
75
                success: function(e) {
76
                    Y.DOM.addHTML(Y.one('#status_bar'),
77
                        M.mod_bigbluebuttonbn.rooms.init_status_bar(e.data.status.message));
78
                    Y.DOM.addHTML(Y.one('#control_panel'),
79
                        M.mod_bigbluebuttonbn.rooms.init_control_panel(e.data));
80
                    if (typeof e.data.status.can_join != 'undefined') {
81
                        Y.DOM.addHTML(Y.one('#join_button'),
82
                            M.mod_bigbluebuttonbn.rooms.init_join_button(e.data.status));
83
                    }
84
                    if (typeof e.data.status.can_end != 'undefined' && e.data.status.can_end) {
85
                        Y.DOM.addHTML(Y.one('#end_button'),
86
                            M.mod_bigbluebuttonbn.rooms.init_end_button(e.data.status));
87
                    }
88
                    if (!e.data.status.can_join) {
89
                        M.mod_bigbluebuttonbn.rooms.wait_moderator({
90
                            id: id,
91
                            bnid: bnid
92
                        });
93
                    }
94
                }
95
            }
96
        });
97
    },
98
99
    init_status_bar: function(status_message) {
100
        var status_bar_span = Y.DOM.create('<span id="status_bar_span">');
101
102
        if (status_message.constructor !== Array) {
103
            Y.DOM.setText(status_bar_span, status_message);
104
            return status_bar_span;
105
        }
106
107
        for (var message in status_message) {
108
            if (!status_message.hasOwnProperty(message)) {
109
                continue; // Skip keys from the prototype.
110
            }
111
            var status_bar_span_span = Y.DOM.create('<span id="status_bar_span_span">');
112
            Y.DOM.setText(status_bar_span_span, status_message[message]);
113
            Y.DOM.addHTML(status_bar_span, status_bar_span_span);
114
            Y.DOM.addHTML(status_bar_span, Y.DOM.create('<br>'));
115
        }
116
        return status_bar_span;
117
    },
118
119
    init_control_panel: function(data) {
120
        var control_panel_div = Y.DOM.create('<div>');
121
122
        Y.DOM.setAttribute(control_panel_div, 'id', 'control_panel_div');
123
        var control_panel_div_html = '';
124
        if (data.running) {
125
            control_panel_div_html += this.msg_started_at(data.info.startTime) + ' ';
126
            control_panel_div_html += this.msg_attendees_in(data.info.moderatorCount, data.info.participantCount);
127
        }
128
        Y.DOM.addHTML(control_panel_div, control_panel_div_html);
129
130
        return (control_panel_div);
131
    },
132
133
    msg_started_at: function(startTime) {
134
        var start_timestamp = (parseInt(startTime, 10) - parseInt(startTime, 10) % 1000);
135
        var date = new Date(start_timestamp);
136
        var hours = date.getHours();
137
        var minutes = date.getMinutes();
138
        var started_at = M.util.get_string('view_message_session_started_at', 'bigbluebuttonbn');
139
140
        return started_at + ' <b>' + hours + ':' + (minutes < 10 ? '0' : '') + minutes + '</b>.';
141
    },
142
143
    msg_moderators_in: function(moderators) {
144
        var msg_moderators = M.util.get_string('view_message_moderators', 'bigbluebuttonbn');
145
        if (moderators == 1) {
146
            msg_moderators = M.util.get_string('view_message_moderator', 'bigbluebuttonbn');
147
        }
148
        return msg_moderators;
149
    },
150
151
    msg_viewers_in: function(viewers) {
152
        var msg_viewers = M.util.get_string('view_message_viewers', 'bigbluebuttonbn');
153
        if (viewers == 1) {
154
            msg_viewers = M.util.get_string('view_message_viewer', 'bigbluebuttonbn');
155
        }
156
        return msg_viewers;
157
    },
158
159
    msg_attendees_in: function(moderators, participants) {
160
161
        if (!this.has_participants()) {
162
            return M.util.get_string('view_message_session_no_users', 'bigbluebuttonbn') + '.';
163
        }
164
165
        var msg_moderators = this.msg_moderators_in(moderators);
166
        var viewers = participants - moderators;
167
        var msg_viewers = this.msg_viewers_in(viewers);
168
        var msg = M.util.get_string('view_message_session_has_users', 'bigbluebuttonbn');
169
        if (participants > 1) {
170
            return msg + ' <b>' + moderators + '</b> ' + msg_moderators + ' and <b>' + viewers + '</b> ' + msg_viewers + '.';
171
        }
172
173
        if (moderators > 0) {
174
            return msg + ' <b>1</b> ' + msg_moderators + '.';
175
        }
176
177
        return msg + ' <b>1</b> ' + msg_viewers + '.';
178
    },
179
180
    has_participants: function(participants) {
181
        return (typeof participants != 'undefined' && participants > 0);
182
    },
183
184
    init_join_button: function(status) {
185
        var join_button_input = Y.DOM.create('<input>');
186
187
        Y.DOM.setAttribute(join_button_input, 'id', 'join_button_input');
188
        Y.DOM.setAttribute(join_button_input, 'type', 'button');
189
        Y.DOM.setAttribute(join_button_input, 'value', status.join_button_text);
190
        Y.DOM.setAttribute(join_button_input, 'class', 'btn btn-primary');
191
192
        var input_html = 'M.mod_bigbluebuttonbn.rooms.join(\'' + status.join_url + '\');';
193
        Y.DOM.setAttribute(join_button_input, 'onclick', input_html);
194
195
        if (!status.can_join) {
196
            // Disable join button.
197
            Y.DOM.setAttribute(join_button_input, 'disabled', true);
198
            var status_bar_span = Y.one('#status_bar_span');
199
            // Create a img element.
200
            var spinning_wheel = Y.DOM.create('<img>');
201
            Y.DOM.setAttribute(spinning_wheel, 'id', 'spinning_wheel');
202
            Y.DOM.setAttribute(spinning_wheel, 'src', 'pix/processing16.gif');
203
            // Add the spinning wheel.
204
            Y.DOM.addHTML(status_bar_span, '&nbsp;');
205
            Y.DOM.addHTML(status_bar_span, spinning_wheel);
206
        }
207
208
        return join_button_input;
209
    },
210
211
    init_end_button: function(status) {
212
        var end_button_input = Y.DOM.create('<input>');
213
214
        Y.DOM.setAttribute(end_button_input, 'id', 'end_button_input');
215
        Y.DOM.setAttribute(end_button_input, 'type', 'button');
216
        Y.DOM.setAttribute(end_button_input, 'value', status.end_button_text);
217
        Y.DOM.setAttribute(end_button_input, 'class', 'btn btn-secondary');
218
        if (status.can_end) {
219
            Y.DOM.setAttribute(end_button_input, 'onclick', 'M.mod_bigbluebuttonbn.broker.end_meeting();');
220
        }
221
222
        return end_button_input;
223
    },
224
225
    end_meeting: function() {
226
        Y.one('#control_panel_div').remove();
227
        Y.one('#join_button').hide();
228
        Y.one('#end_button').hide();
229
    },
230
231
    remote_update: function(delay) {
232
        setTimeout(function() {
233
            M.mod_bigbluebuttonbn.rooms.clean_room();
234
            M.mod_bigbluebuttonbn.rooms.update_room(true);
235
        }, delay);
236
    },
237
238
    clean_room: function() {
239
        Y.one('#status_bar_span').remove();
240
        Y.one('#control_panel_div').remove();
241
        Y.one('#join_button').setContent('');
242
        Y.one('#end_button').setContent('');
243
    },
244
245
    window_close: function() {
246
        window.onunload = function() {
247
            /* global: opener */
248
            opener.M.mod_bigbluebuttonbn.rooms.remote_update(5000);
249
        };
250
        window.close();
251
    },
252
253
    wait_moderator: function(payload) {
254
        this.datasource.sendRequest({
255
            request: "action=meeting_info&id=" + payload.id + "&bigbluebuttonbn=" + payload.bnid,
256
            callback: {
257
                success: function(e) {
258
                    if (e.data.running) {
259
                        M.mod_bigbluebuttonbn.rooms.clean_room();
260
                        M.mod_bigbluebuttonbn.rooms.update_room();
261
                    }
262
263
                    return setTimeout(((function() {
264
                        return function() {
265
                            M.mod_bigbluebuttonbn.rooms.wait_moderator(payload);
266
                        };
267
                    })(this)), M.mod_bigbluebuttonbn.rooms.pinginterval);
268
                },
269
                failure: function(e) {
270
                    payload.message = e.error.message;
271
                }
272
            }
273
        });
274
    },
275
276
    join: function(join_url) {
277
        M.mod_bigbluebuttonbn.broker.join_redirect(join_url);
278
        // Update view.
279
        setTimeout(function() {
280
            M.mod_bigbluebuttonbn.rooms.clean_room();
281
            M.mod_bigbluebuttonbn.rooms.update_room(true);
282
        }, 15000);
283
    }
284
};
285