diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3a5db6666d..26f4d25eb7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -268,6 +269,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // set the account manager's root URL and trigger a login request if we don't have the access token accountManager.setAuthURL(DEFAULT_NODE_AUTH_URL); + UserActivityLogger::getInstance().launch(); // once the event loop has started, check and signal for an access token QMetaObject::invokeMethod(&accountManager, "checkAndSignalForAccessToken", Qt::QueuedConnection); @@ -396,7 +398,19 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : } Application::~Application() { - + int DELAI_TIME = 1000; + QEventLoop loop; + QTimer timer; + connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); + JSONCallbackParameters params; + params.jsonCallbackReceiver = &loop; + params.errorCallbackReceiver = &loop; + params.jsonCallbackMethod = "quit"; + params.errorCallbackMethod = "quit"; + UserActivityLogger::getInstance().close(params); + timer.start(DELAI_TIME); + loop.exec(); + qInstallMessageHandler(NULL); // make sure we don't call the idle timer any more @@ -3558,6 +3572,7 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript _scriptEnginesHash.insertMulti(scriptURLString, scriptEngine); _runningScriptsWidget->setRunningScripts(getRunningScripts()); + UserActivityLogger::getInstance().loadedScript(scriptURLString); } // setup the packet senders and jurisdiction listeners of the script engine's scripting interfaces so diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index 07536d0af8..558a82cd3d 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -13,6 +13,7 @@ #include "Application.h" #include "SixenseManager.h" +#include "UserActivityLogger.h" #ifdef HAVE_SIXENSE const int CALIBRATION_STATE_IDLE = 0; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 55d3360884..9c89826cb9 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -12,8 +12,9 @@ #include "Application.h" #include "Menu.h" -#include "PreferencesDialog.h" #include "ModelsBrowser.h" +#include "PreferencesDialog.h" +#include "UserActivityLogger.h" const int SCROLL_PANEL_BOTTOM_MARGIN = 30; const int OK_BUTTON_RIGHT_MARGIN = 30; @@ -176,6 +177,7 @@ void PreferencesDialog::savePreferences() { QString displayNameStr(ui.displayNameEdit->text()); if (displayNameStr != _displayNameString) { myAvatar->setDisplayName(displayNameStr); + UserActivityLogger::getInstance().changedDisplayName(displayNameStr); shouldDispatchIdentityPacket = true; } @@ -183,6 +185,7 @@ void PreferencesDialog::savePreferences() { if (faceModelURL.toString() != _faceURLString) { // change the faceModelURL in the profile, it will also update this user's BlendFace myAvatar->setFaceModelURL(faceModelURL); + UserActivityLogger::getInstance().changedModel("head", faceModelURL.toString()); shouldDispatchIdentityPacket = true; } @@ -190,6 +193,7 @@ void PreferencesDialog::savePreferences() { if (skeletonModelURL.toString() != _skeletonURLString) { // change the skeletonModelURL in the profile, it will also update this user's Body myAvatar->setSkeletonModelURL(skeletonModelURL); + UserActivityLogger::getInstance().changedModel("skeleton", skeletonModelURL.toString()); shouldDispatchIdentityPacket = true; } diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 95689f8e82..f603d21240 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -11,6 +11,7 @@ #include "NodeList.h" #include "PacketHeaders.h" +#include "UserActivityLogger.h" #include "DomainHandler.h" @@ -83,6 +84,7 @@ void DomainHandler::setHostname(const QString& hostname) { qDebug("Looking up DS hostname %s.", _hostname.toLocal8Bit().constData()); QHostInfo::lookupHost(_hostname, this, SLOT(completedHostnameLookup(const QHostInfo&))); + UserActivityLogger::getInstance().changedDomain(_hostname); emit hostnameChanged(_hostname); } } diff --git a/libraries/networking/src/UserActivityLogger.cpp b/libraries/networking/src/UserActivityLogger.cpp index 9356e1bbe6..b797a1b7eb 100644 --- a/libraries/networking/src/UserActivityLogger.cpp +++ b/libraries/networking/src/UserActivityLogger.cpp @@ -11,8 +11,6 @@ #include "UserActivityLogger.h" -#include "AccountManager.h" - #include #include @@ -26,32 +24,32 @@ UserActivityLogger& UserActivityLogger::getInstance() { UserActivityLogger::UserActivityLogger() { } -void UserActivityLogger::logAction(QString action, QJsonObject details) { +void UserActivityLogger::logAction(QString action, QJsonObject details, JSONCallbackParameters params) { AccountManager& accountManager = AccountManager::getInstance(); QHttpMultiPart* multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType); - if (action != "login") { - QHttpPart actionPart; - actionPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"action_name\""); - actionPart.setBody(QByteArray().append(action)); - multipart->append(actionPart); - - - if (!details.isEmpty()) { - QHttpPart detailsPart; - detailsPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data;" - " name=\"action_details\""); - detailsPart.setBody(QJsonDocument(details).toJson(QJsonDocument::Compact)); - multipart->append(detailsPart); - } - } - qDebug() << "Loging activity " << action; + QHttpPart actionPart; + actionPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"action_name\""); + actionPart.setBody(QByteArray().append(action)); + multipart->append(actionPart); - JSONCallbackParameters params; - params.jsonCallbackReceiver = this; - params.jsonCallbackMethod = "requestFinished"; - params.errorCallbackReceiver = this; - params.errorCallbackMethod = "requestError"; + + if (!details.isEmpty()) { + QHttpPart detailsPart; + detailsPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data;" + " name=\"action_details\""); + detailsPart.setBody(QJsonDocument(details).toJson(QJsonDocument::Compact)); + multipart->append(detailsPart); + } + qDebug() << "Loging activity" << action; + qDebug() << AccountManager::getInstance().getAuthURL() << ": " << AccountManager::getInstance().isLoggedIn(); + + if (params.isEmpty()) { + params.jsonCallbackReceiver = this; + params.jsonCallbackMethod = "requestFinished"; + params.errorCallbackReceiver = this; + params.errorCallbackMethod = "requestError"; + } accountManager.authenticatedRequest(USER_ACTIVITY_URL, QNetworkAccessManager::PostOperation, @@ -68,8 +66,8 @@ void UserActivityLogger::requestError(QNetworkReply::NetworkError error,const QS qDebug() << error << ": " << string; } -void UserActivityLogger::login() { - const QString ACTION_NAME = "login"; +void UserActivityLogger::launch() { + const QString ACTION_NAME = "launch"; QJsonObject actionDetails; QString OS_KEY = "OS"; @@ -91,9 +89,9 @@ void UserActivityLogger::login() { logAction(ACTION_NAME, actionDetails); } -void UserActivityLogger::logout() { - const QString ACTION_NAME = ""; - logAction(ACTION_NAME); +void UserActivityLogger::close(JSONCallbackParameters params) { + const QString ACTION_NAME = "close"; + logAction(ACTION_NAME, QJsonObject(), params); } void UserActivityLogger::changedDisplayName(QString displayName) { diff --git a/libraries/networking/src/UserActivityLogger.h b/libraries/networking/src/UserActivityLogger.h index 8bb5c0aaa6..3a36974128 100644 --- a/libraries/networking/src/UserActivityLogger.h +++ b/libraries/networking/src/UserActivityLogger.h @@ -12,6 +12,8 @@ #ifndef hifi_UserActivityLogger_h #define hifi_UserActivityLogger_h +#include "AccountManager.h" + #include #include #include @@ -24,10 +26,10 @@ public: static UserActivityLogger& getInstance(); public slots: - void logAction(QString action, QJsonObject details = QJsonObject()); + void logAction(QString action, QJsonObject details = QJsonObject(), JSONCallbackParameters params = JSONCallbackParameters()); - void login(); - void logout(); + void launch(); + void close(JSONCallbackParameters params = JSONCallbackParameters()); void changedDisplayName(QString displayName); void changedModel(QString typeOfModel, QString modelURL); void changedDomain(QString domainURL);