From 04b2d6d4435f81ef6243586e9dbd03185b519381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5var=20Aamb=C3=B8=20Fosstveit?= Date: Tue, 24 Mar 2020 01:43:40 +0100 Subject: [PATCH] Add "close meeting" function for moderator --- app/src/RoomClient.js | 20 +++++++++ app/src/actions/roomActions.js | 6 +++ .../ParticipantList/ListModerator.js | 17 +++++++ app/src/reducers/room.js | 44 +++++++++++-------- server/lib/Room.js | 27 ++++++++++++ 5 files changed, 95 insertions(+), 19 deletions(-) diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index ad4955a..520b034 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1178,6 +1178,26 @@ export default class RoomClient roomActions.setStopAllVideoInProgress(false)); } + async closeMeeting() + { + logger.debug('closeMeeting()'); + + store.dispatch( + roomActions.setCloseMeetingInProgress(true)); + + try + { + await this.sendRequest('moderator:closeMeeting'); + } + catch (error) + { + logger.error('closeMeeting() failed: %o', error); + } + + store.dispatch( + roomActions.setCloseMeetingInProgress(false)); + } + // type: mic/webcam/screen // mute: true/false async modifyPeerConsumer(peerId, type, mute) diff --git a/app/src/actions/roomActions.js b/app/src/actions/roomActions.js index 9ad1e08..6003b9e 100644 --- a/app/src/actions/roomActions.js +++ b/app/src/actions/roomActions.js @@ -121,4 +121,10 @@ export const setStopAllVideoInProgress = (flag) => ({ type : 'STOP_ALL_VIDEO_IN_PROGRESS', payload : { flag } + }); + +export const setCloseMeetingInProgress = (flag) => + ({ + type : 'CLOSE_MEETING_IN_PROGRESS', + payload : { flag } }); \ No newline at end of file diff --git a/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js b/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js index 66f64bd..1c711a1 100644 --- a/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js +++ b/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js @@ -71,6 +71,23 @@ const ListModerator = (props) => defaultMessage='Stop all video' /> +
+
); }; diff --git a/app/src/reducers/room.js b/app/src/reducers/room.js index 9d483b8..d963a0c 100644 --- a/app/src/reducers/room.js +++ b/app/src/reducers/room.js @@ -1,24 +1,27 @@ const initialState = { - name : '', - state : 'new', // new/connecting/connected/disconnected/closed, - locked : false, - inLobby : false, - signInRequired : false, - accessCode : '', // access code to the room if locked and joinByAccessCode == true - joinByAccessCode : true, // if true: accessCode is a possibility to open the room - activeSpeakerId : null, - torrentSupport : false, - showSettings : false, - fullScreenConsumer : null, // ConsumerID - windowConsumer : null, // ConsumerID - toolbarsVisible : true, - mode : 'democratic', - selectedPeerId : null, - spotlights : [], - settingsOpen : false, - lockDialogOpen : false, - joined : false + name : '', + state : 'new', // new/connecting/connected/disconnected/closed, + locked : false, + inLobby : false, + signInRequired : false, + accessCode : '', // access code to the room if locked and joinByAccessCode == true + joinByAccessCode : true, // if true: accessCode is a possibility to open the room + activeSpeakerId : null, + torrentSupport : false, + showSettings : false, + fullScreenConsumer : null, // ConsumerID + windowConsumer : null, // ConsumerID + toolbarsVisible : true, + mode : 'democratic', + selectedPeerId : null, + spotlights : [], + settingsOpen : false, + lockDialogOpen : false, + joined : false, + muteAllInProgress : false, + stopAllVideoInProgress : false, + closeMeetingInProgress : false }; const room = (state = initialState, action) => @@ -169,6 +172,9 @@ const room = (state = initialState, action) => case 'STOP_ALL_VIDEO_IN_PROGRESS': return { ...state, stopAllVideoInProgress: action.payload.flag }; + case 'CLOSE_MEETING_IN_PROGRESS': + return { ...state, closeMeetingInProgress: action.payload.flag }; + default: return state; } diff --git a/server/lib/Room.js b/server/lib/Room.js index af5bea5..6ac3746 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -1105,6 +1105,33 @@ class Room extends EventEmitter break; } + case 'moderator:closeMeeting': + { + if ( + !peer.hasRole(userRoles.MODERATOR) && + !peer.hasRole(userRoles.ADMIN) + ) + throw new Error('peer does not have moderator priveleges'); + + this._notification( + peer.socket, + 'moderator:kick', + null, + true + ); + + // Close the peers. + for (const kickedPeer in this._peers) + { + if (peer !== kickedPeer) + kickedPeer.close(); + } + + cb(); + + break; + } + case 'moderator:kickPeer': { if (