Add support for moderating rooms. Kick user, mute all users, stop all videos.
This commit is contained in:
+4
-4
@@ -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
@@ -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
@@ -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
@@ -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'
|
||||
};
|
||||
Reference in New Issue
Block a user