1
0

Save successful and failed Tweets. Load latest failed tweet for an item on subsequent attempts. Delete failed tweets for an item once a tweet is sent for that item successfully. Code cleanup and organization updates.

This commit is contained in:
Chad Kieffer 2011-02-13 13:11:42 -07:00
parent 5c3e9690df
commit 1234f8c3ff
2 changed files with 170 additions and 114 deletions

View File

@ -20,6 +20,52 @@
class Twitter_Controller extends Controller {
/**
* Verify credentials and redirect based on response from Twitter.
*/
public function callback() {
require_once(MODPATH . "twitter/lib/twitteroauth.php");
$consumer_key = module::get_var("twitter", "consumer_key");
$consumer_secret = module::get_var("twitter", "consumer_secret");
$oauth_token = Session::instance()->get("twitter_oauth_token");
$oauth_token_secret = Session::instance()->get("twitter_oauth_token_secret");
$item_url = Session::instance()->get("twitter_item_redirect");
// If the oauth_token is old redirect to the connect page
if (isset($_REQUEST['oauth_token']) && $oauth_token !== $_REQUEST['oauth_token']) {
Session::instance()->set("twitter_oauth_status", "old_token");
$this->_clear_session();
url::redirect(url::site("twitter/redirect"));
}
// Create TwitteroAuth object with app key/secret and token key/secret from default phase
$connection = new TwitterOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
// Request access tokens from twitter
$access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']);
// Save the access tokens
Session::instance()->set("twitter_access_token", $access_token);
// Remove no longer needed request tokens
Session::instance()->delete("twitter_oauth_token");
Session::instance()->delete("twitter_oauth_token_secret");
// If HTTP response is 200 continue otherwise send to connect page to retry
if (200 == $connection->http_code) {
// The user has been verified and the access tokens can be saved for future use
$this->save_user($access_token);
// Redirect to the tweet form
$item = ORM::factory("item", $item_id);
url::redirect(url::abs_site($item_url));
} else {
// @todo Log HTTP status for application log and/or error message
$this->_clear_session();
url::redirect(url::site("twitter/redirect"));
}
}
/**
* Display Twitter status dialog.
* @param int $item_id
@ -49,99 +95,9 @@ class Twitter_Controller extends Controller {
$v->user_id = $user_id;
$v->twitter_auth_url = url::site("twitter/redirect?item_url=$item_url");
}
print $v;
}
/**
* Check if current user's Twitter credentials have been stored locally.
* @param int $user_id
* @return boolean
*/
private function _is_token_set($user_id) {
$twitter_user = $this->_get_twitter_user($user_id);
if (!empty($twitter_user->oauth_token) && !empty($twitter_user->oauth_token_secret)) {
return true;
}
return false;
}
/**
* Get Twitter credentials for the current user.
* @param int $user_id
* @return mixed object|false
*/
private function _get_twitter_user($user_id) {
$twitter_user = ORM::factory("twitter_user")->where("user_id", "=", $user_id)->find();
if ($twitter_user->loaded()) {
return $twitter_user;
}
return false;
}
/**
* Verify credentials and redirect based on response from Twitter.
*/
public function callback() {
require_once(MODPATH . "twitter/lib/twitteroauth.php");
$consumer_key = module::get_var("twitter", "consumer_key");
$consumer_secret = module::get_var("twitter", "consumer_secret");
$oauth_token = Session::instance()->get("twitter_oauth_token");
$oauth_token_secret = Session::instance()->get("twitter_oauth_token_secret");
$item_url = Session::instance()->get("twitter_item_redirect");
// If the oauth_token is old redirect to the connect page
if (isset($_REQUEST['oauth_token']) && $oauth_token !== $_REQUEST['oauth_token']) {
Session::instance()->set("twitter_oauth_status", "old_token");
$this->clear_twitter_session();
url::redirect(url::site("twitter/redirect"));
}
// Create TwitteroAuth object with app key/secret and token key/secret from default phase
$connection = new TwitterOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
// Request access tokens from twitter
$access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']);
// Save the access tokens
Session::instance()->set("twitter_access_token", $access_token);
// Remove no longer needed request tokens
Session::instance()->delete("twitter_oauth_token");
Session::instance()->delete("twitter_oauth_token_secret");
// If HTTP response is 200 continue otherwise send to connect page to retry
if (200 == $connection->http_code) {
// The user has been verified and the access tokens can be saved for future use
$this->save_twitter_user($access_token);
// Redirect to the tweet form
$item = ORM::factory("item", $item_id);
url::redirect(url::abs_site($item_url));
} else {
// @todo Log HTTP status for application log and/or error message
$this->clear_twitter_session();
url::redirect(url::site("twitter/redirect"));
}
}
/**
* Save or update the current user's Twitter credentials.
* @param array $access_token
* @todo Ensure only one record per twitter_screen_name
*/
function save_twitter_user($access_token) {
$twitter_user = ORM::factory("twitter_user");
$twitter_user->oauth_token = $access_token["oauth_token"];
$twitter_user->oauth_token_secret = $access_token["oauth_token_secret"];
$twitter_user->twitter_user_id = $access_token["user_id"];
$twitter_user->screen_name = $access_token["screen_name"];
$twitter_user->user_id = identity::active_user()->id;
$twitter_user->save();
message::success(t("Twitter access tokens saved!"));
}
/**
* Redirect user to Twitter authorization page.
*/
@ -182,24 +138,42 @@ class Twitter_Controller extends Controller {
/**
* Save tweets sent and those not sent because of Twitter API issues
* @param integer $item_id
* @param string $tweet The tweet sent, or the tweet that couldn't be sent
* @param boolean $status 1 for success and 0 for not sent
* @param object $tweet The tweet sent, or the tweet that couldn't be sent
*/
public function save($item_id, $tweet, $status) {
if (!empty($item_id) && !empty($tweet) && !empty($status)) {
public function save_tweet($tweet) {
if (!empty($tweet->item_id) && !empty($tweet->tweet) && !empty($tweet->status)) {
$t = ORM::factory("twitter_tweet");
$t->created = time();
$t->item_id = $item_id;
$t->tweet = $tweet;
$t->status = $status;
$t->item_id = $tweet->item_id;
$t->twitter_id = $tweet->twitter_id;
$t->tweet = $tweet->tweet;
$t->status = $tweet->status;
$t->user_id = identity::active_user()->id;
$t->save();
}
}
/**
* Save or update the current user's Twitter credentials.
* @param array $access_token
* @todo Ensure only one record per twitter_screen_name
*/
function save_user($access_token) {
$u = ORM::factory("twitter_user");
$u->oauth_token = $access_token["oauth_token"];
$u->oauth_token_secret = $access_token["oauth_token_secret"];
$u->twitter_user_id = $access_token["user_id"];
$u->screen_name = $access_token["screen_name"];
$u->user_id = identity::active_user()->id;
$u->save();
message::success(t("Twitter access tokens saved!"));
}
/**
* Post a status update to Twitter
* @param string $message
* @todo Update previously failed tweet, if one exists
*/
public function tweet($item_id) {
access::verify_csrf();
@ -209,7 +183,7 @@ class Twitter_Controller extends Controller {
if ($form->validate()) {
$item_url = url::abs_site($item->relative_url_cache);
$twitter_user = $this->_get_twitter_user(identity::active_user()->id);
$u = $this->_get_twitter_user(identity::active_user()->id);
$consumer_key = module::get_var("twitter", "consumer_key");
$consumer_secret = module::get_var("twitter", "consumer_secret");
@ -218,38 +192,93 @@ class Twitter_Controller extends Controller {
$connection = new TwitterOAuth(
$consumer_key,
$consumer_secret,
$twitter_user->oauth_token,
$twitter_user->oauth_token_secret);
$u->oauth_token,
$u->oauth_token_secret);
$message = $form->twitter_message->tweet->value;
$connection->post('statuses/update', array('status' => $message));
$response = $connection->post('statuses/update', array('status' => $message));
if (200 == $connection->http_code) {
message::success(t("Tweet sent!"));
//url::redirect(url::abs_site($item->relative_url_cache));
//json::reply(array("result" => "success"));
json::reply(array("result" => "success", "location" => $item->url()));
$status = 1;
message::success(t("Tweet sent!"));
json::reply(array("result" => "success", "location" => $item->url()));
} else {
message::error(t("Unable to send Tweet. Your message has been saved. Please try again later."));
json::reply(array("result" => "error", "location" => $item->url()));
$status = 0;
// @todo Log Twitter error response
log::error("content", "Twitter", "Unable to sent tweet, response code: " . $connection->http_code);
message::error(t("Unable to send Tweet. Your message has been saved. Please try again later."));
json::reply(array("result" => "error", "html" => (string)$form));
}
$this->save($item_id, $message, $status);
$tweet->item_id = $item_id;
$tweet->twitter_id = $response->id;
$tweet->tweet = $message;
$tweet->status = $status;
$this->save_tweet($tweet);
$this->_delete_failed($item_id);
} else {
echo "validation failed";
json::reply(array("result" => "error", "html" => (string)$form));
}
}
/**
*
* @param <type> $tweet
*/
function update_tweet($tweet) {
}
/**
* Clear Twitter module session variables
*/
function clear_twitter_session() {
private function _clear_session() {
Session::instance()->delete("twitter_oauth_token");
Session::instance()->delete("twitter_oauth_token_secret");
Session::instance()->delete("twitter_access_token");
}
}
/**
* Delete all failed tweets by the current user for an item
* @param integer $item_id
* @todo Not implemented
*/
private function _delete_failed($item_id) {
if (is_numeric($item_id)) {
$user_id = identity::active_user()->id;
$result = db::build()
->delete("twitter_tweets")
->where("user_id", "=", $user_id)
->where("item_id", "=", $item_id)
->where("status", "=", 0)
->execute();
}
}
/**
* Get Twitter credentials for the current user.
* @param int $user_id
* @return mixed object|false
*/
private function _get_twitter_user($user_id) {
$twitter_user = ORM::factory("twitter_user")->where("user_id", "=", $user_id)->find();
if ($twitter_user->loaded()) {
return $twitter_user;
}
return false;
}
/**
* Check if current user's Twitter credentials have been stored locally.
* @param int $user_id
* @return boolean
*/
private function _is_token_set($user_id) {
$twitter_user = $this->_get_twitter_user($user_id);
if (!empty($twitter_user->oauth_token) && !empty($twitter_user->oauth_token_secret)) {
return true;
}
return false;
}
}

View File

@ -60,11 +60,18 @@ class twitter_Core {
/**
* Get tweet form
* @param object $item
* @return Forge
* @return Forge
* @todo Load previously failed tweet for the current user for this item
*/
static function get_tweet_form($item) {
$long_url = url::abs_site($item->relative_url_cache);
$default_tweet = module::get_var("twitter", "default_tweet");
// Check for saved tweets for this user and item
$saved_tweet = self::get_failed($item->id);
if ($saved_tweet) {
$default_tweet = $saved_tweet;
} else {
$default_tweet = module::get_var("twitter", "default_tweet");
}
$tweet = preg_replace("/%type/", $item->type, $default_tweet);
$tweet = preg_replace("/%title/", $item->title, $tweet);
$tweet = preg_replace("/%description/", $item->description, $tweet);
@ -87,6 +94,26 @@ class twitter_Core {
return $form;
}
/**
* Get the most recent failed tweet for an item
* @param integer $item_id
* @return mixed object|false
* @todo Not implemented
*/
function get_failed($item_id) {
$user_id = identity::active_user()->id;
$t = ORM::factory("twitter_tweet")
->where("item_id", "=", $item_id)
->where("user_id", "=", $user_id)
->where("status", "=", 0)
->find();
if ($t->loaded()) {
return $t->tweet;
} else {
return false;
}
}
/**
* Has this Gallery been registered at dev.twitter.com/app?
* @return boolean