From 92ea88fd6030b3def92e100291102187be032490 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 9 Dec 2008 00:53:45 -0500 Subject: [PATCH] trac540 - Add 'since' param to Twitter-compatible API calls darcs-hash:20081209055345-7b5ce-e48fd4c87963b8ae15859fd03d2f1f86a16f3a2b.gz --- actions/twitapidirect_messages.php | 20 ++++- actions/twitapistatuses.php | 118 ++++++++++++++++------------- classes/Notice.php | 64 +++++++++------- classes/User.php | 10 +-- 4 files changed, 128 insertions(+), 84 deletions(-) diff --git a/actions/twitapidirect_messages.php b/actions/twitapidirect_messages.php index a14a9e567c..535795ca43 100644 --- a/actions/twitapidirect_messages.php +++ b/actions/twitapidirect_messages.php @@ -40,6 +40,8 @@ class Twitapidirect_messagesAction extends TwitterapiAction { $count = $this->arg('count'); $since = $this->arg('since'); $since_id = $this->arg('since_id'); + $before_id = $this->arg('before_id'); + $page = $this->arg('page'); if (!$page) { @@ -69,6 +71,21 @@ class Twitapidirect_messagesAction extends TwitterapiAction { $link = $server . $user->nickname . '/outbox'; } + if ($before_id) { + $message->whereAdd("id < $before_id"); + } + + if ($since_id) { + $message->whereAdd("id > $since_id"); + } + + $since = strtotime($this->arg('since')); + + if ($since) { + $d = date('Y-m-d H:i:s', $since); + $message->whereAdd("created > '$d'"); + } + $message->orderBy('created DESC, id DESC'); $message->limit((($page-1)*20), $count); $message->find(); @@ -102,7 +119,7 @@ class Twitapidirect_messagesAction extends TwitterapiAction { } $user = $apidata['user']; - $source = $this->trimmed('source'); // Not supported by Twitter. + $source = $this->trimmed('source'); // Not supported by Twitter. $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api'); if (!$source || in_array($source, $reserved_sources)) { @@ -113,7 +130,6 @@ class Twitapidirect_messagesAction extends TwitterapiAction { if (!$content) { $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']); -// } else if (mb_strlen($status) > 140) { } else { $content_shortened = common_shorten_links($content); if (mb_strlen($content_shortened) > 140) { diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php index 947d210326..e17f23aea2 100644 --- a/actions/twitapistatuses.php +++ b/actions/twitapistatuses.php @@ -39,22 +39,24 @@ class TwitapistatusesAction extends TwitterapiAction { // FIXME: To really live up to the spec we need to build a list // of notices by users who have custom avatars, so fix this SQL -- Zach - $page = $this->arg('page'); - $since_id = $this->arg('since_id'); - $before_id = $this->arg('before_id'); + $page = $this->arg('page'); + $since_id = $this->arg('since_id'); + $before_id = $this->arg('before_id'); // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB - if (!$page) { - $page = 1; - } - if (!$since_id) { - $since_id = 0; - } - if (!$before_id) { - $before_id = 0; - } - - $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id); + if (!$page) { + $page = 1; + } + if (!$since_id) { + $since_id = 0; + } + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); + + $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since); if ($notice) { @@ -88,25 +90,27 @@ class TwitapistatusesAction extends TwitterapiAction { $since = $this->arg('since'); $since_id = $this->arg('since_id'); $count = $this->arg('count'); - $page = $this->arg('page'); - $before_id = $this->arg('before_id'); + $page = $this->arg('page'); + $before_id = $this->arg('before_id'); - if (!$page) { - $page = 1; - } + if (!$page) { + $page = 1; + } if (!$count) { $count = 20; } - if (!$since_id) { - $since_id = 0; - } + if (!$since_id) { + $since_id = 0; + } // NOTE: before_id is an extension to Twitter API -- TB - if (!$before_id) { - $before_id = 0; - } + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); $user = $this->get_user($id, $apidata); $this->auth_user = $user; @@ -121,7 +125,7 @@ class TwitapistatusesAction extends TwitterapiAction { $link = common_local_url('all', array('nickname' => $user->nickname)); $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename); - $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id); + $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since); switch($apidata['content-type']) { case 'xml': @@ -162,9 +166,9 @@ class TwitapistatusesAction extends TwitterapiAction { $count = $this->arg('count'); $since = $this->arg('since'); - $since_id = $this->arg('since_id'); + $since_id = $this->arg('since_id'); $page = $this->arg('page'); - $before_id = $this->arg('before_id'); + $before_id = $this->arg('before_id'); if (!$page) { $page = 1; @@ -174,14 +178,16 @@ class TwitapistatusesAction extends TwitterapiAction { $count = 20; } - if (!$since_id) { - $since_id = 0; - } + if (!$since_id) { + $since_id = 0; + } // NOTE: before_id is an extensions to Twitter API -- TB - if (!$before_id) { - $before_id = 0; - } + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); $sitename = common_config('site', 'name'); $siteserver = common_config('site', 'server'); @@ -199,7 +205,7 @@ class TwitapistatusesAction extends TwitterapiAction { # XXX: since - $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id); + $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since); switch($apidata['content-type']) { case 'xml': @@ -248,24 +254,23 @@ class TwitapistatusesAction extends TwitterapiAction { // XXX: Note: In this case, Twitter simply returns '200 OK' // No error is given, but the status is not posted to the - // user's timeline. Seems bad. Shouldn't we throw an + // user's timeline. Seems bad. Shouldn't we throw an // errror? -- Zach return; -// } else if (mb_strlen($status) > 140) { } else { - + $status_shortened = common_shorten_links($status); if (mb_strlen($status_shortened) > 140) { // XXX: Twitter truncates anything over 140, flags the status - // as "truncated." Sending this error may screw up some clients - // that assume Twitter will truncate for them. Should we just - // truncate too? -- Zach + // as "truncated." Sending this error may screw up some clients + // that assume Twitter will truncate for them. Should we just + // truncate too? -- Zach $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']); return; - + } } @@ -323,8 +328,8 @@ class TwitapistatusesAction extends TwitterapiAction { $since = $this->arg('since'); $count = $this->arg('count'); $page = $this->arg('page'); - $since_id = $this->arg('since_id'); - $before_id = $this->arg('before_id'); + $since_id = $this->arg('since_id'); + $before_id = $this->arg('before_id'); $this->auth_user = $apidata['user']; $user = $this->auth_user; @@ -346,15 +351,18 @@ class TwitapistatusesAction extends TwitterapiAction { $count = 20; } - if (!$since_id) { - $since_id = 0; - } + if (!$since_id) { + $since_id = 0; + } // NOTE: before_id is an extension to Twitter API -- TB - if (!$before_id) { - $before_id = 0; - } - $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id); + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); + + $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since); $notices = array(); while ($notice->fetch()) { @@ -487,6 +495,14 @@ class TwitapistatusesAction extends TwitterapiAction { $sub = new Subscription(); $sub->$user_attr = $profile->id; + + $since = strtotime($this->trimmed('since')); + + if ($since) { + $d = date('Y-m-d H:i:s', $since); + $sub->whereAdd("created > '$d'"); + } + $sub->orderBy('created DESC'); $sub->limit(($page-1)*100, 100); diff --git a/classes/Notice.php b/classes/Notice.php index 8de34f39c9..456e9deb61 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -10,11 +10,11 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ if (!defined('LACONICA')) { exit(1); } @@ -31,27 +31,27 @@ define('NOTICE_CACHE_WINDOW', 61); class Notice extends Memcached_DataObject { - ###START_AUTOCODE - /* the code below is auto generated do not remove the above tag */ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ public $__table = 'notice'; // table name public $id; // int(4) primary_key not_null public $profile_id; // int(4) not_null public $uri; // varchar(255) unique_key - public $content; // varchar(140) - public $rendered; // text() - public $url; // varchar(255) + public $content; // varchar(140) + public $rendered; // text() + public $url; // varchar(255) public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP - public $reply_to; // int(4) - public $is_local; // tinyint(1) - public $source; // varchar(32) + public $reply_to; // int(4) + public $is_local; // tinyint(1) + public $source; // varchar(32) - /* Static get */ - function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); } + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); } - /* the code above is auto generated do not remove the tag below */ - ###END_AUTOCODE + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE function getProfile() { return Profile::staticGet('id', $this->profile_id); @@ -293,25 +293,25 @@ class Notice extends Memcached_DataObject # XXX: too many args; we need to move to named params or even a separate # class for notice streams - static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL) { + static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) { if (common_config('memcached', 'enabled')) { - # Skip the cache if this is a since_id or before_id qry - if ($since_id > 0 || $before_id > 0) { - return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order); + # Skip the cache if this is a since, since_id or before_id qry + if ($since_id > 0 || $before_id > 0 || $since) { + return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since); } else { return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order); } } - return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order); + return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since); } - static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order) { + static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) { $needAnd = FALSE; - $needWhere = TRUE; + $needWhere = TRUE; if (preg_match('/\bWHERE\b/i', $qry)) { $needWhere = FALSE; @@ -321,19 +321,19 @@ class Notice extends Memcached_DataObject if ($since_id > 0) { if ($needWhere) { - $qry .= ' WHERE '; + $qry .= ' WHERE '; $needWhere = FALSE; } else { $qry .= ' AND '; } - $qry .= ' notice.id > ' . $since_id; + $qry .= ' notice.id > ' . $since_id; } if ($before_id > 0) { if ($needWhere) { - $qry .= ' WHERE '; + $qry .= ' WHERE '; $needWhere = FALSE; } else { $qry .= ' AND '; @@ -342,6 +342,18 @@ class Notice extends Memcached_DataObject $qry .= ' notice.id < ' . $before_id; } + if ($since) { + + if ($needWhere) { + $qry .= ' WHERE '; + $needWhere = FALSE; + } else { + $qry .= ' AND '; + } + + $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\''; + } + # Allow ORDER override if ($order) { @@ -465,7 +477,7 @@ class Notice extends Memcached_DataObject return $wrapper; } - function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0) { + function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) { $parts = array(); @@ -484,7 +496,7 @@ class Notice extends Memcached_DataObject return Notice::getStream($qry, 'public', - $offset, $limit, $since_id, $before_id); + $offset, $limit, $since_id, $before_id, NULL, $since); } function addToInboxes() { diff --git a/classes/User.php b/classes/User.php index ddb2e33103..7ac975007c 100644 --- a/classes/User.php +++ b/classes/User.php @@ -344,7 +344,7 @@ class User extends Memcached_DataObject return $user; } - function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) { $qry = 'SELECT notice.* ' . 'FROM notice JOIN reply ON notice.id = reply.notice_id ' . @@ -352,10 +352,10 @@ class User extends Memcached_DataObject return Notice::getStream(sprintf($qry, $this->id), 'user:replies:'.$this->id, - $offset, $limit, $since_id, $before_id); + $offset, $limit, $since_id, $before_id, NULL, $since); } - function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) { $qry = 'SELECT * ' . 'FROM notice ' . @@ -377,7 +377,7 @@ class User extends Memcached_DataObject $offset, $limit); } - function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) { $enabled = common_config('inboxes', 'enabled'); # Complicated code, depending on whether we support inboxes yet @@ -403,7 +403,7 @@ class User extends Memcached_DataObject return Notice::getStream(sprintf($qry, $this->id), 'user:notices_with_friends:' . $this->id, $offset, $limit, $since_id, $before_id, - $order); + $order, $since); } function blowFavesCache() { -- 2.39.5