From 285520dff7fc29afc111a99f75b325ff750d1709 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 10 Nov 2016 16:24:35 -0800 Subject: [PATCH 1/6] Initial cut No script work yet, just first stab at underpinnings --- assignment-client/src/audio/AudioMixer.cpp | 20 +++++++++++- assignment-client/src/audio/AudioMixer.h | 1 + .../src/audio/AudioMixerClientData.h | 5 +++ domain-server/src/DomainServer.cpp | 3 +- .../src/DomainServerSettingsManager.cpp | 32 +++++++++++++++++++ .../src/DomainServerSettingsManager.h | 1 + libraries/networking/src/NodeList.cpp | 23 +++++++++++++ libraries/networking/src/NodeList.h | 1 + .../networking/src/udt/PacketHeaders.cpp | 3 +- libraries/networking/src/udt/PacketHeaders.h | 3 +- .../src/UsersScriptingInterface.cpp | 5 +++ .../src/UsersScriptingInterface.h | 1 + 12 files changed, 94 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index f8077303d2..17198299b4 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -94,6 +94,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); + packetReceiver.registerListener(PacketType::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled); } @@ -599,6 +600,19 @@ void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) { }); } +void AudioMixer::handleNodeMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + auto nodeList = DependencyManager::get(); + QUuid nodeUUID = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + + auto node = nodeList->nodeWithUUID(nodeUUID); + if (node) { + // we need to set a flag so we send them the appropriate packet to mute them + + } else { + qWarning() << "Node mute packet received for unknown node " << uuidStringWithoutCurlyBraces(nodeUUID); + } +} + void AudioMixer::handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode) { auto clientData = dynamic_cast(sendingNode->getLinkedData()); if (clientData) { @@ -814,9 +828,13 @@ void AudioMixer::broadcastMixes() { // if the stream should be muted, send mute packet if (nodeData->getAvatarAudioStream() - && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { + && (shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness()) + || nodeData->shouldMuteClient())) { auto mutePacket = NLPacket::create(PacketType::NoisyMute, 0); nodeList->sendPacket(std::move(mutePacket), *node); + + // probably now we just reset the flag, once should do it (?) + nodeData->setShouldMuteClient(false); } if (node->getType() == NodeType::Agent && node->getActiveSocket() diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 3c68e4c6af..91eafadd9d 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -49,6 +49,7 @@ private slots: void handleNodeKilled(SharedNodePointer killedNode); void handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleNodeMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void removeHRTFsForFinishedInjector(const QUuid& streamID); diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 52c659c240..c74461a444 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -86,6 +86,9 @@ public: bool shouldFlushEncoder() { return _shouldFlushEncoder; } QString getCodecName() { return _selectedCodecName; } + + bool shouldMuteClient() { return _shouldMuteClient; } + void setShouldMuteClient(bool shouldMuteClient) { _shouldMuteClient = shouldMuteClient; } signals: void injectorStreamFinished(const QUuid& streamIdentifier); @@ -114,6 +117,8 @@ private: Decoder* _decoder{ nullptr }; // for mic stream bool _shouldFlushEncoder { false }; + + bool _shouldMuteClient { false }; }; #endif // hifi_AudioMixerClientData_h diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d13f9b883f..b58dd0fe0e 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -498,7 +498,8 @@ void DomainServer::setupNodeListAndAssignments() { // NodeList won't be available to the settings manager when it is created, so call registerListener here packetReceiver.registerListener(PacketType::DomainSettingsRequest, &_settingsManager, "processSettingsRequestPacket"); packetReceiver.registerListener(PacketType::NodeKickRequest, &_settingsManager, "processNodeKickRequestPacket"); - + packetReceiver.registerListener(PacketType::NodeMuteRequest, &_settingsManager, "processNodeMuteRequestPacket"); + // register the gatekeeper for the packets it needs to receive packetReceiver.registerListener(PacketType::DomainConnectRequest, &_gatekeeper, "processConnectRequestPacket"); packetReceiver.registerListener(PacketType::ICEPing, &_gatekeeper, "processICEPingPacket"); diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index c7944bbcad..ff6c4d62c6 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -634,6 +634,38 @@ bool DomainServerSettingsManager::ensurePermissionsForGroupRanks() { return changed; } +void DomainServerSettingsManager::processNodeMuteRequestPacket(QSharedPointer message, SharedNodePointer sendingNode) { + if (sendingNode->getCanKick()) { + QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + + if (!nodeUUID.isNull() && nodeUUID != sendingNode->getUUID()) { + // make sure we actually have a node with this UUID + auto limitedNodeList = DependencyManager::get(); + + auto matchingNode = limitedNodeList->nodeWithUUID(nodeUUID); + + if (matchingNode) { + // send this along to the audio mixer + auto limitedNodeList = DependencyManager::get(); + auto audioMixer = limitedNodeList->soloNodeOfType(NodeType::AudioMixer); + if (audioMixer) { + auto packet = NLPacket::create(PacketType::NodeMuteRequest, NUM_BYTES_RFC4122_UUID, true); + packet->write(nodeUUID.toRfc4122()); + limitedNodeList->sendPacket(std::move(packet), *audioMixer); + } else { + qWarning() << "Couldn't find an audio mixer, cannot process node mute request"; + } + } else { + qWarning() << "Node mute request received for unknown node. Refusing to process."; + } + } else { + qWarning() << "Node kick request received for invalid node ID or from node being kicked. Refusing to process."; + } + } else { + qWarning() << "Refusing to process a kick packet from node" << uuidStringWithoutCurlyBraces(sendingNode->getUUID()) + << "that does not have kick permissions."; + } +} void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode) { // before we do any processing on this packet make sure it comes from a node that is allowed to kick diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index c067377ffc..7f874226bb 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -105,6 +105,7 @@ public slots: private slots: void processSettingsRequestPacket(QSharedPointer message); void processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode); + void processNodeMuteRequestPacket(QSharedPointer message, SharedNodePointer sendingNode); private: QStringList _argumentList; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 82bac4cc3d..782eb8da3e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -815,3 +815,26 @@ void NodeList::kickNodeBySessionID(const QUuid& nodeID) { } } + +void NodeList::muteNodeBySessionID(const QUuid& nodeID) { + // cannot mute yourself, or nobody + if (!nodeID.isNull() && _sessionUUID != nodeID ) { + if (getThisNodeCanKick()) { + // setup the packet + auto kickPacket = NLPacket::create(PacketType::NodeMuteRequest, NUM_BYTES_RFC4122_UUID, true); + + // write the node ID to the packet + kickPacket->write(nodeID.toRfc4122()); + + qDebug() << "Sending packet to mute node" << uuidStringWithoutCurlyBraces(nodeID); + + sendPacket(std::move(kickPacket), _domainHandler.getSockAddr()); + } else { + qWarning() << "You do not have permissions to mute in this domain." + << "Request to mute node" << uuidStringWithoutCurlyBraces(nodeID) << "will not be sent"; + } + } else { + qWarning() << "NodeList::muteNodeBySessionID called with an invalid ID or an ID which matches the current session ID."; + + } +} diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 41a4a51515..4c06a13469 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -74,6 +74,7 @@ public: bool isIgnoringNode(const QUuid& nodeID) const; void kickNodeBySessionID(const QUuid& nodeID); + void muteNodeBySessionID(const QUuid& nodeID); public slots: void reset(); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 6b86b7bc6e..9bbf4dc134 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -26,7 +26,8 @@ const QSet NON_VERIFIED_PACKETS = QSet() << PacketType::NodeJsonStats << PacketType::EntityQuery << PacketType::OctreeDataNack << PacketType::EntityEditNack << PacketType::DomainListRequest << PacketType::StopNode - << PacketType::DomainDisconnectRequest << PacketType::NodeKickRequest; + << PacketType::DomainDisconnectRequest << PacketType::NodeKickRequest + << PacketType::NodeMuteRequest; const QSet NON_SOURCED_PACKETS = QSet() << PacketType::StunResponse << PacketType::CreateAssignment << PacketType::RequestAssignment diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 0eca24176c..a3a7287ad0 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -99,7 +99,8 @@ public: SelectedAudioFormat, MoreEntityShapes, NodeKickRequest, - LAST_PACKET_TYPE = NodeKickRequest + NodeMuteRequest, + LAST_PACKET_TYPE = NodeMuteRequest }; }; diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index 69ad8e04ad..702368c2b3 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -29,6 +29,11 @@ void UsersScriptingInterface::kick(const QUuid& nodeID) { DependencyManager::get()->kickNodeBySessionID(nodeID); } +void UsersScriptingInterface::mute(const QUuid& nodeID) { + // ask the NodeList to mute the user with the given session ID + DependencyManager::get()->muteNodeBySessionID(nodeID); +} + bool UsersScriptingInterface::getCanKick() { // ask the NodeList to return our ability to kick return DependencyManager::get()->getThisNodeCanKick(); diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 712eeedeb6..3c98d0a393 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -28,6 +28,7 @@ public: public slots: void ignore(const QUuid& nodeID); void kick(const QUuid& nodeID); + void mute(const QUuid& nodeID); bool getCanKick(); From 80d4033767e4822bdb34d8afb3a25831eef4f62a Mon Sep 17 00:00:00 2001 From: David Kelly Date: Thu, 10 Nov 2016 17:13:50 -0800 Subject: [PATCH 2/6] oops forgot one thing... --- assignment-client/src/audio/AudioMixer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 17198299b4..7b9f08e837 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -607,6 +607,8 @@ void AudioMixer::handleNodeMuteRequestPacket(QSharedPointer pac auto node = nodeList->nodeWithUUID(nodeUUID); if (node) { // we need to set a flag so we send them the appropriate packet to mute them + AudioMixerClientData* nodeData = (AudioMixerClientData*)node->getLinkedData(); + nodeData->setShouldMuteClient(true); } else { qWarning() << "Node mute packet received for unknown node " << uuidStringWithoutCurlyBraces(nodeUUID); From 9c8f22e0e782f0cd5bbc57d826612e303640d766 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 11 Nov 2016 09:30:58 -0800 Subject: [PATCH 3/6] straight to audio mixer since we can get the canKick there too. (doh) --- assignment-client/src/audio/AudioMixer.cpp | 20 ++++++----- domain-server/src/DomainServer.cpp | 1 - .../src/DomainServerSettingsManager.cpp | 33 ------------------- .../src/DomainServerSettingsManager.h | 1 - libraries/networking/src/NodeList.cpp | 19 +++++++---- 5 files changed, 24 insertions(+), 50 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 7b9f08e837..b0a739caba 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -95,7 +95,8 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); - + + nodeList->addNodeTypeToInterestSet(NodeType::DomainServer); connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled); } @@ -603,15 +604,18 @@ void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) { void AudioMixer::handleNodeMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { auto nodeList = DependencyManager::get(); QUuid nodeUUID = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + if (sendingNode->getCanKick()) { + auto node = nodeList->nodeWithUUID(nodeUUID); + if (node) { + // we need to set a flag so we send them the appropriate packet to mute them + AudioMixerClientData* nodeData = (AudioMixerClientData*)node->getLinkedData(); + nodeData->setShouldMuteClient(true); - auto node = nodeList->nodeWithUUID(nodeUUID); - if (node) { - // we need to set a flag so we send them the appropriate packet to mute them - AudioMixerClientData* nodeData = (AudioMixerClientData*)node->getLinkedData(); - nodeData->setShouldMuteClient(true); - + } else { + qWarning() << "Node mute packet received for unknown node " << uuidStringWithoutCurlyBraces(nodeUUID); + } } else { - qWarning() << "Node mute packet received for unknown node " << uuidStringWithoutCurlyBraces(nodeUUID); + qWarning() << "Node mute packet received from node that cannot mute, ignoring"; } } diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index b58dd0fe0e..70ee41e934 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -498,7 +498,6 @@ void DomainServer::setupNodeListAndAssignments() { // NodeList won't be available to the settings manager when it is created, so call registerListener here packetReceiver.registerListener(PacketType::DomainSettingsRequest, &_settingsManager, "processSettingsRequestPacket"); packetReceiver.registerListener(PacketType::NodeKickRequest, &_settingsManager, "processNodeKickRequestPacket"); - packetReceiver.registerListener(PacketType::NodeMuteRequest, &_settingsManager, "processNodeMuteRequestPacket"); // register the gatekeeper for the packets it needs to receive packetReceiver.registerListener(PacketType::DomainConnectRequest, &_gatekeeper, "processConnectRequestPacket"); diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index ff6c4d62c6..a9db2d9b3f 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -634,39 +634,6 @@ bool DomainServerSettingsManager::ensurePermissionsForGroupRanks() { return changed; } -void DomainServerSettingsManager::processNodeMuteRequestPacket(QSharedPointer message, SharedNodePointer sendingNode) { - if (sendingNode->getCanKick()) { - QUuid nodeUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - - if (!nodeUUID.isNull() && nodeUUID != sendingNode->getUUID()) { - // make sure we actually have a node with this UUID - auto limitedNodeList = DependencyManager::get(); - - auto matchingNode = limitedNodeList->nodeWithUUID(nodeUUID); - - if (matchingNode) { - // send this along to the audio mixer - auto limitedNodeList = DependencyManager::get(); - auto audioMixer = limitedNodeList->soloNodeOfType(NodeType::AudioMixer); - if (audioMixer) { - auto packet = NLPacket::create(PacketType::NodeMuteRequest, NUM_BYTES_RFC4122_UUID, true); - packet->write(nodeUUID.toRfc4122()); - limitedNodeList->sendPacket(std::move(packet), *audioMixer); - } else { - qWarning() << "Couldn't find an audio mixer, cannot process node mute request"; - } - } else { - qWarning() << "Node mute request received for unknown node. Refusing to process."; - } - } else { - qWarning() << "Node kick request received for invalid node ID or from node being kicked. Refusing to process."; - } - } else { - qWarning() << "Refusing to process a kick packet from node" << uuidStringWithoutCurlyBraces(sendingNode->getUUID()) - << "that does not have kick permissions."; - } -} - void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode) { // before we do any processing on this packet make sure it comes from a node that is allowed to kick if (sendingNode->getCanKick()) { diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index 7f874226bb..c067377ffc 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -105,7 +105,6 @@ public slots: private slots: void processSettingsRequestPacket(QSharedPointer message); void processNodeKickRequestPacket(QSharedPointer message, SharedNodePointer sendingNode); - void processNodeMuteRequestPacket(QSharedPointer message, SharedNodePointer sendingNode); private: QStringList _argumentList; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 782eb8da3e..7a778edaad 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -820,15 +820,20 @@ void NodeList::muteNodeBySessionID(const QUuid& nodeID) { // cannot mute yourself, or nobody if (!nodeID.isNull() && _sessionUUID != nodeID ) { if (getThisNodeCanKick()) { - // setup the packet - auto kickPacket = NLPacket::create(PacketType::NodeMuteRequest, NUM_BYTES_RFC4122_UUID, true); + auto audioMixer = soloNodeOfType(NodeType::AudioMixer); + if (audioMixer) { + // setup the packet + auto mutePacket = NLPacket::create(PacketType::NodeMuteRequest, NUM_BYTES_RFC4122_UUID, true); - // write the node ID to the packet - kickPacket->write(nodeID.toRfc4122()); + // write the node ID to the packet + mutePacket->write(nodeID.toRfc4122()); - qDebug() << "Sending packet to mute node" << uuidStringWithoutCurlyBraces(nodeID); - - sendPacket(std::move(kickPacket), _domainHandler.getSockAddr()); + qDebug() << "Sending packet to mute node" << uuidStringWithoutCurlyBraces(nodeID); + + sendPacket(std::move(mutePacket), *audioMixer); + } else { + qWarning() << "Couldn't find audio mixer to send node mute request"; + } } else { qWarning() << "You do not have permissions to mute in this domain." << "Request to mute node" << uuidStringWithoutCurlyBraces(nodeID) << "will not be sent"; From 3d7e0758972f32f9b6dc1c701468c7dd294efa23 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 11 Nov 2016 11:18:24 -0800 Subject: [PATCH 4/6] Added mute to mod.js script --- scripts/system/assets/images/mute-target.svg | 33 ++++++++++ scripts/system/mod.js | 66 +++++++++++++++----- 2 files changed, 83 insertions(+), 16 deletions(-) create mode 100755 scripts/system/assets/images/mute-target.svg diff --git a/scripts/system/assets/images/mute-target.svg b/scripts/system/assets/images/mute-target.svg new file mode 100755 index 0000000000..1ed642c79e --- /dev/null +++ b/scripts/system/assets/images/mute-target.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/system/mod.js b/scripts/system/mod.js index ea9355e376..f94be98406 100644 --- a/scripts/system/mod.js +++ b/scripts/system/mod.js @@ -52,7 +52,9 @@ function removeOverlays() { for (var i = 0; i < modOverlayKeys.length; ++i) { var avatarID = modOverlayKeys[i]; - Overlays.deleteOverlay(modOverlays[avatarID]); + for (var j = 0; j < modOverlays[avatarID].length; ++j) { + Overlays.deleteOverlay(modOverlays[avatarID][j]); + } } modOverlays = {}; @@ -74,10 +76,14 @@ function buttonClicked(){ button.clicked.connect(buttonClicked); -function overlayURL() { +function kickOverlayURL() { return ASSETS_PATH + "/images/" + (Users.canKick ? "kick-target.svg" : "ignore-target.svg"); } +function muteOverlayURL() { + return ASSETS_PATH + "/images/" + "mute-target.svg"; +} + function updateOverlays() { if (isShowingOverlays) { @@ -101,20 +107,28 @@ function updateOverlays() { } // setup a position for the overlay that is just above this avatar's head - var overlayPosition = avatar.getJointPosition("Head"); - overlayPosition.y += 0.45; + var kickOverlayPosition = avatar.getJointPosition("Head"); + kickOverlayPosition.y += 0.45; + var muteOverlayPosition = avatar.getJointPosition("Head"); + muteOverlayPosition.y += 0.70; if (avatarID in modOverlays) { // keep the overlay above the current position of this avatar - Overlays.editOverlay(modOverlays[avatarID], { - position: overlayPosition, - url: overlayURL() + Overlays.editOverlay(modOverlays[avatarID][0], { + position: kickOverlayPosition, + url: kickOverlayURL() }); + if (Users.canKick) { + Overlays.editOverlay(modOverlays[avatarID][1], { + position: muteOverlayPosition, + url: muteOverlayURL() + }); + } } else { // add the overlay above this avatar - var newOverlay = Overlays.addOverlay("image3d", { - url: overlayURL(), - position: overlayPosition, + var newKickOverlay = Overlays.addOverlay("image3d", { + url: kickOverlayURL(), + position: kickOverlayPosition, size: 1, scale: 0.4, color: { red: 255, green: 255, blue: 255}, @@ -123,9 +137,24 @@ function updateOverlays() { isFacingAvatar: true, drawInFront: true }); - - // push this overlay to our array of overlays - modOverlays[avatarID] = newOverlay; + + modOverlays[avatarID]=[newKickOverlay]; + + if (Users.canKick) { + var newMuteOverlay = Overlays.addOverlay("image3d", { + url: muteOverlayURL(), + position: muteOverlayPosition, + size: 1, + scale: 0.4, + color: { red: 255, green: 255, blue: 255}, + alpha: 1, + solid: true, + isFacingAvatar: true, + drawInFront: true + }); + // push this overlay to our array of overlays + modOverlays[avatarID].push(newMuteOverlay); + } } } } @@ -138,7 +167,9 @@ AvatarList.avatarRemovedEvent.connect(function(avatarID){ // we are currently showing overlays and an avatar just went away // first remove the rendered overlay - Overlays.deleteOverlay(modOverlays[avatarID]); + for (var overlay in modOverlays[avatarID]) { + Overlays.deleteOverlay(overlay); + } // delete the saved ID of the overlay from our mod overlays object delete modOverlays[avatarID]; @@ -151,7 +182,8 @@ function handleSelectedOverlay(clickedOverlay) { var modOverlayKeys = Object.keys(modOverlays); for (var i = 0; i < modOverlayKeys.length; ++i) { var avatarID = modOverlayKeys[i]; - var modOverlay = modOverlays[avatarID]; + var modOverlay = modOverlays[avatarID][0]; + var muteOverlay = modOverlays[avatarID][1]; if (clickedOverlay.overlayID == modOverlay) { // matched to an overlay, ask for the matching avatar to be kicked or ignored @@ -160,8 +192,10 @@ function handleSelectedOverlay(clickedOverlay) { } else { Users.ignore(avatarID); } - // cleanup of the overlay is handled by the connection to avatarRemovedEvent + + } else if (muteOverlay && clickedOverlay.overlayID == muteOverlay) { + Users.mute(avatarID); } } } From 96f6cb7ae4d08acfde700498bb9d7ed9b299210e Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 11 Nov 2016 11:24:06 -0800 Subject: [PATCH 5/6] whitespace --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 70ee41e934..d13f9b883f 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -498,7 +498,7 @@ void DomainServer::setupNodeListAndAssignments() { // NodeList won't be available to the settings manager when it is created, so call registerListener here packetReceiver.registerListener(PacketType::DomainSettingsRequest, &_settingsManager, "processSettingsRequestPacket"); packetReceiver.registerListener(PacketType::NodeKickRequest, &_settingsManager, "processNodeKickRequestPacket"); - + // register the gatekeeper for the packets it needs to receive packetReceiver.registerListener(PacketType::DomainConnectRequest, &_gatekeeper, "processConnectRequestPacket"); packetReceiver.registerListener(PacketType::ICEPing, &_gatekeeper, "processICEPingPacket"); From 6063a63f4466ed5b8fc42e2293f249908b27ced7 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 11 Nov 2016 14:23:59 -0800 Subject: [PATCH 6/6] cr feedback --- assignment-client/src/audio/AudioMixer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index b0a739caba..90c5d32449 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -96,7 +96,6 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); - nodeList->addNodeTypeToInterestSet(NodeType::DomainServer); connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled); } @@ -610,7 +609,6 @@ void AudioMixer::handleNodeMuteRequestPacket(QSharedPointer pac // we need to set a flag so we send them the appropriate packet to mute them AudioMixerClientData* nodeData = (AudioMixerClientData*)node->getLinkedData(); nodeData->setShouldMuteClient(true); - } else { qWarning() << "Node mute packet received for unknown node " << uuidStringWithoutCurlyBraces(nodeUUID); }