Show a browser notification when a user is waiting to join a room

The owner of a room receives a browser notification if he has the page open
and another person tries to join his room.
This commit is contained in:
Leonardo Crauss Daronco 2016-12-09 13:52:53 -02:00
parent 6726504ec3
commit bf7d087f45
7 changed files with 63 additions and 2 deletions

View File

@ -21,7 +21,7 @@
$(".center-panel-wrapper").html(html);
displayRoomURL();
});
}
};
var initRooms = function() {
App.messages = App.cable.subscriptions.create({
@ -43,6 +43,13 @@
} else if (data.action === 'meeting_ended') {
sessionStatusRefresh($('.meeting-url').val());
showAlert(I18n.meeting_ended, 4000);
} else if (data.action === 'user_waiting') {
// show a browser notification only to the owner
if (GreenLight.user.roomOwner) {
showNotification(I18n.user_waiting_title, {
body: I18n.user_waiting_body.replace(/%{user}/, data.user)
});
}
}
}
});

View File

@ -32,7 +32,7 @@ var loopJoin = function() {
jqxhr.fail(function(xhr, status, error) {
console.info("meeting join failed");
});
}
};
var alertTimeout = null;
var showAlert = function(html, timeout_delay) {
@ -54,3 +54,19 @@ var showAlert = function(html, timeout_delay) {
var displayRoomURL = function() {
$('.meeting-url').val(Meeting.getInstance().getURL());
};
var showNotification = function(title, options) {
if (Notification.permission === "granted") {
var icon = '<%= asset_path("bbb-logo.png") %>';
options = $.extend(options, {
icon: icon
});
var notification = new Notification(title, options);
notification.onclick = function() {
window.focus();
};
}
};
// TODO: only need permissions if the user is signed in
Notification.requestPermission();

View File

@ -52,8 +52,13 @@ class BbbController < ApplicationController
options
)
# the user can join the meeting
if bbb_res[:returncode] && current_user && current_user == user
JoinMeetingJob.perform_later(user.encrypted_id)
# user will be waiting for a moderator
else
NotifyUserWaitingJob.perform_later(user.encrypted_id, params[:name])
end
render_bbb_response bbb_res, bbb_res[:response]

View File

@ -15,4 +15,8 @@
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
module UsersHelper
def is_room_owner
token = current_user ? current_user.encrypted_id : nil
token.present? && params[:id].present? && token == params[:id]
end
end

View File

@ -0,0 +1,24 @@
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/.
#
# Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below).
#
# This program is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free Software
# Foundation; either version 3.0 of the License, or (at your option) any later
# version.
#
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
class NotifyUserWaitingJob < ApplicationJob
queue_as :default
def perform(room, user)
ActionCable.server.broadcast "#{room}_meeting_updates_channel",
{ action: 'user_waiting', user: user }
end
end

View File

@ -77,10 +77,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
</body>
</html>
<!-- Global javascript variables and helpers -->
<script type="text/javascript">
window.I18n = <%= client_translations.to_json.html_safe %>
window.GreenLight = {};
window.GreenLight.META_LISTED = "<%= BbbApi::META_LISTED %>";
window.GreenLight.META_TOKEN = "<%= BbbApi::META_TOKEN %>";
window.GreenLight.META_HOOK_URL = "<%= BbbApi::META_HOOK_URL %>";
window.GreenLight.user = {};
window.GreenLight.user.roomOwner = <%= is_room_owner %>;
</script>

View File

@ -54,6 +54,8 @@ en-US:
recording_unlisted: Recording was unlisted
recording_unpublished: Recording was unpublished
unpublish_recording: Hide recording
user_waiting_body: "%{user} is waiting to join your room!"
user_waiting_title: A user is waiting
copied: Copied
copy_error: Use Ctrl-c to copy
create_session: Create a Session