From fc98ec671a5976e200ead8c7ae82efd1a64bee9b Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sun, 19 Feb 2017 22:21:05 -0500 Subject: [PATCH] Make sure track path is saved to track view so sending it back won't crash. Keep track of users for requests to implement limited amounts of requests. Implement requesting with limits. --- src/GroovePlayer.cpp | 6 +++--- src/GroovePlayer.h | 2 +- src/WebInterface.cpp | 5 ++++- src/ui/RequestInterface.cpp | 41 ++++++++++++++++++++++++++++++++++++- src/ui/RequestInterface.h | 2 ++ src/ui/TrackDetails.cpp | 2 ++ src/ui/TrackDetails.h | 1 + 7 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp index efaac9c..796fd0c 100644 --- a/src/GroovePlayer.cpp +++ b/src/GroovePlayer.cpp @@ -150,7 +150,7 @@ std::list GroovePlayerMgr::getNextVoteBatch(Wt::Dbo::Session* sessio if(requestQueue.size() > 0) { //There's a request. Pick one up front and put as third item. - AudioTrack selected = requestQueue.front(); + AudioTrack selected = requestQueue.front().first; getPictureFromTrack(&selected); selectedTracks.push_back(selected); } @@ -308,7 +308,7 @@ void GroovePlayerMgr::grooveEventLoop() if(requestQueue.size() > 0) { //If winning track was a request, now you can remove it from request queue. - if(requestQueue.front().trackFingerprint == winner.trackFingerprint) + if(requestQueue.front().first.trackFingerprint == winner.trackFingerprint) { requestQueue.pop_front(); } @@ -325,7 +325,7 @@ void GroovePlayerMgr::grooveEventLoop() //Pick request song if there are any. if(requestQueue.size() > 0) { - winner = requestQueue.front(); + winner = requestQueue.front().first; requestQueue.pop_front(); } else diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h index 940c177..efe5e06 100644 --- a/src/GroovePlayer.h +++ b/src/GroovePlayer.h @@ -65,7 +65,7 @@ public: User userInvolved; std::list tracksInvolved; }; - std::list requestQueue; + std::list> requestQueue; std::list lastInternalEvents; Wt::Dbo::backend::Sqlite3* sqliteConnection; Wt::Dbo::FixedSqlConnectionPool* connectionPool; diff --git a/src/WebInterface.cpp b/src/WebInterface.cpp index 8381a74..bf2e1cc 100644 --- a/src/WebInterface.cpp +++ b/src/WebInterface.cpp @@ -23,6 +23,7 @@ #include #include #include +#include struct WebInterface::internal { @@ -75,6 +76,7 @@ void WebInterface::playPauseActionFromServer(User userPausing, bool pause) void WebInterface::songChangedFromServer(AudioTrack nextTrack) { priv_int->playerUI->updateDetailsFromServer(nextTrack); + priv_int->playerUI->requestPane->updateRequestButtonState(); triggerUpdate(); } @@ -114,5 +116,6 @@ void WebInterface::voteTracksUpdatedFromServer(std::list voteableTra std::string WebInterface::getNotificationJs(std::string notificationText) { - return std::string("function notifyMe(a,b){var c=\"")+notificationText+std::string("\";if('Notification'in window)if('granted'===Notification.permission){new Notification(c)}else'denied'!==Notification.permission&&Notification.requestPermission(function(a){if('granted'===a){new Notification(c)}});else;}"); + std::string escapedText = std::regex_replace(notificationText,std::regex("\""),"'"); + return std::string("function notifyMe(a,b){var c=\"")+escapedText+std::string("\";if('Notification'in window)if('granted'===Notification.permission){new Notification(c)}else'denied'!==Notification.permission&&Notification.requestPermission(function(a){if('granted'===a){new Notification(c)}});else;}"); } diff --git a/src/ui/RequestInterface.cpp b/src/ui/RequestInterface.cpp index 0bdb4ec..e48fa65 100644 --- a/src/ui/RequestInterface.cpp +++ b/src/ui/RequestInterface.cpp @@ -54,7 +54,45 @@ RequestInterface::RequestInterface(WebInterface* app) void RequestInterface::trackRequestClicked(AudioTrack track) { - //TODO + if(getRequestCountForUser(app->currentUser) < 3) + { + GroovePlayerMgr::getInstance()->requestQueue.push_back(std::pair(track,app->currentUser)); + //Now check if this is this user's last request and disable buttons. + updateRequestButtonState(); + } +} + +void RequestInterface::updateRequestButtonState() +{ + if(getRequestCountForUser(app->currentUser) < 3) + { + //enable buttons + for(RequestItem* item : foundItems) + { + if(item != nullptr) item->voteBtn->setEnabled(true); + } + } + else + { + //disable buttons + for(RequestItem* item : foundItems) + { + if(item != nullptr) item->voteBtn->setEnabled(false); + } + } +} + +int RequestInterface::getRequestCountForUser(User user) +{ + int count = 0; + for(std::pair request : GroovePlayerMgr::getInstance()->requestQueue) + { + if(request.second.username == user.username) + { + count += 1; + } + } + return count; } void RequestInterface::searchClicked() @@ -101,6 +139,7 @@ void RequestInterface::searchClicked() if(!left) rowCount += 1; left = !left; } + updateRequestButtonState(); } else { diff --git a/src/ui/RequestInterface.h b/src/ui/RequestInterface.h index fe3798e..e55e769 100644 --- a/src/ui/RequestInterface.h +++ b/src/ui/RequestInterface.h @@ -77,6 +77,8 @@ public: void trackRequestClicked(AudioTrack track); void searchClicked(); + int getRequestCountForUser(User user); + void updateRequestButtonState(); }; #endif // REQUESTINTERFACE_H diff --git a/src/ui/TrackDetails.cpp b/src/ui/TrackDetails.cpp index e3c9fed..5b5886d 100644 --- a/src/ui/TrackDetails.cpp +++ b/src/ui/TrackDetails.cpp @@ -67,6 +67,7 @@ void TrackDetails::updateWithTrackDetails(AudioTrack track) trackAlbum->setText(track.trackAlbumName); trackFingerprint = track.trackFingerprint; trackGenre = track.trackGenre; + trackPath = track.trackPath; //Set image to data from track obj. coverData = new Wt::WMemoryResource(track.coverMimeType); @@ -97,5 +98,6 @@ AudioTrack TrackDetails::extractTrackFromDetails() track.trackAlbumName = trackAlbum->text().toUTF8(); track.trackGenre = trackGenre; track.trackFingerprint = trackFingerprint; + track.trackPath = trackPath; return track; } diff --git a/src/ui/TrackDetails.h b/src/ui/TrackDetails.h index 92f1385..09aa217 100644 --- a/src/ui/TrackDetails.h +++ b/src/ui/TrackDetails.h @@ -44,6 +44,7 @@ public: std::string trackFingerprint; std::string trackGenre; + std::string trackPath; void updateWithTrackDetails(AudioTrack track); void changeBackgroundColor(Wt::WColor color); -- GitLab