Showing the changes to assignment-client/src/scripts/EntityScriptServer.cpp (1 of 11 files). Show all
Unified · Split
| @@ -185,12 +185,20 @@ void EntityScriptServer::handleEntityServerScriptLogPacket(QSharedPointer<Receiv · 184 unmodified lines | ||
| 185 | 185 | if (senderNode->getCanRez() || senderNode->getCanRezTmp()) { |
| 186 | 186 | bool enable = false; |
| 187 | 187 | message->readPrimitive(&enable); |
| 188 | − qInfo() << "======== Got log packet:" << enable; | |
| 188 | + | |
| 189 | + auto senderUUID = senderNode->getUUID(); | |
| 190 | + auto it = _logListeners.find(senderUUID); | |
| 189 | 191 | |
| 190 | 192 | if (enable) { |
| 191 | − _logListeners.insert(senderNode->getUUID()); | |
| 193 | + if (it == std::end(_logListeners)) { | |
| 194 | + _logListeners.insert(senderUUID); | |
| 195 | + qInfo() << "Node" << senderUUID << "subscribed to log stream"; | |
| 196 | + } | |
| 192 | 197 | } else { |
| 193 | − _logListeners.erase(senderNode->getUUID()); | |
| 198 | + if (it != std::end(_logListeners)) { | |
| 199 | + _logListeners.erase(it); | |
| 200 | + qInfo() << "Node" << senderUUID << "unsubscribed from log stream"; | |
| 201 | + } | |
| 194 | 202 | } |
| 195 | 203 | } |
| 196 | 204 | } |
| @@ -290,9 +298,67 @@ void EntityScriptServer::run() { · 93 unmodified lines | ||
| 290 | 298 | connect(tree, &EntityTree::entityServerScriptChanging, this, &EntityScriptServer::entityServerScriptChanging, Qt::QueuedConnection); |
| 291 | 299 | } |
| 292 | 300 | |
| 301 | +void EntityScriptServer::cleanupOldKilledListeners() { | |
| 302 | + auto threshold = usecTimestampNow() - 5 * USECS_PER_SECOND; | |
| 303 | + using ValueType = std::pair<QUuid, quint64>; | |
| 304 | + auto it = std::remove_if(std::begin(_killedListeners), std::end(_killedListeners), [&](ValueType value) { | |
| 305 | + return value.second < threshold; | |
| 306 | + }); | |
| 307 | + _killedListeners.erase(it, std::end(_killedListeners)); | |
| 308 | +} | |
| 309 | + | |
| 293 | 310 | void EntityScriptServer::nodeActivated(SharedNodePointer activatedNode) { |
| 294 | − if (activatedNode->getType() == NodeType::AudioMixer) { | |
| 295 | − negotiateAudioFormat(); | |
| 311 | + switch (activatedNode->getType()) { | |
| 312 | + case NodeType::AudioMixer: | |
| 313 | + negotiateAudioFormat(); | |
| 314 | + break; | |
| 315 | + case NodeType::Agent: { | |
| 316 | + auto activatedNodeUUID = activatedNode->getUUID(); | |
| 317 | + using ValueType = std::pair<QUuid, quint64>; | |
| 318 | + auto it = std::find_if(std::begin(_killedListeners), std::end(_killedListeners), [&](ValueType value) { | |
| 319 | + return value.first == activatedNodeUUID; | |
| 320 | + }); | |
| 321 | + if (it != std::end(_killedListeners)) { | |
| 322 | + _killedListeners.erase(it); | |
| 323 | + _logListeners.insert(activatedNodeUUID); | |
| 324 | + } | |
| 325 | + break; | |
| 326 | + } | |
| 327 | + default: | |
| 328 | + // Do nothing | |
| 329 | + break; | |
| 330 | + } | |
| 331 | +} | |
| 332 | + | |
| 333 | +void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) { | |
| 334 | + switch (killedNode->getType()) { | |
| 335 | + case NodeType::EntityServer: { | |
| 336 | + if (!_shuttingDown) { | |
| 337 | + if (_entitiesScriptEngine) { | |
| 338 | + _entitiesScriptEngine->unloadAllEntityScripts(); | |
| 339 | + _entitiesScriptEngine->stop(); | |
| 340 | + } | |
| 341 | + | |
| 342 | + resetEntitiesScriptEngine(); | |
| 343 | + | |
| 344 | + _entityViewer.clear(); | |
| 345 | + } | |
| 346 | + break; | |
| 347 | + } | |
| 348 | + case NodeType::Agent: { | |
| 349 | + cleanupOldKilledListeners(); | |
| 350 | + | |
| 351 | + auto killedNodeUUID = killedNode->getUUID(); | |
| 352 | + auto it = _logListeners.find(killedNodeUUID); | |
| 353 | + if (it != std::end(_logListeners)) { | |
| 354 | + _logListeners.erase(killedNodeUUID); | |
| 355 | + _killedListeners.emplace_back(killedNodeUUID, usecTimestampNow()); | |
| 356 | + } | |
| 357 | + break; | |
| 358 | + } | |
| 359 | + default: | |
| 360 | + // Do nothing | |
| 361 | + break; | |
| 296 | 362 | } |
| 297 | 363 | } |
| 298 | 364 | |
| @@ -433,31 +499,6 @@ void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const · 134 unmodified lines | ||
| 433 | 499 | } |
| 434 | 500 | } |
| 435 | 501 | |
| 436 | −void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) { | |
| 437 | − switch (killedNode->getType()) { | |
| 438 | − case NodeType::EntityServer: { | |
| 439 | − if (!_shuttingDown) { | |
| 440 | − if (_entitiesScriptEngine) { | |
| 441 | − _entitiesScriptEngine->unloadAllEntityScripts(); | |
| 442 | − _entitiesScriptEngine->stop(); | |
| 443 | − } | |
| 444 | − | |
| 445 | − resetEntitiesScriptEngine(); | |
| 446 | − | |
| 447 | − _entityViewer.clear(); | |
| 448 | − } | |
| 449 | − break; | |
| 450 | − } | |
| 451 | − case NodeType::Agent: { | |
| 452 | − _logListeners.erase(killedNode->getUUID()); | |
| 453 | − break; | |
| 454 | − } | |
| 455 | − default: | |
| 456 | − // Do nothing | |
| 457 | − break; | |
| 458 | − } | |
| 459 | −} | |
| 460 | − | |
| 461 | 502 | void EntityScriptServer::sendStatsPacket() { |
| 462 | 503 | |
| 463 | 504 | } |