diff --git a/src/DownloadManager.cpp b/src/DownloadManager.cpp index 5ab95c572b..ca185cc1cd 100644 --- a/src/DownloadManager.cpp +++ b/src/DownloadManager.cpp @@ -966,6 +966,7 @@ DownloadManager::UploadScoreWithReplayData(HighScore* hs) vector offsets = hs->GetOffsetVector(); vector columns = hs->GetTrackVector(); vector types = hs->GetTapNoteTypeVector(); + vector rows = hs->GetNoteRowVector(); if (offsets.size() > 0) { replayString = "["; vector& timestamps = hs->timeStamps; @@ -974,7 +975,8 @@ DownloadManager::UploadScoreWithReplayData(HighScore* hs) replayString += to_string(timestamps[i]) + ","; replayString += to_string(1000.f * offsets[i]) + ","; replayString += to_string(columns[i]) + ","; - replayString += to_string(types[i]); + replayString += to_string(types[i]) + ","; + replayString += to_string(rows[i]); replayString += "],"; } replayString = @@ -1035,7 +1037,8 @@ DownloadManager::UploadScoreWithReplayData(HighScore* hs) return; } void // not tested exhaustively -mina -DownloadManager::UploadScoreWithReplayDataFromDisk(string sk) +DownloadManager::UploadScoreWithReplayDataFromDisk(string sk, + function callback) { if (!LoggedIn()) return; @@ -1054,6 +1057,7 @@ DownloadManager::UploadScoreWithReplayDataFromDisk(string sk) vector offsets = hs->GetOffsetVector(); vector columns = hs->GetTrackVector(); vector types = hs->GetTapNoteTypeVector(); + auto& rows = hs->GetNoteRowVector(); if (offsets.size() > 0) { replayString = "["; @@ -1067,7 +1071,8 @@ DownloadManager::UploadScoreWithReplayDataFromDisk(string sk) replayString += to_string(1000.f * offsets[i]); if (hs->GetReplayType() == 2) { replayString += "," + to_string(columns[i]) + ","; - replayString += to_string(types[i]); + replayString += to_string(types[i]) + ","; + replayString += to_string(rows[i]); } replayString += "],"; } @@ -1081,7 +1086,7 @@ DownloadManager::UploadScoreWithReplayDataFromDisk(string sk) curlHandle, form, lastPtr, "replay_data", replayString); SetCURLPostToURL(curlHandle, url); curl_easy_setopt(curlHandle, CURLOPT_HTTPPOST, form); - auto done = [this, hs](HTTPRequest& req, CURLMsg*) { + auto done = [this, hs, callback](HTTPRequest& req, CURLMsg*) { long response_code; curl_easy_getinfo(req.handle, CURLINFO_RESPONSE_CODE, &response_code); json j; @@ -1123,6 +1128,7 @@ DownloadManager::UploadScoreWithReplayDataFromDisk(string sk) } } catch (exception e) { } + callback(); }; HTTPRequest* req = new HTTPRequest(curlHandle, done); SetCURLResultsString(curlHandle, &(req->result)); @@ -1865,14 +1871,30 @@ DownloadManager::UploadScores() if (!LoggedIn()) return false; auto scores = SCOREMAN->GetAllPBPtrs(); + deque toUpload; for (auto& vec : scores) { for (auto& scorePtr : vec) { - if (!scorePtr->IsUploadedToServer(serverURL.Get())) { - UploadScore(scorePtr); - scorePtr->AddUploadedServer(serverURL.Get()); + auto ts = scorePtr->GetTopScore(); + if ((ts == 1 || ts == 2) && + !scorePtr->IsUploadedToServer(serverURL.Get())) { + toUpload.emplace_back(scorePtr); } } } + function lambda; + lambda = [toUpload, lambda]() mutable { + auto& it = toUpload.begin(); + if (it != toUpload.end()) { + toUpload.pop_front(); + auto& hs = (*it); + DLMAN->UploadScoreWithReplayDataFromDisk( + hs->GetChartKey(), [hs, toUpload, lambda]() { + hs->AddUploadedServer(serverURL.Get()); + lambda(); + }); + } + }; + lambda(); return true; } diff --git a/src/DownloadManager.h b/src/DownloadManager.h index 6dc1b4d613..f687927e74 100644 --- a/src/DownloadManager.h +++ b/src/DownloadManager.h @@ -246,7 +246,9 @@ class DownloadManager bool EncodeSpaces(string& str); void UploadScoreWithReplayData(HighScore* hs); - void UploadScoreWithReplayDataFromDisk(string sk); + void UploadScoreWithReplayDataFromDisk( + string sk, + function callback = function()); void UploadScore(HighScore* hs); bool ShouldUploadScores(); diff --git a/src/HighScore.cpp b/src/HighScore.cpp index e3ef15436c..2f63de7de1 100644 --- a/src/HighScore.cpp +++ b/src/HighScore.cpp @@ -320,7 +320,7 @@ HighScoreImpl::CreateNode() const pNode->AppendChild("NoChordCohesion", bNoChordCohesion); pNode->AppendChild("EtternaValid", bEtternaValid); if (!uploaded.empty()) { - XNode* pServerNode = pNode->AppendChild("Servers"); + XNode* pServerNode = pNode->AppendChild("Servs"); for (auto server : uploaded) pServerNode->AppendChild("server", server); } @@ -395,7 +395,7 @@ HighScoreImpl::CreateEttNode() const pNode->AppendChild("DateTime", dateTime.GetString()); pNode->AppendChild("TopScore", TopScore); if (!uploaded.empty()) { - XNode* pServerNode = pNode->AppendChild("Servers"); + XNode* pServerNode = pNode->AppendChild("Servs"); for (auto server : uploaded) pServerNode->AppendChild("server", server); }