diff --git a/backends/twitter/libtwitcurl/twitcurl.cpp b/backends/twitter/libtwitcurl/twitcurl.cpp index 68a33804..f50f5c6b 100644 --- a/backends/twitter/libtwitcurl/twitcurl.cpp +++ b/backends/twitter/libtwitcurl/twitcurl.cpp @@ -1464,6 +1464,7 @@ bool twitCurl::performGet( const std::string& getUrl ) /* Set http request and url */ curl_easy_setopt( m_curlHandle, CURLOPT_HTTPGET, 1 ); +// curl_easy_setopt( m_curlHandle, CURLOPT_VERBOSE, 1 ); curl_easy_setopt( m_curlHandle, CURLOPT_URL, getUrl.c_str() ); /* Send http request */ diff --git a/backends/twitter/main.cpp b/backends/twitter/main.cpp index aa9a9d91..cd49c0d1 100644 --- a/backends/twitter/main.cpp +++ b/backends/twitter/main.cpp @@ -134,7 +134,7 @@ class TwitterPlugin : public NetworkPlugin { storagebackend->getUserSetting((long)info.id, OAUTH_KEY, type, key); storagebackend->getUserSetting((long)info.id, OAUTH_SECRET, type, secret); - if(key == "" || secret == ""/*registeredUsers.count(user) == 0*/) { + if(key == "" || secret == "") { LOG4CXX_INFO(logger, "Intiating oauthflow for user " << user) std::string authUrl; @@ -147,8 +147,6 @@ class TwitterPlugin : public NetworkPlugin { handleMessage(user, "twitter-account", std::string("Please reply with the PIN provided by twitter. Prefix the pin with 'pin:'. Ex. 'pin: 1234'")); connectionState[user] = WAITING_FOR_PIN; } else { - //std::vector keysecret; - //db->fetch(user, keysecret); LOG4CXX_INFO(logger, user << " is already registerd. Using the stored oauth key and secret") LOG4CXX_INFO(logger, key << " " << secret) @@ -165,6 +163,106 @@ class TwitterPlugin : public NetworkPlugin { connectionState[user] = DISCONNECTED; } + void handlePINExchange(const std::string &user, std::string &data) { + sessions[user]->getOAuth().setOAuthPin( data ); + if (sessions[user]->oAuthAccessToken() == false) { + LOG4CXX_ERROR(logger, "Error while exchanging PIN with AcessToken!") + handleLogoutRequest(user, ""); + return; + } + + std::string OAuthAccessTokenKey, OAuthAccessTokenSecret; + sessions[user]->getOAuth().getOAuthTokenKey( OAuthAccessTokenKey ); + sessions[user]->getOAuth().getOAuthTokenSecret( OAuthAccessTokenSecret ); + + UserInfo info; + if(storagebackend->getUser(user, info) == false) { + LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!") + handleLogoutRequest(user, ""); + return; + } + + storagebackend->updateUserSetting((long)info.id, OAUTH_KEY, OAuthAccessTokenKey); + storagebackend->updateUserSetting((long)info.id, OAUTH_SECRET, OAuthAccessTokenSecret); + + connectionState[user] = CONNECTED; + LOG4CXX_INFO(logger, "Sent PIN " << data << " and obtained access token"); + } + + void printHelpMessage(const std::string &user) { + std::string helpMsg = ""; + helpMsg = helpMsg + + "\nHELP\n" + + "status: - Update your status\n" + + "#timeline - Retrieve your timeline\n" + + "@: - Send a directed message to the user \n" + + "#help - print this help message\n"; + + handleMessage(user, "twitter-account", helpMsg); + } + + void handleDirectMessage(const std::string &user, std::string &username, std::string &data) { + if(sessions[user]->directMessageSend(username, data, false) == false) { + LOG4CXX_ERROR(logger, "Error while sending directed message to user " << username ); + return; + } + + LOG4CXX_INFO(logger, "Sending " << data << " to " << username) + + std::string replyMsg; + sessions[user]->getLastWebResponse( replyMsg ); + LOG4CXX_INFO(logger, replyMsg); + } + + void handleStatusUpdate(const std::string &user, std::string &data) { + if(connectionState[user] != CONNECTED) { + LOG4CXX_ERROR(logger, "Trying to update status for " << user << " when not connected!"); + return; + } + + std::string replyMsg; + if( sessions[user]->statusUpdate( data ) ) { + replyMsg = ""; + while(replyMsg.length() == 0) { + sessions[user]->getLastWebResponse( replyMsg ); + } + LOG4CXX_INFO(logger, "twitCurl:statusUpdate web response: " << replyMsg ); + } else { + sessions[user]->getLastCurlError( replyMsg ); + LOG4CXX_INFO(logger, "twitCurl::statusUpdate error: " << replyMsg ); + } + LOG4CXX_INFO(logger, "Updated status for " << user << ": " << data); + } + + void fetchTimeline(const std::string &user) { + if(connectionState[user] != CONNECTED) { + LOG4CXX_ERROR(logger, "Trying to update status for " << user << " when not connected!"); + return; + } + + std::string replyMsg = ""; + if( sessions[user]->timelineHomeGet()) { + + while(replyMsg.length() == 0) { + sessions[user]->getLastWebResponse( replyMsg ); + } + + LOG4CXX_INFO(logger, "twitCurl::timeline web response: " << replyMsg.length() << " " << replyMsg << "\n" ); + + std::vector tweets = getTimeline(replyMsg); + std::string timeline = "\n"; + for(int i=0 ; igetLastCurlError( replyMsg ); + LOG4CXX_INFO(logger, "twitCurl::timeline error: " << replyMsg ); + } + } + void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") { LOG4CXX_INFO(logger, "Sending message from " << user << " to " << legacyName << "."); @@ -174,105 +272,11 @@ class TwitterPlugin : public NetworkPlugin { handleMessage(user, "twitter-account", cmd + " " + data); - if(cmd == "pin") { - sessions[user]->getOAuth().setOAuthPin( data ); - if (sessions[user]->oAuthAccessToken() == false) { - LOG4CXX_ERROR(logger, "Error while exchanging PIN with AcessToken!") - handleLogoutRequest(user, ""); - return; - } - - std::string OAuthAccessTokenKey, OAuthAccessTokenSecret; - sessions[user]->getOAuth().getOAuthTokenKey( OAuthAccessTokenKey ); - sessions[user]->getOAuth().getOAuthTokenSecret( OAuthAccessTokenSecret ); - - //db->insert(UserData(user, OAuthAccessTokenKey, OAuthAccessTokenSecret)); - //registeredUsers.insert(user); - UserInfo info; - - if(storagebackend->getUser(user, info) == false) { - LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!") - handleLogoutRequest(user, ""); - return; - } - - storagebackend->updateUserSetting((long)info.id, OAUTH_KEY, OAuthAccessTokenKey); - storagebackend->updateUserSetting((long)info.id, OAUTH_SECRET, OAuthAccessTokenSecret); - - connectionState[user] = CONNECTED; - LOG4CXX_INFO(logger, "Sent PIN " << data << " and obtained access token"); - } - - if(cmd == "#help") { - std::string helpMsg = "\nHELP\n\ -status: - Update your status\n\ -#timeline - Retrieve your timeline\n\ -@: - Send a directed message to the user \n\ -#help - print this help message\n"; - - handleMessage(user, "twitter-account", helpMsg); - } - - if(cmd[0] == '@') { - std::string username = cmd.substr(1); - if(sessions[user]->directMessageSend(username, data, false) == false) { - LOG4CXX_ERROR(logger, "Error while sending directed message to user " << username ); - return; - } - - LOG4CXX_INFO(logger, "Sending " << data << " to " << username) - - std::string replyMsg; - sessions[user]->getLastWebResponse( replyMsg ); - LOG4CXX_INFO(logger, replyMsg); - } - - if(cmd == "status") { - if(connectionState[user] != CONNECTED) { - LOG4CXX_ERROR(logger, "Trying to update status for " << user << " when not connected!"); - return; - } - - std::string replyMsg; - if( sessions[user]->statusUpdate( data ) ) { - replyMsg = ""; - while(replyMsg.length() == 0) { - sessions[user]->getLastWebResponse( replyMsg ); - } - - LOG4CXX_INFO(logger, "twitCurl:statusUpdate web response: " << replyMsg ); - } - else { - sessions[user]->getLastCurlError( replyMsg ); - LOG4CXX_INFO(logger, "twitCurl::statusUpdate error: " << replyMsg ); - } - - LOG4CXX_INFO(logger, "Updated status for " << user << ": " << data); - } - - if(cmd == "#timeline") { - if(connectionState[user] != CONNECTED) { - LOG4CXX_ERROR(logger, "Trying to update status for " << user << " when not connected!"); - return; - } - - std::string replyMsg; - if( sessions[user]->timelineHomeGet()/*(false, false, 20, sessions[user]->getTwitterUsername(), true)*/ ) { - sessions[user]->getLastWebResponse( replyMsg ); - LOG4CXX_INFO(logger, "twitCurl::timeline web response: " << replyMsg ); - - std::vector tweets = getTimeline(replyMsg); - std::string timeline = "\n"; - for(int i=0 ; igetLastCurlError( replyMsg ); - LOG4CXX_INFO(logger, "twitCurl::timeline error: " << replyMsg ); - } - - } + if(cmd == "#pin") handlePINExchange(user, data); + else if(cmd == "#help") printHelpMessage(user); + else if(cmd[0] == '@') {std::string username = cmd.substr(1); handleDirectMessage(user, username, data);} + else if(cmd == "#status") handleStatusUpdate(user, data); + else if(cmd == "#timeline") fetchTimeline(user); } }