From 6cc7c334f3c471231e0aeecfb2ae41e7edc2e526 Mon Sep 17 00:00:00 2001 From: Sarang Bharadwaj Date: Fri, 15 Jun 2012 15:15:41 +0530 Subject: [PATCH] Retweet --- backends/twitter/Requests/RetweetRequest.cpp | 23 +++++++++++ backends/twitter/Requests/RetweetRequest.h | 40 ++++++++++++++++++++ backends/twitter/TwitterPlugin.cpp | 14 ++++++- backends/twitter/TwitterPlugin.h | 1 + backends/twitter/libtwitcurl/twitcurl.cpp | 30 +++++++++++++++ backends/twitter/libtwitcurl/twitcurl.h | 2 + 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 backends/twitter/Requests/RetweetRequest.cpp create mode 100644 backends/twitter/Requests/RetweetRequest.h diff --git a/backends/twitter/Requests/RetweetRequest.cpp b/backends/twitter/Requests/RetweetRequest.cpp new file mode 100644 index 00000000..9c70657c --- /dev/null +++ b/backends/twitter/Requests/RetweetRequest.cpp @@ -0,0 +1,23 @@ +#include "RetweetRequest.h" +DEFINE_LOGGER(logger, "RetweetRequest") +void RetweetRequest::run() +{ + LOG4CXX_INFO(logger, user << " Retweeting " << data) + success = twitObj->retweetById( data ); +} + +void RetweetRequest::finalize() +{ + replyMsg = ""; + if(!success) { + twitObj->getLastCurlError( replyMsg ); + LOG4CXX_ERROR(logger, user << " " << replyMsg) + callBack(user, replyMsg); + } else { + twitObj->getLastWebResponse( replyMsg ); + std::string error = getErrorMessage( replyMsg ); + if(error.length()) LOG4CXX_ERROR(logger, user << " " << error) + else LOG4CXX_INFO(logger, user << " " << replyMsg); + callBack(user, error); + } +} diff --git a/backends/twitter/Requests/RetweetRequest.h b/backends/twitter/Requests/RetweetRequest.h new file mode 100644 index 00000000..04a48ffc --- /dev/null +++ b/backends/twitter/Requests/RetweetRequest.h @@ -0,0 +1,40 @@ +#ifndef RETWEET_H +#define RETWEET_H + +#include "../ThreadPool.h" +#include "../TwitterResponseParser.h" +#include "../libtwitcurl/twitcurl.h" +#include "transport/networkplugin.h" +#include "transport/logging.h" +#include +#include +#include + +using namespace Transport; +class RetweetRequest : public Thread +{ + twitCurl *twitObj; + std::string data; + std::string user; + std::string replyMsg; + bool success; + boost::function < void (std::string&, std::string &) > callBack; + + public: + RetweetRequest(twitCurl *obj, const std::string &_user, const std::string &_data, + boost::function < void (std::string &, std::string &) > _cb) { + twitObj = obj->clone(); + data = _data; + user = _user; + callBack = _cb; + } + + ~RetweetRequest() { + delete twitObj; + } + + void run(); + void finalize(); +}; + +#endif diff --git a/backends/twitter/TwitterPlugin.cpp b/backends/twitter/TwitterPlugin.cpp index 5119f45d..56e0dd72 100644 --- a/backends/twitter/TwitterPlugin.cpp +++ b/backends/twitter/TwitterPlugin.cpp @@ -8,6 +8,7 @@ #include "Requests/OAuthFlow.h" #include "Requests/CreateFriendRequest.h" #include "Requests/DestroyFriendRequest.h" +#include "Requests/RetweetRequest.h" DEFINE_LOGGER(logger, "Twitter Backend"); @@ -162,6 +163,8 @@ void TwitterPlugin::handleMessageSendRequest(const std::string &user, const std: boost::bind(&TwitterPlugin::createFriendResponse, this, _1, _2, _3))); else if(cmd == "#unfollow") tp->runAsThread(new DestroyFriendRequest(sessions[user], user, data, boost::bind(&TwitterPlugin::deleteFriendResponse, this, _1, _2, _3))); + else if(cmd == "#retweet") tp->runAsThread(new RetweetRequest(sessions[user], user, data, + boost::bind(&TwitterPlugin::RetweetResponse, this, _1, _2))); else handleMessage(user, "twitter-account", "Unknown command! Type #help for a list of available commands."); } @@ -365,7 +368,7 @@ void TwitterPlugin::displayTweets(std::string &user, std::string &userRequested, std::string timeline = ""; for(int i=0 ; i &messages, std::string &errMsg); void createFriendResponse(std::string &user, std::string &frnd, std::string &errMsg); void deleteFriendResponse(std::string &user, std::string &frnd, std::string &errMsg); + void RetweetResponse(std::string &user, std::string &errMsg); /***********************************************************************************/ private: diff --git a/backends/twitter/libtwitcurl/twitcurl.cpp b/backends/twitter/libtwitcurl/twitcurl.cpp index 21cef059..2ffebcac 100644 --- a/backends/twitter/libtwitcurl/twitcurl.cpp +++ b/backends/twitter/libtwitcurl/twitcurl.cpp @@ -435,6 +435,36 @@ bool twitCurl::statusDestroyById( std::string& statusId ) return retVal; } +/*++ +* @method: twitCurl::retweetById +* +* @description: method to retweet a status message by its id +* +* @input: statusId - a number in std::string format +* +* @output: true if RETWEET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::retweetById( std::string& statusId ) +{ + bool retVal = false; + if( statusId.length() ) + { + /* Prepare URL */ + std::string buildUrl = twitterDefaults::TWITCURL_RETWEET_URL + statusId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Send some dummy data in POST */ + std::string dummyData = twitCurlDefaults::TWITCURL_TEXTSTRING + + urlencode( std::string( "dummy" ) ); + + /* Perform Retweet */ + retVal = performPost( buildUrl, dummyData ); + } + return retVal; +} + /*++ * @method: twitCurl::timelinePublicGet * diff --git a/backends/twitter/libtwitcurl/twitcurl.h b/backends/twitter/libtwitcurl/twitcurl.h index d04ad042..2b78c586 100644 --- a/backends/twitter/libtwitcurl/twitcurl.h +++ b/backends/twitter/libtwitcurl/twitcurl.h @@ -61,6 +61,7 @@ namespace twitterDefaults const std::string TWITCURL_STATUSUPDATE_URL = "http://api.twitter.com/1/statuses/update"; const std::string TWITCURL_STATUSSHOW_URL = "http://api.twitter.com/1/statuses/show/"; const std::string TWITCURL_STATUDESTROY_URL = "http://api.twitter.com/1/statuses/destroy/"; + const std::string TWITCURL_RETWEET_URL = "http://api.twitter.com/1/statuses/retweet/"; /* Timeline URLs */ const std::string TWITCURL_HOME_TIMELINE_URL = "http://api.twitter.com/1/statuses/home_timeline"; @@ -147,6 +148,7 @@ public: bool statusUpdate( std::string& newStatus /* in */ ); bool statusShowById( std::string& statusId /* in */ ); bool statusDestroyById( std::string& statusId /* in */ ); + bool retweetById( std::string& statusId /* in */); /* Twitter timeline APIs */ bool timelineHomeGet(std::string sinceId = "" /* in */);