diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index b3a92f2f54..009bd42e88 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -67,9 +67,20 @@ AssignmentClient::AssignmentClient(int &argc, char **argv) : if (argumentIndex != -1) { assignmentPool = argumentList[argumentIndex + 1]; } + // setup our _requestAssignment member variable from the passed arguments _requestAssignment = Assignment(Assignment::RequestCommand, requestAssignmentType, assignmentPool); + // check if we were passed a wallet UUID on the command line + // this would represent where the user running AC wants funds sent to + + const QString ASSIGNMENT_WALLET_DESTINATION_ID_OPTION = "--wallet"; + if ((argumentIndex = argumentList.indexOf(ASSIGNMENT_WALLET_DESTINATION_ID_OPTION)) != -1) { + QUuid walletUUID = QString(argumentList[argumentIndex + 1]); + qDebug() << "The destination wallet UUID for credits is" << uuidStringWithoutCurlyBraces(walletUUID); + _requestAssignment.setWalletUUID(walletUUID); + } + // create a NodeList as an unassigned client NodeList* nodeList = NodeList::createInstance(NodeType::Unassigned); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index f6af63fd7a..bcce081d94 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -564,14 +564,21 @@ void DomainServer::readAvailableDatagrams() { Assignment requestAssignment(receivedPacket); // Suppress these for Assignment::AgentType to once per 5 seconds - static quint64 lastNoisyMessage = usecTimestampNow(); - quint64 timeNow = usecTimestampNow(); - const quint64 NOISY_TIME_ELAPSED = 5 * USECS_PER_SECOND; - bool noisyMessage = false; - if (requestAssignment.getType() != Assignment::AgentType || (timeNow - lastNoisyMessage) > NOISY_TIME_ELAPSED) { + static QElapsedTimer noisyMessageTimer; + static bool wasNoisyTimerStarted = false; + + if (!wasNoisyTimerStarted) { + noisyMessageTimer.start(); + wasNoisyTimerStarted = true; + } + + const quint64 NOISY_MESSAGE_INTERVAL_MSECS = 5 * 1000; + + if (requestAssignment.getType() != Assignment::AgentType + || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { qDebug() << "Received a request for assignment type" << requestAssignment.getType() - << "from" << senderSockAddr; - noisyMessage = true; + << "from" << senderSockAddr; + noisyMessageTimer.restart(); } SharedAssignmentPointer assignmentToDeploy = deployableAssignmentForRequest(requestAssignment); @@ -589,16 +596,13 @@ void DomainServer::readAvailableDatagrams() { nodeList->getNodeSocket().writeDatagram(assignmentPacket, senderSockAddr.getAddress(), senderSockAddr.getPort()); } else { - if (requestAssignment.getType() != Assignment::AgentType || (timeNow - lastNoisyMessage) > NOISY_TIME_ELAPSED) { + if (requestAssignment.getType() != Assignment::AgentType + || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { qDebug() << "Unable to fulfill assignment request of type" << requestAssignment.getType() - << "from" << senderSockAddr; - noisyMessage = true; + << "from" << senderSockAddr; + noisyMessageTimer.restart(); } } - - if (noisyMessage) { - lastNoisyMessage = timeNow; - } } else if (!_isUsingDTLS) { // not using DTLS, process datagram normally processDatagram(receivedPacket, senderSockAddr); diff --git a/libraries/networking/src/Assignment.cpp b/libraries/networking/src/Assignment.cpp index 925ed2930f..fd6ecd4602 100644 --- a/libraries/networking/src/Assignment.cpp +++ b/libraries/networking/src/Assignment.cpp @@ -63,7 +63,8 @@ Assignment::Assignment(Assignment::Command command, Assignment::Type type, const _pool(pool), _location(location), _payload(), - _isStatic(false) + _isStatic(false), + _walletUUID() { if (_command == Assignment::CreateCommand) { // this is a newly created assignment, generate a random UUID @@ -74,7 +75,8 @@ Assignment::Assignment(Assignment::Command command, Assignment::Type type, const Assignment::Assignment(const QByteArray& packet) : _pool(), _location(GlobalLocation), - _payload() + _payload(), + _walletUUID() { PacketType packetType = packetTypeForPacket(packet); @@ -104,6 +106,7 @@ Assignment::Assignment(const Assignment& otherAssignment) { _location = otherAssignment._location; _pool = otherAssignment._pool; _payload = otherAssignment._payload; + _walletUUID = otherAssignment._walletUUID; } Assignment& Assignment::operator=(const Assignment& rhsAssignment) { @@ -121,6 +124,7 @@ void Assignment::swap(Assignment& otherAssignment) { swap(_location, otherAssignment._location); swap(_pool, otherAssignment._pool); swap(_payload, otherAssignment._payload); + swap(_walletUUID, otherAssignment._walletUUID); } const char* Assignment::getTypeName() const { @@ -156,6 +160,10 @@ QDebug operator<<(QDebug debug, const Assignment &assignment) { QDataStream& operator<<(QDataStream &out, const Assignment& assignment) { out << (quint8) assignment._type << assignment._uuid << assignment._pool << assignment._payload; + if (assignment._command == Assignment::RequestCommand) { + out << assignment._walletUUID; + } + return out; } @@ -166,5 +174,9 @@ QDataStream& operator>>(QDataStream &in, Assignment& assignment) { in >> assignment._uuid >> assignment._pool >> assignment._payload; + if (assignment._command == Assignment::RequestCommand) { + in >> assignment._walletUUID; + } + return in; } diff --git a/libraries/networking/src/Assignment.h b/libraries/networking/src/Assignment.h index 1d97b08bb8..3898b84787 100644 --- a/libraries/networking/src/Assignment.h +++ b/libraries/networking/src/Assignment.h @@ -81,6 +81,9 @@ public: void setIsStatic(bool isStatic) { _isStatic = isStatic; } bool isStatic() const { return _isStatic; } + void setWalletUUID(const QUuid& walletUUID) { _walletUUID = walletUUID; } + const QUuid& getWalletUUID() const { return _walletUUID; } + const char* getTypeName() const; // implement parseData to return 0 so we can be a subclass of NodeData @@ -98,6 +101,7 @@ protected: Assignment::Location _location; /// the location of the assignment, allows a domain to preferentially use local ACs QByteArray _payload; /// an optional payload attached to this assignment, a maximum for 1024 bytes will be packed bool _isStatic; /// defines if this assignment needs to be re-queued in the domain-server if it stops being fulfilled + QUuid _walletUUID; /// the UUID for the wallet that should be paid for this assignment }; #endif // hifi_Assignment_h