trac540 - Add 'since' param to Twitter-compatible API calls

darcs-hash:20081209055345-7b5ce-e48fd4c87963b8ae15859fd03d2f1f86a16f3a2b.gz
This commit is contained in:
Zach Copley 2008-12-09 00:53:45 -05:00
parent 8445796908
commit 92ea88fd60
4 changed files with 127 additions and 83 deletions

View File

@ -40,6 +40,8 @@ class Twitapidirect_messagesAction extends TwitterapiAction {
$count = $this->arg('count'); $count = $this->arg('count');
$since = $this->arg('since'); $since = $this->arg('since');
$since_id = $this->arg('since_id'); $since_id = $this->arg('since_id');
$before_id = $this->arg('before_id');
$page = $this->arg('page'); $page = $this->arg('page');
if (!$page) { if (!$page) {
@ -69,6 +71,21 @@ class Twitapidirect_messagesAction extends TwitterapiAction {
$link = $server . $user->nickname . '/outbox'; $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->orderBy('created DESC, id DESC');
$message->limit((($page-1)*20), $count); $message->limit((($page-1)*20), $count);
$message->find(); $message->find();
@ -113,7 +130,6 @@ class Twitapidirect_messagesAction extends TwitterapiAction {
if (!$content) { if (!$content) {
$this->client_error(_('No message text!'), $code = 406, $apidata['content-type']); $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']);
// } else if (mb_strlen($status) > 140) {
} else { } else {
$content_shortened = common_shorten_links($content); $content_shortened = common_shorten_links($content);
if (mb_strlen($content_shortened) > 140) { if (mb_strlen($content_shortened) > 140) {

View File

@ -54,7 +54,9 @@ class TwitapistatusesAction extends TwitterapiAction {
$before_id = 0; $before_id = 0;
} }
$notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id); $since = strtotime($this->arg('since'));
$notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since);
if ($notice) { if ($notice) {
@ -108,6 +110,8 @@ class TwitapistatusesAction extends TwitterapiAction {
$before_id = 0; $before_id = 0;
} }
$since = strtotime($this->arg('since'));
$user = $this->get_user($id, $apidata); $user = $this->get_user($id, $apidata);
$this->auth_user = $user; $this->auth_user = $user;
@ -121,7 +125,7 @@ class TwitapistatusesAction extends TwitterapiAction {
$link = common_local_url('all', array('nickname' => $user->nickname)); $link = common_local_url('all', array('nickname' => $user->nickname));
$subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename); $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']) { switch($apidata['content-type']) {
case 'xml': case 'xml':
@ -183,6 +187,8 @@ class TwitapistatusesAction extends TwitterapiAction {
$before_id = 0; $before_id = 0;
} }
$since = strtotime($this->arg('since'));
$sitename = common_config('site', 'name'); $sitename = common_config('site', 'name');
$siteserver = common_config('site', 'server'); $siteserver = common_config('site', 'server');
@ -199,7 +205,7 @@ class TwitapistatusesAction extends TwitterapiAction {
# XXX: since # 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']) { switch($apidata['content-type']) {
case 'xml': case 'xml':
@ -252,7 +258,6 @@ class TwitapistatusesAction extends TwitterapiAction {
// errror? -- Zach // errror? -- Zach
return; return;
// } else if (mb_strlen($status) > 140) {
} else { } else {
$status_shortened = common_shorten_links($status); $status_shortened = common_shorten_links($status);
@ -354,7 +359,10 @@ class TwitapistatusesAction extends TwitterapiAction {
if (!$before_id) { if (!$before_id) {
$before_id = 0; $before_id = 0;
} }
$notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id);
$since = strtotime($this->arg('since'));
$notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since);
$notices = array(); $notices = array();
while ($notice->fetch()) { while ($notice->fetch()) {
@ -487,6 +495,14 @@ class TwitapistatusesAction extends TwitterapiAction {
$sub = new Subscription(); $sub = new Subscription();
$sub->$user_attr = $profile->id; $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->orderBy('created DESC');
$sub->limit(($page-1)*100, 100); $sub->limit(($page-1)*100, 100);

View File

@ -293,22 +293,22 @@ class Notice extends Memcached_DataObject
# XXX: too many args; we need to move to named params or even a separate # XXX: too many args; we need to move to named params or even a separate
# class for notice streams # 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')) { if (common_config('memcached', 'enabled')) {
# Skip the cache if this is a since_id or before_id qry # Skip the cache if this is a since, since_id or before_id qry
if ($since_id > 0 || $before_id > 0) { if ($since_id > 0 || $before_id > 0 || $since) {
return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order); return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
} else { } else {
return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order); 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; $needAnd = FALSE;
$needWhere = TRUE; $needWhere = TRUE;
@ -342,6 +342,18 @@ class Notice extends Memcached_DataObject
$qry .= ' notice.id < ' . $before_id; $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 # Allow ORDER override
if ($order) { if ($order) {
@ -465,7 +477,7 @@ class Notice extends Memcached_DataObject
return $wrapper; 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(); $parts = array();
@ -484,7 +496,7 @@ class Notice extends Memcached_DataObject
return Notice::getStream($qry, return Notice::getStream($qry,
'public', 'public',
$offset, $limit, $since_id, $before_id); $offset, $limit, $since_id, $before_id, NULL, $since);
} }
function addToInboxes() { function addToInboxes() {

View File

@ -344,7 +344,7 @@ class User extends Memcached_DataObject
return $user; 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 = $qry =
'SELECT notice.* ' . 'SELECT notice.* ' .
'FROM notice JOIN reply ON notice.id = reply.notice_id ' . '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), return Notice::getStream(sprintf($qry, $this->id),
'user:replies:'.$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 = $qry =
'SELECT * ' . 'SELECT * ' .
'FROM notice ' . 'FROM notice ' .
@ -377,7 +377,7 @@ class User extends Memcached_DataObject
$offset, $limit); $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'); $enabled = common_config('inboxes', 'enabled');
# Complicated code, depending on whether we support inboxes yet # 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), return Notice::getStream(sprintf($qry, $this->id),
'user:notices_with_friends:' . $this->id, 'user:notices_with_friends:' . $this->id,
$offset, $limit, $since_id, $before_id, $offset, $limit, $since_id, $before_id,
$order); $order, $since);
} }
function blowFavesCache() { function blowFavesCache() {