diff --git a/DatabaseThread.cpp b/DatabaseThread.cpp index 311fc0a..379b2f6 100755 --- a/DatabaseThread.cpp +++ b/DatabaseThread.cpp @@ -32,61 +32,102 @@ DatabaseThread::DatabaseThread(CrewDatabase *crewDB, QObject *parent) : QThread(parent), crewDB(crewDB) { + crewMaxPages = 83; } void DatabaseThread::run() { - QNetworkAccessManager *netManager = new QNetworkAccessManager(); QEventLoop threadLoop; - dbtBegin: - +dbtBegin: QStringList crewList = crewDB->getCrews(); - foreach (const QString &crewID, crewList) + + // Quick time scan + if (crewList.length() <= 3) { - QString memberListUrl = "http://socialclub.rockstargames.com/crewsapi/GetMembersList?crewId=" + crewID; - - QNetworkRequest netRequest(memberListUrl); - netRequest.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0 gta5sync/1.0"); - netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); - netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3"); - netRequest.setRawHeader("Connection", "keep-alive"); - - QNetworkReply *netReply = netManager->get(netRequest); - - QEventLoop downloadLoop; - QObject::connect(netReply, SIGNAL(finished()), &downloadLoop, SLOT(quit())); - QTimer::singleShot(30000, &downloadLoop, SLOT(quit())); - downloadLoop.exec(); - - if (netReply->isFinished()) - { - QByteArray crewJson = netReply->readAll(); - QJsonDocument crewDocument = QJsonDocument::fromJson(crewJson); - QJsonObject crewObject = crewDocument.object(); - QVariantMap crewMap = crewObject.toVariantMap(); - if (crewMap.contains("Members")) - { - QList memberList = crewMap["Members"].toList(); - foreach (const QVariant &memberVariant, memberList) - { - QMap memberMap = memberVariant.toMap(); - if (memberMap.contains("RockstarId") && memberMap.contains("Name")) - { - int RockstarId = memberMap["RockstarId"].toInt(); - QString memberName = memberMap["Name"].toString(); - if (memberName != "" && RockstarId != 0) - { - emit playerNameFound(RockstarId, memberName); - } - } - } - } - } + scanCrewMembersList(crewList, 3, 0); + emit playerNameUpdated(); + } + else if (crewList.length() <= 5) + { + scanCrewMembersList(crewList, 2, 0); + emit playerNameUpdated(); } + QEventLoop waitingLoop; + QTimer::singleShot(5000, &waitingLoop, SLOT(quit())); + waitingLoop.exec(); + + // Long time scan + scanCrewMembersList(crewList, crewMaxPages, 10000); emit playerNameUpdated(); QTimer::singleShot(300000, &threadLoop, SLOT(quit())); threadLoop.exec(); goto dbtBegin; } + +void DatabaseThread::scanCrewMembersList(QStringList crewList, int maxPages, int requestDelay) +{ + foreach (const QString &crewID, crewList) + { + + int currentPage = 0; + int foundPlayers = 0; + int totalPlayers = 1000; + + while(foundPlayers < totalPlayers && currentPage < maxPages) + { + QNetworkAccessManager *netManager = new QNetworkAccessManager(); + + QString memberListUrl = "http://socialclub.rockstargames.com/crewsapi/GetMembersList?crewId=" + crewID + "&pageNumber=" + QString::number(currentPage); + + QNetworkRequest netRequest(memberListUrl); + netRequest.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 gta5sync/1.0"); + netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3"); + netRequest.setRawHeader("Connection", "keep-alive"); + + QNetworkReply *netReply = netManager->get(netRequest); + + QEventLoop downloadLoop; + QObject::connect(netReply, SIGNAL(finished()), &downloadLoop, SLOT(quit())); + QTimer::singleShot(30000, &downloadLoop, SLOT(quit())); + downloadLoop.exec(); + + if (netReply->isFinished()) + { + QByteArray crewJson = netReply->readAll(); + QJsonDocument crewDocument = QJsonDocument::fromJson(crewJson); + QJsonObject crewObject = crewDocument.object(); + QVariantMap crewMap = crewObject.toVariantMap(); + + if (crewMap.contains("Total")) { totalPlayers = crewMap["Total"].toInt(); } + + if (crewMap.contains("Members")) + { + QList memberList = crewMap["Members"].toList(); + foreach (const QVariant &memberVariant, memberList) + { + QMap memberMap = memberVariant.toMap(); + foundPlayers++; + if (memberMap.contains("RockstarId") && memberMap.contains("Name")) + { + int RockstarId = memberMap["RockstarId"].toInt(); + QString memberName = memberMap["Name"].toString(); + if (memberName != "" && RockstarId != 0) + { + emit playerNameFound(RockstarId, memberName); + } + } + } + } + + QEventLoop waitingLoop; + QTimer::singleShot(requestDelay, &waitingLoop, SLOT(quit())); + waitingLoop.exec(); + + currentPage++; + } + } + } +} diff --git a/DatabaseThread.h b/DatabaseThread.h index 37e0a7d..9ca9081 100755 --- a/DatabaseThread.h +++ b/DatabaseThread.h @@ -31,6 +31,9 @@ public: private: CrewDatabase *crewDB; + void scanCrewMembersList(QStringList crewList, int maxPages, int requestDelay); + int crewMaxPages; + int plyrPerReq; protected: void run();