From e0f9d9b1a1a81086671adbcdc09ce69e3cfd6eee Mon Sep 17 00:00:00 2001
From: Rafael <Syping@users.noreply.github.com>
Date: Wed, 23 Mar 2016 07:45:30 +0100
Subject: [PATCH] crew scan feature improved

---
 DatabaseThread.cpp | 127 ++++++++++++++++++++++++++++++---------------
 DatabaseThread.h   |   3 ++
 2 files changed, 87 insertions(+), 43 deletions(-)

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<QVariant> memberList = crewMap["Members"].toList();
-                foreach (const QVariant &memberVariant, memberList)
-                {
-                    QMap<QString, QVariant> 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<QVariant> memberList = crewMap["Members"].toList();
+                    foreach (const QVariant &memberVariant, memberList)
+                    {
+                        QMap<QString, QVariant> 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();