diff --git a/backends/twitter/Requests/TimelineRequest.cpp b/backends/twitter/Requests/TimelineRequest.cpp index 431078dc..dc4af4aa 100644 --- a/backends/twitter/Requests/TimelineRequest.cpp +++ b/backends/twitter/Requests/TimelineRequest.cpp @@ -2,11 +2,9 @@ DEFINE_LOGGER(logger, "TimelineRequest") void TimelineRequest::run() { - - bool success; - + if(userRequested != "") success = twitObj->timelineUserGet(false, false, 20, userRequested, false); - else success = twitObj->timelineHomeGet(); + else success = twitObj->timelineHomeGet(since_id); replyMsg = ""; if(success) { @@ -20,15 +18,20 @@ void TimelineRequest::run() std::vector tweets = getTimeline(replyMsg); timeline = "\n"; - for(int i=0 ; igetMostRecentTweetID(user)) )) { + for(int i=0 ; iupdateUsersLastTweetID(user, tweets[0].getID()); } } } void TimelineRequest::finalize() { - if(replyMsg.length()) { + if(success && timeline != "\n") { std::string error = getErrorMessage(replyMsg); if(error.length()) { np->handleMessage(user, "twitter-account", error); diff --git a/backends/twitter/Requests/TimelineRequest.h b/backends/twitter/Requests/TimelineRequest.h index 1e442b04..464ce613 100644 --- a/backends/twitter/Requests/TimelineRequest.h +++ b/backends/twitter/Requests/TimelineRequest.h @@ -5,6 +5,7 @@ #include "../libtwitcurl/twitcurl.h" #include "../TwitterResponseParser.h" #include "transport/networkplugin.h" +#include "../TwitterPlugin.h" #include "transport/logging.h" #include #include @@ -18,14 +19,17 @@ class TimelineRequest : public Thread std::string userRequested; std::string replyMsg; std::string timeline; - NetworkPlugin *np; + std::string since_id; + TwitterPlugin *np; + bool success; public: - TimelineRequest(NetworkPlugin *_np, twitCurl *obj, const std::string &_user, const std::string &_user2) { + TimelineRequest(TwitterPlugin *_np, twitCurl *obj, const std::string &_user, const std::string &_user2, const std::string &_since_id) { twitObj = obj->clone(); np = _np; user = _user; userRequested = _user2; + since_id = _since_id; } ~TimelineRequest() { diff --git a/backends/twitter/TwitterPlugin.cpp b/backends/twitter/TwitterPlugin.cpp index c112339f..4915a4a3 100644 --- a/backends/twitter/TwitterPlugin.cpp +++ b/backends/twitter/TwitterPlugin.cpp @@ -108,9 +108,13 @@ void TwitterPlugin::handleMessageSendRequest(const std::string &user, const std: if(legacyName == "twitter-account") { + char ch; std::string cmd = "", data = ""; - std::istringstream in(message.c_str()); - in >> cmd >> data; + + int i; + for(i=0 ; irunAsThread(new DirectMessageRequest(np, sessions[user], user, username, data)); } else if(cmd == "#status") tp->runAsThread(new StatusUpdateRequest(np, sessions[user], user, data)); - else if(cmd == "#timeline") tp->runAsThread(new TimelineRequest(np, sessions[user], user, data)); + else if(cmd == "#timeline") tp->runAsThread(new TimelineRequest(np, sessions[user], user, data, "")); else if(cmd == "#friends") tp->runAsThread(new FetchFriends(np, sessions[user], user)); else handleMessage(user, "twitter-account", "Unknown command! Type #help for a list of available commands."); } @@ -145,7 +149,7 @@ void TwitterPlugin::pollForTweets() std::set::iterator it = onlineUsers.begin(); while(it != onlineUsers.end()) { std::string user = *it; - tp->runAsThread(new TimelineRequest(np, sessions[user], user, "")); + tp->runAsThread(new TimelineRequest(np, sessions[user], user, "", mostRecentTweetID[user])); it++; } m_timer->start(); @@ -237,4 +241,17 @@ void TwitterPlugin::pinExchangeComplete(const std::string user, const std::strin sessions[user]->getOAuth().setOAuthTokenSecret( OAuthAccessTokenSecret ); connectionState[user] = CONNECTED; onlineUsers.insert(user); + mostRecentTweetID[user] = ""; } + +void TwitterPlugin::updateUsersLastTweetID(const std::string user, const std::string ID) +{ + boost::mutex::scoped_lock lock(userlock); + mostRecentTweetID[user] = ID; +} + +std::string TwitterPlugin::getMostRecentTweetID(const std::string user) +{ + boost::mutex::scoped_lock lock(userlock); + return mostRecentTweetID[user]; +} diff --git a/backends/twitter/TwitterPlugin.h b/backends/twitter/TwitterPlugin.h index 77351c3e..a4bd536c 100644 --- a/backends/twitter/TwitterPlugin.h +++ b/backends/twitter/TwitterPlugin.h @@ -83,6 +83,10 @@ class TwitterPlugin : public NetworkPlugin { void OAuthFlowComplete(const std::string user, twitCurl *obj); void pinExchangeComplete(const std::string user, const std::string OAuthAccessTokenKey, const std::string OAuthAccessTokenSecret); + + void updateUsersLastTweetID(const std::string user, const std::string ID); + + std::string getMostRecentTweetID(const std::string user); private: enum status {NEW, WAITING_FOR_PIN, CONNECTED, DISCONNECTED}; @@ -99,6 +103,7 @@ class TwitterPlugin : public NetworkPlugin { ThreadPool *tp; std::map sessions; std::map connectionState; + std::map mostRecentTweetID; std::set onlineUsers; }; diff --git a/backends/twitter/libtwitcurl/twitcurl.cpp b/backends/twitter/libtwitcurl/twitcurl.cpp index 6addd2c4..f76ac817 100644 --- a/backends/twitter/libtwitcurl/twitcurl.cpp +++ b/backends/twitter/libtwitcurl/twitcurl.cpp @@ -464,11 +464,16 @@ bool twitCurl::timelinePublicGet() * response by twitter. Use getLastWebResponse() for that. * *--*/ -bool twitCurl::timelineHomeGet() +bool twitCurl::timelineHomeGet(std::string sinceId) { + std::string buildUrl = twitterDefaults::TWITCURL_HOME_TIMELINE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + if( sinceId.length() ) + { + buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_QUES + twitCurlDefaults::TWITCURL_SINCEID + sinceId; + } /* Perform GET */ - return performGet( twitterDefaults::TWITCURL_HOME_TIMELINE_URL + - twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); + return performGet( buildUrl ); } /*++ diff --git a/backends/twitter/libtwitcurl/twitcurl.h b/backends/twitter/libtwitcurl/twitcurl.h index b374cb6b..8db0d682 100644 --- a/backends/twitter/libtwitcurl/twitcurl.h +++ b/backends/twitter/libtwitcurl/twitcurl.h @@ -149,7 +149,7 @@ public: bool statusDestroyById( std::string& statusId /* in */ ); /* Twitter timeline APIs */ - bool timelineHomeGet(); + bool timelineHomeGet(std::string sinceId = "" /* in */); bool timelinePublicGet(); bool timelineFriendsGet(); bool timelineUserGet( bool trimUser /* in */, bool includeRetweets /* in */, unsigned int tweetCount /* in */, std::string userInfo = "" /* in */, bool isUserId = false /* in */ );