mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 01:24:36 +02:00
Merge in Howard's 'screenshare presence' open PR
This commit is contained in:
parent
b0c578aa7f
commit
8aea0dd951
5 changed files with 86 additions and 2 deletions
|
@ -1081,6 +1081,12 @@ void AvatarMixer::setupEntityQuery() {
|
||||||
priorityZoneQuery["avatarPriority"] = true;
|
priorityZoneQuery["avatarPriority"] = true;
|
||||||
priorityZoneQuery["type"] = "Zone";
|
priorityZoneQuery["type"] = "Zone";
|
||||||
|
|
||||||
|
QJsonObject queryFlags;
|
||||||
|
queryFlags["includeAncestors"] = true;
|
||||||
|
queryFlags["includeDescendants"] = true;
|
||||||
|
priorityZoneQuery["flags"] = queryFlags;
|
||||||
|
priorityZoneQuery["name"] = true; // Handy for debugging.
|
||||||
|
|
||||||
_entityViewer.getOctreeQuery().setJSONParameters(priorityZoneQuery);
|
_entityViewer.getOctreeQuery().setJSONParameters(priorityZoneQuery);
|
||||||
_slaveSharedData.entityTree = entityTree;
|
_slaveSharedData.entityTree = entityTree;
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,7 @@ namespace {
|
||||||
glm::vec3 position;
|
glm::vec3 position;
|
||||||
bool isInPriorityZone { false };
|
bool isInPriorityZone { false };
|
||||||
float zoneVolume { std::numeric_limits<float>::max() };
|
float zoneVolume { std::numeric_limits<float>::max() };
|
||||||
|
EntityItemID id {};
|
||||||
|
|
||||||
static bool operation(const OctreeElementPointer& element, void* extraData) {
|
static bool operation(const OctreeElementPointer& element, void* extraData) {
|
||||||
auto findPriorityZone = static_cast<FindPriorityZone*>(extraData);
|
auto findPriorityZone = static_cast<FindPriorityZone*>(extraData);
|
||||||
|
@ -113,6 +114,7 @@ namespace {
|
||||||
if (volume < findPriorityZone->zoneVolume) { // Smaller volume wins
|
if (volume < findPriorityZone->zoneVolume) { // Smaller volume wins
|
||||||
findPriorityZone->isInPriorityZone = zoneItem->getAvatarPriority() == COMPONENT_MODE_ENABLED;
|
findPriorityZone->isInPriorityZone = zoneItem->getAvatarPriority() == COMPONENT_MODE_ENABLED;
|
||||||
findPriorityZone->zoneVolume = volume;
|
findPriorityZone->zoneVolume = volume;
|
||||||
|
findPriorityZone->id = zoneItem->getEntityItemID();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,7 +154,15 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message, const SlaveShared
|
||||||
EntityTree& entityTree = *slaveSharedData.entityTree;
|
EntityTree& entityTree = *slaveSharedData.entityTree;
|
||||||
FindPriorityZone findPriorityZone { newPosition } ;
|
FindPriorityZone findPriorityZone { newPosition } ;
|
||||||
entityTree.recurseTreeWithOperation(&FindPriorityZone::operation, &findPriorityZone);
|
entityTree.recurseTreeWithOperation(&FindPriorityZone::operation, &findPriorityZone);
|
||||||
_avatar->setHasPriority(findPriorityZone.isInPriorityZone);
|
bool currentlyHasPriority = findPriorityZone.isInPriorityZone;
|
||||||
|
if (currentlyHasPriority != _avatar->getHasPriority()) {
|
||||||
|
_avatar->setHasPriority(currentlyHasPriority);
|
||||||
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true);
|
||||||
|
packet->write(_avatar->getSessionUUID().toRfc4122());
|
||||||
|
packet->write(findPriorityZone.id.toRfc4122());
|
||||||
|
nodeList->sendPacket(std::move(packet), nodeList->getDomainSockAddr());
|
||||||
|
}
|
||||||
_avatar->setNeedsHeroCheck(false);
|
_avatar->setNeedsHeroCheck(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -766,6 +766,7 @@ void DomainServer::setupNodeListAndAssignments() {
|
||||||
packetReceiver.registerListener(PacketType::DomainServerPathQuery, this, "processPathQueryPacket");
|
packetReceiver.registerListener(PacketType::DomainServerPathQuery, this, "processPathQueryPacket");
|
||||||
packetReceiver.registerListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket");
|
packetReceiver.registerListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket");
|
||||||
packetReceiver.registerListener(PacketType::DomainDisconnectRequest, this, "processNodeDisconnectRequestPacket");
|
packetReceiver.registerListener(PacketType::DomainDisconnectRequest, this, "processNodeDisconnectRequestPacket");
|
||||||
|
packetReceiver.registerListener(PacketType::AvatarZonePresence, this, "processAvatarZonePresencePacket");
|
||||||
|
|
||||||
// NodeList won't be available to the settings manager when it is created, so call registerListener here
|
// 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::DomainSettingsRequest, &_settingsManager, "processSettingsRequestPacket");
|
||||||
|
@ -3613,3 +3614,62 @@ void DomainServer::handleOctreeFileReplacementRequest(QSharedPointer<ReceivedMes
|
||||||
handleOctreeFileReplacement(message->readAll(), QString(), QString(), username);
|
handleOctreeFileReplacement(message->readAll(), QString(), QString(), username);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DomainServer::processAvatarZonePresencePacket(QSharedPointer<ReceivedMessage> message) {
|
||||||
|
QUuid avatar = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID));
|
||||||
|
QUuid zone = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID));
|
||||||
|
|
||||||
|
if (avatar.isNull()) {
|
||||||
|
qCWarning(domain_server) << "Ignoring null avatar presence";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto limitedNodeList = DependencyManager::get<LimitedNodeList>();
|
||||||
|
auto matchingNode = limitedNodeList->nodeWithUUID(avatar);
|
||||||
|
if (!matchingNode) {
|
||||||
|
qCWarning(domain_server) << "Ignoring avatar presence for unknown avatar" << avatar;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QString verifiedUsername = matchingNode->getPermissions().getVerifiedUserName();
|
||||||
|
static const int SCREENSHARE_EXPIRATION_SECONDS = 24 * 60 * 60;
|
||||||
|
screensharePresence(zone.isNull() ? "" : zone.toString(), verifiedUsername, SCREENSHARE_EXPIRATION_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DomainServer::screensharePresence(QString roomname, QString username, int expirationSeconds) {
|
||||||
|
if (!DependencyManager::get<AccountManager>()->hasValidAccessToken()) {
|
||||||
|
static std::once_flag presenceAuthorityWarning;
|
||||||
|
std::call_once(presenceAuthorityWarning, [] {
|
||||||
|
qCDebug(domain_server) << "No authority to send screensharePresence.";
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
JSONCallbackParameters callbackParams;
|
||||||
|
callbackParams.callbackReceiver = this;
|
||||||
|
callbackParams.jsonCallbackMethod = "handleSuccessfulScreensharePresence";
|
||||||
|
callbackParams.errorCallbackMethod = "handleFailedScreensharePresence";
|
||||||
|
const QString PATH = "api/v1/domains/%1/screenshare";
|
||||||
|
QString domain_id = uuidStringWithoutCurlyBraces(getID());
|
||||||
|
QJsonObject json, screenshare;
|
||||||
|
screenshare["username"] = username;
|
||||||
|
screenshare["roomname"] = roomname;
|
||||||
|
if (expirationSeconds > 0) {
|
||||||
|
screenshare["expiration"] = expirationSeconds;
|
||||||
|
}
|
||||||
|
json["screenshare"] = screenshare;
|
||||||
|
DependencyManager::get<AccountManager>()->sendRequest(
|
||||||
|
PATH.arg(domain_id),
|
||||||
|
AccountManagerAuth::Required,
|
||||||
|
QNetworkAccessManager::PostOperation,
|
||||||
|
callbackParams, QJsonDocument(json).toJson()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DomainServer::handleSuccessfulScreensharePresence(QNetworkReply* requestReply) {
|
||||||
|
QJsonObject jsonObject = QJsonDocument::fromJson(requestReply->readAll()).object();
|
||||||
|
if (jsonObject["status"].toString() != "success") {
|
||||||
|
qCWarning(domain_server) << "screensharePresence api call failed:" << QJsonDocument(jsonObject).toJson(QJsonDocument::Compact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DomainServer::handleFailedScreensharePresence(QNetworkReply* requestReply) {
|
||||||
|
qCWarning(domain_server) << "screensharePresence api call failed:" << requestReply->error();
|
||||||
|
}
|
||||||
|
|
|
@ -78,6 +78,8 @@ public:
|
||||||
|
|
||||||
bool isAssetServerEnabled();
|
bool isAssetServerEnabled();
|
||||||
|
|
||||||
|
void screensharePresence(QString roomname, QString username, int expiration_seconds = 0);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
/// Called by NodeList to inform us a node has been added
|
/// Called by NodeList to inform us a node has been added
|
||||||
void nodeAdded(SharedNodePointer node);
|
void nodeAdded(SharedNodePointer node);
|
||||||
|
@ -96,6 +98,7 @@ private slots:
|
||||||
void processNodeDisconnectRequestPacket(QSharedPointer<ReceivedMessage> message);
|
void processNodeDisconnectRequestPacket(QSharedPointer<ReceivedMessage> message);
|
||||||
void processICEServerHeartbeatDenialPacket(QSharedPointer<ReceivedMessage> message);
|
void processICEServerHeartbeatDenialPacket(QSharedPointer<ReceivedMessage> message);
|
||||||
void processICEServerHeartbeatACK(QSharedPointer<ReceivedMessage> message);
|
void processICEServerHeartbeatACK(QSharedPointer<ReceivedMessage> message);
|
||||||
|
void processAvatarZonePresencePacket(QSharedPointer<ReceivedMessage> packet);
|
||||||
|
|
||||||
void handleDomainContentReplacementFromURLRequest(QSharedPointer<ReceivedMessage> message);
|
void handleDomainContentReplacementFromURLRequest(QSharedPointer<ReceivedMessage> message);
|
||||||
void handleOctreeFileReplacementRequest(QSharedPointer<ReceivedMessage> message);
|
void handleOctreeFileReplacementRequest(QSharedPointer<ReceivedMessage> message);
|
||||||
|
@ -129,6 +132,9 @@ private slots:
|
||||||
void handleSuccessfulICEServerAddressUpdate(QNetworkReply* requestReply);
|
void handleSuccessfulICEServerAddressUpdate(QNetworkReply* requestReply);
|
||||||
void handleFailedICEServerAddressUpdate(QNetworkReply* requestReply);
|
void handleFailedICEServerAddressUpdate(QNetworkReply* requestReply);
|
||||||
|
|
||||||
|
void handleSuccessfulScreensharePresence(QNetworkReply* requestReply);
|
||||||
|
void handleFailedScreensharePresence(QNetworkReply* requestReply);
|
||||||
|
|
||||||
void updateReplicatedNodes();
|
void updateReplicatedNodes();
|
||||||
void updateDownstreamNodes();
|
void updateDownstreamNodes();
|
||||||
void updateUpstreamNodes();
|
void updateUpstreamNodes();
|
||||||
|
|
|
@ -135,6 +135,7 @@ public:
|
||||||
AudioSoloRequest,
|
AudioSoloRequest,
|
||||||
BulkAvatarTraitsAck,
|
BulkAvatarTraitsAck,
|
||||||
StopInjector,
|
StopInjector,
|
||||||
|
AvatarZonePresence,
|
||||||
NUM_PACKET_TYPE
|
NUM_PACKET_TYPE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -185,7 +186,8 @@ public:
|
||||||
<< PacketTypeEnum::Value::OctreeFileReplacement << PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho
|
<< PacketTypeEnum::Value::OctreeFileReplacement << PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho
|
||||||
<< PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho << PacketTypeEnum::Value::ReplicatedInjectAudio
|
<< PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho << PacketTypeEnum::Value::ReplicatedInjectAudio
|
||||||
<< PacketTypeEnum::Value::ReplicatedSilentAudioFrame << PacketTypeEnum::Value::ReplicatedAvatarIdentity
|
<< PacketTypeEnum::Value::ReplicatedSilentAudioFrame << PacketTypeEnum::Value::ReplicatedAvatarIdentity
|
||||||
<< PacketTypeEnum::Value::ReplicatedKillAvatar << PacketTypeEnum::Value::ReplicatedBulkAvatarData;
|
<< PacketTypeEnum::Value::ReplicatedKillAvatar << PacketTypeEnum::Value::ReplicatedBulkAvatarData
|
||||||
|
<< PacketTypeEnum::Value::AvatarZonePresence;
|
||||||
return NON_SOURCED_PACKETS;
|
return NON_SOURCED_PACKETS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue