Add support for moderating rooms. Kick user, mute all users, stop all videos.

This commit is contained in:
Håvar Aambø Fosstveit
2020-03-22 00:43:47 +01:00
parent c70740f5c7
commit 7f2f27b858
15 changed files with 515 additions and 57 deletions
+4 -4
View File
@@ -75,13 +75,13 @@ class Lobby extends EventEmitter
if (peer)
{
peer.socket.removeListener('request', peer.socketRequestHandler);
peer.removeListener('rolesChange', peer.roleChangeHandler);
peer.removeListener('gotRole', peer.gotRoleHandler);
peer.removeListener('displayNameChanged', peer.displayNameChangeHandler);
peer.removeListener('pictureChanged', peer.pictureChangeHandler);
peer.removeListener('close', peer.closeHandler);
peer.socketRequestHandler = null;
peer.roleChangeHandler = null;
peer.gotRoleHandler = null;
peer.displayNameChangeHandler = null;
peer.pictureChangeHandler = null;
peer.closeHandler = null;
@@ -116,7 +116,7 @@ class Lobby extends EventEmitter
});
};
peer.roleChangeHandler = () =>
peer.gotRoleHandler = () =>
{
logger.info('parkPeer() | rolesChange [peer:"%s"]', peer.id);
@@ -156,7 +156,7 @@ class Lobby extends EventEmitter
this._peers.set(peer.id, peer);
peer.on('rolesChange', peer.roleChangeHandler);
peer.on('gotRole', peer.gotRoleHandler);
peer.on('displayNameChanged', peer.displayNameChangeHandler);
peer.on('pictureChanged', peer.pictureChangeHandler);
+4 -3
View File
@@ -224,7 +224,7 @@ class Peer extends EventEmitter
logger.info('addRole() | [newRole:"%s]"', newRole);
this.emit('rolesChange', { newRole });
this.emit('gotRole', { newRole });
}
}
@@ -236,7 +236,7 @@ class Peer extends EventEmitter
logger.info('removeRole() | [oldRole:"%s]"', oldRole);
this.emit('rolesChange', { oldRole });
this.emit('lostRole', { oldRole });
}
}
@@ -302,7 +302,8 @@ class Peer extends EventEmitter
{
id : this.id,
displayName : this.displayName,
picture : this.picture
picture : this.picture,
roles : this.roles
};
return peerInfo;
+95 -2
View File
@@ -420,6 +420,32 @@ class Room extends EventEmitter
picture : peer.picture
}, true);
});
peer.on('gotRole', ({ newRole }) =>
{
// Ensure the Peer is joined.
if (!peer.joined)
return;
// Spread to others
this._notification(peer.socket, 'gotRole', {
peerId : peer.id,
role : newRole
}, true);
});
peer.on('lostRole', ({ oldRole }) =>
{
// Ensure the Peer is joined.
if (!peer.joined)
return;
// Spread to others
this._notification(peer.socket, 'lostRole', {
peerId : peer.id,
role : oldRole
}, true);
});
}
async _handleSocketRequest(peer, request, cb)
@@ -483,7 +509,10 @@ class Room extends EventEmitter
.filter((joinedPeer) => joinedPeer.id !== peer.id)
.map((joinedPeer) => (joinedPeer.peerInfo));
cb(null, { peers: peerInfos });
cb(null, {
roles : peer.roles,
peers : peerInfos
});
// Mark the new Peer as joined.
peer.joined = true;
@@ -511,7 +540,8 @@ class Room extends EventEmitter
{
id : peer.id,
displayName : displayName,
picture : picture
picture : picture,
roles : peer.roles
}
);
}
@@ -1077,6 +1107,69 @@ class Room extends EventEmitter
break;
}
case 'moderator:muteAll':
{
if (
!peer.hasRole(userRoles.MODERATOR) &&
!peer.hasRole(userRoles.ADMIN)
)
throw new Error('peer does not have moderator priveleges');
// Spread to others
this._notification(peer.socket, 'moderator:mute', {
peerId : peer.id
}, true);
cb();
break;
}
case 'moderator:stopAllVideo':
{
if (
!peer.hasRole(userRoles.MODERATOR) &&
!peer.hasRole(userRoles.ADMIN)
)
throw new Error('peer does not have moderator priveleges');
// Spread to others
this._notification(peer.socket, 'moderator:stopVideo', {
peerId : peer.id
}, true);
cb();
break;
}
case 'moderator:kickPeer':
{
if (
!peer.hasRole(userRoles.MODERATOR) &&
!peer.hasRole(userRoles.ADMIN)
)
throw new Error('peer does not have moderator priveleges');
const { peerId } = request.data;
const kickPeer = this._peers[peerId];
if (!kickPeer)
throw new Error(`peer with id "${peerId}" not found`);
this._notification(
kickPeer.socket,
'moderator:kick'
);
kickPeer.close();
cb();
break;
}
default:
{
logger.error('unknown request.method "%s"', request.method);
+4 -4
View File
@@ -1,12 +1,12 @@
module.exports = {
// Allowed to enter locked rooms + all other priveleges
ADMIN : 0,
ADMIN : 'admin',
// Allowed to enter restricted rooms if configured.
// Allowed to moderate users in a room (mute all,
// spotlight video, kick users)
MODERATOR : 1,
MODERATOR : 'moderator',
// Same as MODERATOR, but can't moderate users
AUTHENTICATED : 2,
AUTHENTICATED : 'authenticated',
// No priveleges
ALL : 3
ALL : 'normal'
};