From d0caea372c0773e87f43096f1976f6576c153e98 Mon Sep 17 00:00:00 2001 From: Syping Date: Thu, 11 Jan 2018 08:41:00 +0100 Subject: [PATCH] added telemetry --- .travis/debian32_travis.sh | 2 +- AboutDialog.cpp | 9 +- AppEnv.cpp | 7 + AppEnv.h | 5 +- ImageEditorDialog.cpp | 29 +- ImportDialog.cpp | 13 +- JsonEditorDialog.cpp | 20 +- OptionsDialog.cpp | 13 +- PictureDialog.cpp | 8 +- PlayerListDialog.cpp | 28 +- ProfileInterface.cpp | 13 +- SnapmaticEditor.cpp | 18 +- TelemetryClass.cpp | 384 ++++++++++++++++++++++++++ TelemetryClass.h | 75 +++++ UserInterface.cpp | 27 +- config.h | 2 +- gta5view.pro | 18 +- main.cpp | 70 +++-- res/app.rc | 14 +- tmext/TelemetryClassAuthenticator.cpp | 99 +++++++ tmext/TelemetryClassAuthenticator.h | 41 +++ 21 files changed, 851 insertions(+), 44 deletions(-) create mode 100644 TelemetryClass.cpp create mode 100644 TelemetryClass.h create mode 100644 tmext/TelemetryClassAuthenticator.cpp create mode 100644 tmext/TelemetryClassAuthenticator.h diff --git a/.travis/debian32_travis.sh b/.travis/debian32_travis.sh index fa477cf..bcd8ce2 100755 --- a/.travis/debian32_travis.sh +++ b/.travis/debian32_travis.sh @@ -1,7 +1,7 @@ #!/bin/bash DOCKER_IMAGE=i386/debian:jessie -PROJECT_DIR_DOCKER=/gta5view/ +PROJECT_DIR_DOCKER=/gta5view cd $PROJECT_DIR && \ docker pull $DOCKER_IMAGE && \ diff --git a/AboutDialog.cpp b/AboutDialog.cpp index bf2d4ed..2c075dd 100755 --- a/AboutDialog.cpp +++ b/AboutDialog.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ AboutDialog::AboutDialog(QWidget *parent) : QString appVersion = qApp->applicationVersion(); QString buildType = tr(GTA5SYNC_BUILDTYPE); buildType.replace("_", " "); - QString projectBuild = GTA5SYNC_BUILDDATETIME; + QString projectBuild = AppEnv::getBuildDateTime(); QString buildStr = GTA5SYNC_BUILDSTRING; // Translator Comments @@ -102,10 +102,15 @@ AboutDialog::AboutDialog(QWidget *parent) : ui->labAbout->setText(aboutStr.arg(GTA5SYNC_APPSTR, projectDes, appVersion % " (" % buildType % ")", projectBuild, buildStr, qVersion(), copyrightDesA)); this->setWindowTitle(titleStr.arg(GTA5SYNC_APPSTR)); + // Set Icon for Close Button if (QIcon::hasThemeIcon("dialog-close")) { ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); } + else if (QIcon::hasThemeIcon("gtk-close")) + { + ui->cmdClose->setIcon(QIcon::fromTheme("gtk-close")); + } // DPI calculation qreal screenRatio = AppEnv::screenRatio(); diff --git a/AppEnv.cpp b/AppEnv.cpp index cab453a..89bff93 100755 --- a/AppEnv.cpp +++ b/AppEnv.cpp @@ -37,6 +37,13 @@ AppEnv::AppEnv() } +// Build Stuff + +QString AppEnv::getBuildDateTime() +{ + return GTA5SYNC_BUILDDATETIME; +} + // Folder Stuff QString AppEnv::getGameFolder(bool *ok) diff --git a/AppEnv.h b/AppEnv.h index 21a8e7b..2863791 100755 --- a/AppEnv.h +++ b/AppEnv.h @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,6 +27,9 @@ class AppEnv public: AppEnv(); + // Build Stuff + static QString getBuildDateTime(); + // Folder Stuff static QString getGameFolder(bool *ok = 0); static bool setGameFolder(QString gameFolder); diff --git a/ImageEditorDialog.cpp b/ImageEditorDialog.cpp index 7fffbd9..b4a2589 100644 --- a/ImageEditorDialog.cpp +++ b/ImageEditorDialog.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2017-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,8 +37,35 @@ ImageEditorDialog::ImageEditorDialog(SnapmaticPicture *picture, QString profileN setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint); ui->setupUi(this); + ui->cmdClose->setDefault(true); ui->cmdClose->setFocus(); + // Set Icon for Close Button + if (QIcon::hasThemeIcon("dialog-close")) + { + ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); + } + else if (QIcon::hasThemeIcon("gtk-close")) + { + ui->cmdClose->setIcon(QIcon::fromTheme("gtk-close")); + } + + // Set Icon for Import Button + if (QIcon::hasThemeIcon("document-import")) + { + ui->cmdReplace->setIcon(QIcon::fromTheme("document-import")); + } + + // Set Icon for Overwrite Button + if (QIcon::hasThemeIcon("document-save")) + { + ui->cmdSave->setIcon(QIcon::fromTheme("document-save")); + } + else if (QIcon::hasThemeIcon("gtk-save")) + { + ui->cmdSave->setIcon(QIcon::fromTheme("gtk-save")); + } + // DPI calculation qreal screenRatio = AppEnv::screenRatio(); diff --git a/ImportDialog.cpp b/ImportDialog.cpp index e128f6f..0d0f6d4 100644 --- a/ImportDialog.cpp +++ b/ImportDialog.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2017 Syping +* Copyright (C) 2017-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,14 +55,25 @@ ImportDialog::ImportDialog(QWidget *parent) : avatarAreaImage = QImage(":/img/avatarareaimport.png"); selectedColour = QColor::fromRgb(0, 0, 0, 255); + // Set Icon for OK Button if (QIcon::hasThemeIcon("dialog-ok")) { ui->cmdOK->setIcon(QIcon::fromTheme("dialog-ok")); } + else if (QIcon::hasThemeIcon("gtk-ok")) + { + ui->cmdOK->setIcon(QIcon::fromTheme("gtk-ok")); + } + + // Set Icon for Cancel Button if (QIcon::hasThemeIcon("dialog-cancel")) { ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel")); } + else if (QIcon::hasThemeIcon("gtk-cancel")) + { + ui->cmdCancel->setIcon(QIcon::fromTheme("gtk-cancel")); + } ui->cbIgnore->setChecked(false); ui->labColour->setText(tr("Background Colour: %1").arg(selectedColour.name())); diff --git a/JsonEditorDialog.cpp b/JsonEditorDialog.cpp index 8906c91..fb9ec6c 100644 --- a/JsonEditorDialog.cpp +++ b/JsonEditorDialog.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2017 Syping +* Copyright (C) 2017-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,10 +38,28 @@ JsonEditorDialog::JsonEditorDialog(SnapmaticPicture *picture, QWidget *parent) : ui->setupUi(this); ui->cmdClose->setDefault(true); + ui->cmdClose->setFocus(); + + // Set Icon for Close Button if (QIcon::hasThemeIcon("dialog-close")) { ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); } + else if (QIcon::hasThemeIcon("gtk-close")) + { + ui->cmdClose->setIcon(QIcon::fromTheme("gtk-close")); + } + + // Set Icon for Save Button + if (QIcon::hasThemeIcon("document-save")) + { + ui->cmdSave->setIcon(QIcon::fromTheme("document-save")); + } + else if (QIcon::hasThemeIcon("gtk-save")) + { + ui->cmdSave->setIcon(QIcon::fromTheme("gtk-save")); + } + jsonCode = picture->getJsonStr(); #if QT_VERSION >= 0x050200 diff --git a/OptionsDialog.cpp b/OptionsDialog.cpp index a967d56..31f8aa4 100755 --- a/OptionsDialog.cpp +++ b/OptionsDialog.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,14 +64,25 @@ OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) : ui->rbPicDesktopRes->setText(ui->rbPicDesktopRes->text().arg(QString::number(desktopSizeWidth), QString::number(desktopSizeHeight))); ui->rbPicDefaultRes->setText(ui->rbPicDefaultRes->text().arg(QString::number(defExportSize.width()), QString::number(defExportSize.height()))); + // Set Icon for OK Button if (QIcon::hasThemeIcon("dialog-ok")) { ui->cmdOK->setIcon(QIcon::fromTheme("dialog-ok")); } + else if (QIcon::hasThemeIcon("gtk-ok")) + { + ui->cmdOK->setIcon(QIcon::fromTheme("gtk-ok")); + } + + // Set Icon for Cancel Button if (QIcon::hasThemeIcon("dialog-cancel")) { ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel")); } + else if (QIcon::hasThemeIcon("gtk-cancel")) + { + ui->cmdCancel->setIcon(QIcon::fromTheme("gtk-cancel")); + } setupTreeWidget(); setupLanguageBox(); diff --git a/PictureDialog.cpp b/PictureDialog.cpp index 603fa42..661718c 100755 --- a/PictureDialog.cpp +++ b/PictureDialog.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -166,11 +166,15 @@ void PictureDialog::setupPictureDialog() // Event connects connect(ui->labJSON, SIGNAL(resized(QSize)), this, SLOT(adaptNewDialogSize(QSize))); - // Dialog buttons + // Set Icon for Close Button if (QIcon::hasThemeIcon("dialog-close")) { ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); } + else if (QIcon::hasThemeIcon("gtk-close")) + { + ui->cmdClose->setIcon(QIcon::fromTheme("gtk-close")); + } installEventFilter(this); installEventFilter(ui->labPicture); diff --git a/PlayerListDialog.cpp b/PlayerListDialog.cpp index 019871c..5035f38 100644 --- a/PlayerListDialog.cpp +++ b/PlayerListDialog.cpp @@ -37,7 +37,9 @@ PlayerListDialog::PlayerListDialog(QStringList players, ProfileDatabase *profile ui->setupUi(this); ui->cmdCancel->setDefault(true); + ui->cmdCancel->setFocus(); + // Set Icon for Apply Button if (QIcon::hasThemeIcon("dialog-ok-apply")) { ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok-apply")); @@ -46,16 +48,40 @@ PlayerListDialog::PlayerListDialog(QStringList players, ProfileDatabase *profile { ui->cmdApply->setIcon(QIcon::fromTheme("dialog-apply")); } + else if (QIcon::hasThemeIcon("gtk-apply")) + { + ui->cmdApply->setIcon(QIcon::fromTheme("gtk-apply")); + } else if (QIcon::hasThemeIcon("dialog-ok")) { ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok")); } + else if (QIcon::hasThemeIcon("gtk-ok")) + { + ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok")); + } + + // Set Icon for Cancel Button if (QIcon::hasThemeIcon("dialog-cancel")) { ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel")); } + else if (QIcon::hasThemeIcon("gtk-cancel")) + { + ui->cmdCancel->setIcon(QIcon::fromTheme("gtk-cancel")); + } - drawSwitchButtons(); + // Set Icon for Manage Buttons + if (QIcon::hasThemeIcon("go-previous") && QIcon::hasThemeIcon("go-next") && QIcon::hasThemeIcon("list-add")) + { + ui->cmdMakeAv->setIcon(QIcon::fromTheme("go-previous")); + ui->cmdMakeSe->setIcon(QIcon::fromTheme("go-next")); + ui->cmdMakeAd->setIcon(QIcon::fromTheme("list-add")); + } + else + { + drawSwitchButtons(); + } buildInterface(); // DPI calculation diff --git a/ProfileInterface.cpp b/ProfileInterface.cpp index 9a7a258..f44af9d 100755 --- a/ProfileInterface.cpp +++ b/ProfileInterface.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -79,10 +79,21 @@ ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *cre ui->labVersion->setText(QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER)); ui->saProfileContent->setFilesMode(true); + // Set Icon for Close Button if (QIcon::hasThemeIcon("dialog-close")) { ui->cmdCloseProfile->setIcon(QIcon::fromTheme("dialog-close")); } + else if (QIcon::hasThemeIcon("gtk-close")) + { + ui->cmdCloseProfile->setIcon(QIcon::fromTheme("gtk-close")); + } + + // Set Icon for Import Button + if (QIcon::hasThemeIcon("document-import")) + { + ui->cmdImport->setIcon(QIcon::fromTheme("document-import")); + } // DPI calculation qreal screenRatio = AppEnv::screenRatio(); diff --git a/SnapmaticEditor.cpp b/SnapmaticEditor.cpp index fe1390e..2ba6081 100644 --- a/SnapmaticEditor.cpp +++ b/SnapmaticEditor.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,7 +39,9 @@ SnapmaticEditor::SnapmaticEditor(CrewDatabase *crewDB, ProfileDatabase *profileD ui->setupUi(this); ui->cmdCancel->setDefault(true); + ui->cmdCancel->setFocus(); + // Set Icon for Apply Button if (QIcon::hasThemeIcon("dialog-ok-apply")) { ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok-apply")); @@ -48,14 +50,28 @@ SnapmaticEditor::SnapmaticEditor(CrewDatabase *crewDB, ProfileDatabase *profileD { ui->cmdApply->setIcon(QIcon::fromTheme("dialog-apply")); } + else if (QIcon::hasThemeIcon("gtk-apply")) + { + ui->cmdApply->setIcon(QIcon::fromTheme("gtk-apply")); + } else if (QIcon::hasThemeIcon("dialog-ok")) { ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok")); } + else if (QIcon::hasThemeIcon("gtk-ok")) + { + ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok")); + } + + // Set Icon for Cancel Button if (QIcon::hasThemeIcon("dialog-cancel")) { ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel")); } + else if (QIcon::hasThemeIcon("gtk-cancel")) + { + ui->cmdCancel->setIcon(QIcon::fromTheme("gtk-cancel")); + } snapmaticTitle = QString(); smpic = 0; diff --git a/TelemetryClass.cpp b/TelemetryClass.cpp new file mode 100644 index 0000000..d772f25 --- /dev/null +++ b/TelemetryClass.cpp @@ -0,0 +1,384 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2018 Syping +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#include "TelemetryClassAuthenticator.h" +#include "TelemetryClass.h" +#include "AppEnv.h" +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef GTA5SYNC_WIN +#include "windows.h" +#include "intrin.h" +#endif + +TelemetryClass TelemetryClass::telemetryClassInstance; + +void TelemetryClass::init() +{ + QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR); + settings.beginGroup("Telemetry"); +#ifndef GTA5SYNC_BUILDTYPE_DEV + telemetryEnabled = settings.value("IsEnabled", false).toBool(); +#else + telemetryEnabled = true; // Always enable Telemetry for Developer Versions +#endif + telemetryClientID = settings.value("ClientID", QString()).toString(); + settings.endGroup(); +} + +void TelemetryClass::refresh() +{ + init(); +} + +bool TelemetryClass::canPush() +{ + if (!isEnabled() || !isRegistered() || !TelemetryClassAuthenticator::havePushURL()) return false; + return true; +} + +bool TelemetryClass::canRegister() +{ + if (!isEnabled() || isRegistered() || !TelemetryClassAuthenticator::haveRegURL()) return false; + return true; +} + +bool TelemetryClass::isEnabled() +{ + return telemetryEnabled; +} + +bool TelemetryClass::isStateForced() +{ + return telemetryStateForced; +} + +bool TelemetryClass::isRegistered() +{ + return !telemetryClientID.isEmpty(); +} + +void TelemetryClass::setEnabled(bool enabled) +{ + telemetryEnabled = enabled; + telemetryStateForced = true; +} + +void TelemetryClass::setDisabled(bool disabled) +{ + telemetryEnabled = !disabled; + telemetryStateForced = true; +} + +void TelemetryClass::push(TelemetryCategory category) +{ + if (!canPush()) return; + switch (category) + { + case TelemetryCategory::OperatingSystemSpec: + push(category, getOperatingSystem()); + break; + case TelemetryCategory::HardwareSpec: + push(category, getSystemHardware()); + break; + case TelemetryCategory::UserLocaleData: + push(category, getSystemLocaleList()); + break; + case TelemetryCategory::ApplicationConfiguration: + break; + case TelemetryCategory::ApplicationSpec: + push(category, getApplicationSpec()); + break; + } +} + +void TelemetryClass::push(TelemetryCategory category, QJsonDocument json) +{ + if (!canPush()) return; + + QJsonDocument jsonDocument(json); + QJsonObject jsonObject = jsonDocument.object(); + jsonObject["ClientID"] = telemetryClientID; + jsonDocument.setObject(jsonObject); + + QHttpMultiPart *httpMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); + + QHttpPart categoryPart; + categoryPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"json-category\"")); + categoryPart.setBody(categoryToString(category).toUtf8()); + + QHttpPart jsonPart; + jsonPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); + jsonPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"json-deflated\"")); + jsonPart.setBody(qCompress(jsonDocument.toJson(QJsonDocument::Compact))); + + httpMultiPart->append(categoryPart); + httpMultiPart->append(jsonPart); + + QNetworkAccessManager *netManager = new QNetworkAccessManager(); + QNetworkRequest netRequest(TelemetryClassAuthenticator::getTrackingPushURL()); + QNetworkReply *netReply = netManager->post(netRequest, httpMultiPart); + httpMultiPart->setParent(netReply); + + connect(netManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(pushFinished(QNetworkReply*))); +} + +QJsonDocument TelemetryClass::getOperatingSystem() +{ + QJsonDocument jsonDocument; + QJsonObject jsonObject; +#if QT_VERSION >= 0x050400 + jsonObject["OSName"] = QSysInfo::prettyProductName(); + jsonObject["OSArch"] = QSysInfo::currentCpuArchitecture(); +#endif + jsonDocument.setObject(jsonObject); + return jsonDocument; +} + +QJsonDocument TelemetryClass::getSystemHardware() +{ + QJsonDocument jsonDocument; + QJsonObject jsonObject; +#ifdef GTA5SYNC_WIN + { + int CPUInfo[4] = {-1}; + unsigned nExIds, i = 0; + char CPUBrandString[0x40]; + __cpuid(CPUInfo, 0x80000000); + nExIds = CPUInfo[0]; + for (i = 0x80000000; i <= nExIds; ++i) + { + __cpuid(CPUInfo, i); + if (i == 0x80000002) { memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo)); } + else if (i == 0x80000003) { memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo)); } + else if (i == 0x80000004) { memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo)); } + } + jsonObject["CPUName"] = QString(CPUBrandString).trimmed(); + SYSTEM_INFO sysInfo; + GetSystemInfo(&sysInfo); + jsonObject["CPUThreads"] = QString::number(sysInfo.dwNumberOfProcessors); + MEMORYSTATUSEX statex; + statex.dwLength = sizeof(statex); + GlobalMemoryStatusEx(&statex); + jsonObject["SystemRAM"] = QString(QString::number((statex.ullTotalPhys / 1024) / 1024) % "MB"); + } +#else + QDir procDir("/proc"); + if (procDir.exists()) + { + QFile cpuInfo("/proc/cpuinfo"); + if (cpuInfo.open(QFile::ReadOnly)) + { + QByteArray cpuInfoArray = cpuInfo.readAll(); + QBuffer cpuInfoBuffer(&cpuInfoArray); + if (cpuInfoBuffer.open(QBuffer::ReadOnly)) + { + QByteArray toFind = "model name"; + while (cpuInfoBuffer.canReadLine()) + { + QByteArray cpuData = cpuInfoBuffer.readLine(); + if (cpuData.left(toFind.length()) == toFind) + { + jsonObject["CPUName"] = QString::fromUtf8(cpuData).split(':').at(1).trimmed(); + break; + } + } + int cpuThreads = 0; + toFind = "processor"; + cpuInfoBuffer.seek(0); + while (cpuInfoBuffer.canReadLine()) + { + QByteArray cpuData = cpuInfoBuffer.readLine(); + if (cpuData.left(toFind.length()) == toFind) + { + cpuThreads++; + } + } + jsonObject["CPUThreads"] = QString::number(cpuThreads); + } + } + + QFile memInfo("/proc/meminfo"); + if (memInfo.open(QFile::ReadOnly)) + { + QByteArray memInfoArray = memInfo.readAll(); + QBuffer memInfoBuffer(&memInfoArray); + if (memInfoBuffer.open(QBuffer::ReadOnly)) + { + QByteArray toFind = "MemTotal:"; + while (memInfoBuffer.canReadLine()) + { + QByteArray memData = memInfoBuffer.readLine(); + if (memData.left(toFind.length()) == toFind) + { + QByteArray memDataVal = memData.mid(toFind.length()).trimmed(); + int totalMemoryInKB = memDataVal.left(memDataVal.length() - 3).toInt(); + jsonObject["SystemRAM"] = QString(QString::number(totalMemoryInKB / 1024) % "MB"); + break; + } + } + } + } + } +#endif + + jsonDocument.setObject(jsonObject); + return jsonDocument; +} + +QJsonDocument TelemetryClass::getApplicationSpec() +{ + QJsonDocument jsonDocument; + QJsonObject jsonObject; +#if QT_VERSION >= 0x050400 + jsonObject["Arch"] = QSysInfo::buildCpuArchitecture(); +#endif + jsonObject["Name"] = GTA5SYNC_APPSTR; + jsonObject["Version"] = GTA5SYNC_APPVER; + jsonObject["BuildDateTime"] = AppEnv::getBuildDateTime(); + jsonObject["BuildType"] = GTA5SYNC_BUILDTYPE; + jsonObject["QtVersion"] = qVersion(); + jsonDocument.setObject(jsonObject); + return jsonDocument; +} + +QJsonDocument TelemetryClass::getSystemLocaleList() +{ + QJsonDocument jsonDocument; + QJsonObject jsonObject; + QStringList languagesList = QLocale::system().uiLanguages(); + if (languagesList.length() >= 1) + { + jsonObject["PrimaryLanguage"] = languagesList.at(0); + } + if (languagesList.length() >= 2) + { + languagesList.removeAt(0); + jsonObject["SecondaryLanguages"] = QJsonValue::fromVariant(languagesList); + } + jsonDocument.setObject(jsonObject); + return jsonDocument; +} + +QString TelemetryClass::categoryToString(TelemetryCategory category) +{ + switch (category) + { + case TelemetryCategory::OperatingSystemSpec: + return QString("OperatingSystemSpec"); + break; + case TelemetryCategory::HardwareSpec: + return QString("HardwareSpec"); + break; + case TelemetryCategory::UserLocaleData: + return QString("UserLocaleData"); + break; + case TelemetryCategory::ApplicationConfiguration: + return QString("ApplicationConfiguration"); + break; + case TelemetryCategory::UserFeedback: + return QString("UserFeedback"); + break; + case TelemetryCategory::ApplicationSpec: + return QString("ApplicationSpec"); + break; + case TelemetryCategory::CustomEmitted: + return QString("CustomEmitted"); + break; + default: + return QString("UnknownCategory"); + break; + } +} + +void TelemetryClass::registerClient() +{ + QNetworkAccessManager *netManager = new QNetworkAccessManager(); + QNetworkRequest netRequest(TelemetryClassAuthenticator::getTrackingRegURL()); + netManager->get(netRequest); + + connect(netManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(registerFinished(QNetworkReply*))); +} + +void TelemetryClass::pushStartupSet() +{ + push(TelemetryCategory::ApplicationSpec); + push(TelemetryCategory::UserLocaleData); + push(TelemetryCategory::OperatingSystemSpec); + push(TelemetryCategory::HardwareSpec); +} + +void TelemetryClass::pushFinished(QNetworkReply *reply) +{ +#ifdef GTA5SYNC_DEBUG + qDebug() << "Telemetry" << reply->readAll().trimmed(); +#endif + reply->deleteLater(); + sender()->deleteLater(); + emit pushed(); +} + +void TelemetryClass::registerFinished(QNetworkReply *reply) +{ + if (reply->canReadLine()) + { + QByteArray readData = reply->readLine(); + if (QString::fromUtf8(readData).trimmed() == QString("Registration success!") && reply->canReadLine()) + { + readData = reply->readLine(); + telemetryClientID = QString::fromUtf8(readData).trimmed(); + QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR); + settings.beginGroup("Telemetry"); + settings.setValue("ClientID", telemetryClientID); + settings.endGroup(); +#ifdef GTA5SYNC_DEBUG + qDebug() << "Telemetry" << QString("Registration success!"); +#endif + } + else + { +#ifdef GTA5SYNC_DEBUG + qDebug() << "Telemetry" << QString("Registration failed!"); +#endif + } + } + else + { +#ifdef GTA5SYNC_DEBUG + qDebug() << "Telemetry" << QString("Registration failed!"); +#endif + } + reply->deleteLater(); + sender()->deleteLater(); + emit registered(); +} diff --git a/TelemetryClass.h b/TelemetryClass.h new file mode 100644 index 0000000..a009f31 --- /dev/null +++ b/TelemetryClass.h @@ -0,0 +1,75 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2018 Syping +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#ifndef TELEMETRYCLASS_H +#define TELEMETRYCLASS_H + +#include +#include +#include +#include + +enum class TelemetryCategory : int { OperatingSystemSpec = 0, HardwareSpec = 1, UserLocaleData = 2, ApplicationConfiguration = 3, UserFeedback = 4, ApplicationSpec = 5, CustomEmitted = 99}; + +class TelemetryClass : public QObject +{ + Q_OBJECT +public: + static TelemetryClass* getInstance() { return &telemetryClassInstance; } + static QString categoryToString(TelemetryCategory category); + bool canPush(); + bool canRegister(); + bool isEnabled(); + bool isStateForced(); + bool isRegistered(); + void init(); + void refresh(); + void setEnabled(bool enabled); + void setDisabled(bool disabled); + void push(TelemetryCategory category); + void push(TelemetryCategory category, const QJsonDocument json); + void registerClient(); + +private: + static TelemetryClass telemetryClassInstance; + QString telemetryClientID; + bool telemetryEnabled; + bool telemetryStateForced; + + QJsonDocument getOperatingSystem(); + QJsonDocument getSystemHardware(); + QJsonDocument getApplicationSpec(); + QJsonDocument getSystemLocaleList(); + +public slots: + void pushStartupSet(); + +private slots: + void pushFinished(QNetworkReply *reply); + void registerFinished(QNetworkReply *reply); + +signals: + void pushed(); + void registered(); +}; + +extern TelemetryClass telemetryClass; + +#define Telemetry TelemetryClass::getInstance() + +#endif // TELEMETRYCLASS_H diff --git a/UserInterface.cpp b/UserInterface.cpp index 6a607b6..5948176 100755 --- a/UserInterface.cpp +++ b/UserInterface.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -63,16 +63,41 @@ UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, D this->setWindowTitle(defaultWindowTitle.arg(tr("Select Profile"))); ui->labVersion->setText(QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER)); + // Set Icon for Close Button if (QIcon::hasThemeIcon("dialog-close")) { ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); } + else if (QIcon::hasThemeIcon("gtk-close")) + { + ui->cmdClose->setIcon(QIcon::fromTheme("gtk-close")); + } + + // Set Icon for Reload Button + if (QIcon::hasThemeIcon("view-refresh")) + { + ui->cmdReload->setIcon(QIcon::fromTheme("view-refresh")); + } + else if (QIcon::hasThemeIcon("reload")) + { + ui->cmdReload->setIcon(QIcon::fromTheme("reload")); + } + + // Set Icon for Preferences Menu Item if (QIcon::hasThemeIcon("preferences-system")) { #ifndef Q_OS_MACOS // Setting icon for preferences/settings/options lead to a crash in Mac OS X ui->actionOptions->setIcon(QIcon::fromTheme("preferences-system")); #endif } + else if (QIcon::hasThemeIcon("configure")) + { +#ifndef Q_OS_MACOS // Setting icon for preferences/settings/options lead to a crash in Mac OS X + ui->actionOptions->setIcon(QIcon::fromTheme("configure")); +#endif + } + + // Set Icon for Exit Menu Item if (QIcon::hasThemeIcon("application-exit")) { #ifndef Q_OS_MACOS // Setting icon for exit/quit lead to a crash in Mac OS X diff --git a/config.h b/config.h index af810ef..d917acd 100755 --- a/config.h +++ b/config.h @@ -50,7 +50,7 @@ #ifndef GTA5SYNC_APPVER #ifndef GTA5SYNC_DAILYB -#define GTA5SYNC_APPVER "1.5.0-dev7" +#define GTA5SYNC_APPVER "1.5.0-dev8" #else #define GTA5SYNC_APPVER GTA5SYNC_DAILYB #endif diff --git a/gta5view.pro b/gta5view.pro index 2bbd837..b40de8e 100755 --- a/gta5view.pro +++ b/gta5view.pro @@ -1,6 +1,6 @@ #/***************************************************************************** #* gta5view Grand Theft Auto V Profile Viewer -#* Copyright (C) 2015-2017 Syping +#* Copyright (C) 2015-2018 Syping #* #* This program is free software: you can redistribute it and/or modify #* it under the terms of the GNU General Public License as published by @@ -60,9 +60,11 @@ SOURCES += main.cpp \ SnapmaticWidget.cpp \ StandardPaths.cpp \ StringParser.cpp \ + TelemetryClass.cpp \ TranslationClass.cpp \ UserInterface.cpp \ anpro/JSHighlighter.cpp \ + tmext/TelemetryClassAuthenticator.cpp \ uimod/UiModLabel.cpp \ uimod/UiModWidget.cpp @@ -98,9 +100,11 @@ HEADERS += \ SnapmaticWidget.h \ StandardPaths.h \ StringParser.h \ + TelemetryClass.h \ TranslationClass.h \ UserInterface.h \ anpro/JSHighlighter.h \ + tmext/TelemetryClassAuthenticator.h \ uimod/UiModLabel.h \ uimod/UiModWidget.h @@ -142,7 +146,7 @@ DISTFILES += res/app.rc \ lang/gta5sync_no.ts \ lang/README.txt -INCLUDEPATH += ./anpro ./uimod +INCLUDEPATH += ./anpro ./tmext ./uimod # GTA5SYNC/GTA5VIEW ONLY @@ -156,6 +160,7 @@ win32: DEFINES += GTA5SYNC_WIN win32: RC_FILE += res/app.rc win32: LIBS += -luser32 win32: CONFIG -= embed_manifest_exe +contains(DEFINES, GTA5SYNC_APV): greaterThan(QT_MAJOR_VERSION, 4): greaterThan(QT_MINOR_VERSION, 1): win32: LIBS += -ldwmapi # MAC OS X ONLY macx: ICON = res/5sync.icns @@ -208,3 +213,12 @@ contains(DEFINES, GTA5SYNC_QCONF){ INSTALLS += langfiles } } + +# TELEMETRY BASED STUFF + +!contains(DEFINES, GTA5SYNC_TELEMETRY){ + SOURCES -= TelemetryClass.cpp \ + tmext/TelemetryClassAuthenticator.cpp + HEADERS -= TelemetryClass.h \ + tmext/TelemetryClassAuthenticator.h +} diff --git a/main.cpp b/main.cpp index a6c0f5c..b2dfca2 100755 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5sync GRAND THEFT AUTO V SYNC -* Copyright (C) 2016-2017 Syping +* Copyright (C) 2016-2018 Syping * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -49,6 +49,10 @@ #include #endif +#ifdef GTA5SYNC_TELEMETRY +#include "TelemetryClass.h" +#endif + int main(int argc, char *argv[]) { QApplication a(argc, argv); @@ -100,30 +104,56 @@ int main(int argc, char *argv[]) a.addLibraryPath(pluginsDir); } - TCInstance->initUserLanguage(); - TCInstance->loadTranslation(&a); - - if (isFirstStart) - { - QMessageBox::StandardButton button = QMessageBox::information(a.desktop(), QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER), QApplication::tr("

Welcome to %1!

You want to configure %1 before you start using it?").arg(GTA5SYNC_APPSTR), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); - if (button == QMessageBox::Yes) - { - ProfileDatabase profileDB; - OptionsDialog optionsDialog(&profileDB); - optionsDialog.setWindowIcon(IconLoader::loadingAppIcon()); - optionsDialog.show(); - optionsDialog.exec(); - } - settings.setValue("IsFirstStart", false); - } - - settings.endGroup(); - QStringList applicationArgs = a.arguments(); QString selectedAction; QString arg1; applicationArgs.removeAt(0); + TCInstance->initUserLanguage(); + TCInstance->loadTranslation(&a); + + if (!applicationArgs.contains("--skip-firststart")) + { + if (isFirstStart) + { + QMessageBox::StandardButton button = QMessageBox::information(a.desktop(), QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER), QApplication::tr("

Welcome to %1!

You want to configure %1 before you start using it?").arg(GTA5SYNC_APPSTR), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (button == QMessageBox::Yes) + { + ProfileDatabase profileDB; + OptionsDialog optionsDialog(&profileDB); + optionsDialog.setWindowIcon(IconLoader::loadingAppIcon()); + optionsDialog.show(); + optionsDialog.exec(); + } + settings.setValue("IsFirstStart", false); + } + } + + settings.endGroup(); + +#ifdef GTA5SYNC_TELEMETRY + if (!applicationArgs.contains("--disable-telemetry")) + { + QObject::connect(Telemetry, SIGNAL(registered()), Telemetry, SLOT(pushStartupSet())); + if (!applicationArgs.contains("--skip-telemetryinit")) + { + Telemetry->init(); + if (Telemetry->canPush()) + { + Telemetry->pushStartupSet(); + } + else if (Telemetry->canRegister()) + { + Telemetry->registerClient(); + } + } + } + else + { + Telemetry->setDisabled(true); + } +#endif + for (QString currentArg : applicationArgs) { QString reworkedArg; diff --git a/res/app.rc b/res/app.rc index 03a9217..4722b1a 100755 --- a/res/app.rc +++ b/res/app.rc @@ -24,13 +24,13 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Syping" - VALUE "FileDescription", "gta5view\0" - VALUE "FileVersion", "1.5.0-dev7\0" - VALUE "InternalName", "gta5view\0" - VALUE "LegalCopyright", "Copyright © 2016-2017 Syping\0" - VALUE "OriginalFilename", "gta5view.exe\0" - VALUE "ProductName", "gta5view\0" - VALUE "ProductVersion", "1.5.0-dev7\0" + VALUE "FileDescription", "gta5view" + VALUE "FileVersion", "1.5.0-dev8" + VALUE "InternalName", "gta5view" + VALUE "LegalCopyright", "Copyright © 2016-2017 Syping" + VALUE "OriginalFilename", "gta5view.exe" + VALUE "ProductName", "gta5view" + VALUE "ProductVersion", "1.5.0-dev8" END END END diff --git a/tmext/TelemetryClassAuthenticator.cpp b/tmext/TelemetryClassAuthenticator.cpp new file mode 100644 index 0000000..6fb5375 --- /dev/null +++ b/tmext/TelemetryClassAuthenticator.cpp @@ -0,0 +1,99 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2018 Syping +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#include "TelemetryClassAuthenticator.h" +#include +#include + +#ifndef GTA5SYNC_TELEMETRY_PUSHURL +#define GTA5SYNC_TELEMETRY_PUSHURL "" +#endif + +#ifndef GTA5SYNC_TELEMETRY_REGURL +#define GTA5SYNC_TELEMETRY_REGURL "" +#endif + +#ifndef GTA5SYNC_TELEMETRY_AUTHID +#define GTA5SYNC_TELEMETRY_AUTHID "" +#endif + +#ifndef GTA5SYNC_TELEMETRY_AUTHPW +#define GTA5SYNC_TELEMETRY_AUTHPW "" +#endif + +const QUrl TelemetryClassAuthenticator::getTrackingPushURL() +{ + if (haveAccessData()) + { + QUrl pushUrl(GTA5SYNC_TELEMETRY_PUSHURL); + QUrlQuery pushQuery(pushUrl); + if (!getTrackingAuthID().isEmpty()) { pushQuery.addQueryItem("tid", getTrackingAuthID()); } + if (!getTrackingAuthPW().isEmpty()) { pushQuery.addQueryItem("tpw", getTrackingAuthPW()); } + pushUrl.setQuery(pushQuery.query(QUrl::FullyEncoded)); + return pushUrl; + } + else + { + QUrl pushUrl(GTA5SYNC_TELEMETRY_PUSHURL); + return pushUrl; + } +} + +const QUrl TelemetryClassAuthenticator::getTrackingRegURL() +{ + if (haveAccessData()) + { + QUrl regUrl(GTA5SYNC_TELEMETRY_REGURL); + QUrlQuery regQuery(regUrl); + if (!getTrackingAuthID().isEmpty()) { regQuery.addQueryItem("tid", getTrackingAuthID()); } + if (!getTrackingAuthPW().isEmpty()) { regQuery.addQueryItem("tpw", getTrackingAuthPW()); } + regUrl.setQuery(regQuery.query(QUrl::FullyEncoded)); + return regUrl; + } + else + { + QUrl regUrl(GTA5SYNC_TELEMETRY_REGURL); + return regUrl; + } +} + +const QString TelemetryClassAuthenticator::getTrackingAuthID() +{ + return QString(GTA5SYNC_TELEMETRY_AUTHID); +} + +const QString TelemetryClassAuthenticator::getTrackingAuthPW() +{ + return QString(GTA5SYNC_TELEMETRY_AUTHPW); +} + +bool TelemetryClassAuthenticator::havePushURL() +{ + return !getTrackingPushURL().isEmpty(); +} + +bool TelemetryClassAuthenticator::haveRegURL() +{ + return !getTrackingRegURL().isEmpty(); +} + +bool TelemetryClassAuthenticator::haveAccessData() +{ + if (getTrackingAuthID().isEmpty() && getTrackingAuthPW().isEmpty()) { return false; } + return true; +} diff --git a/tmext/TelemetryClassAuthenticator.h b/tmext/TelemetryClassAuthenticator.h new file mode 100644 index 0000000..d2dd840 --- /dev/null +++ b/tmext/TelemetryClassAuthenticator.h @@ -0,0 +1,41 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2018 Syping +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#ifndef TELEMETRYCLASSAUTHENTICATOR_H +#define TELEMETRYCLASSAUTHENTICATOR_H + +#include +#include +#include +#include + +class TelemetryClassAuthenticator : public QObject +{ + Q_OBJECT +public: + static const QUrl getTrackingPushURL(); + static const QUrl getTrackingRegURL(); + static const QString getTrackingAuthID(); + static const QString getTrackingAuthPW(); + static bool havePushURL(); + static bool haveRegURL(); + static bool haveAccessData(); +}; + + +#endif // TELEMETRYCLASSAUTHENTICATOR_H