summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormac65 <mac65@mac65.com>2008-09-30 20:12:33 -0400
committermac65 <mac65@mac65.com>2008-09-30 20:12:33 -0400
commitc08a67094cb848e8bcd8f631aa44adf57a33b7ab (patch)
treed82c69fdf283483c455759ac6035d5fafaaef7d1
parent1c4f7722da90e8e8ce0489720ede223804885377 (diff)
Add support for since_id and before_id to Twitter API. Ticket #540.
darcs-hash:20081001001233-e558a-3fcc269985050021ec9b44c052206c731cc4689d.gz
-rw-r--r--actions/twitapistatuses.php64
-rw-r--r--classes/Notice.php28
-rw-r--r--classes/User.php54
3 files changed, 131 insertions, 15 deletions
diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php
index 4f2139bc5..3271f1e28 100644
--- a/actions/twitapistatuses.php
+++ b/actions/twitapistatuses.php
@@ -57,7 +57,22 @@ 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
- $notice = Notice::publicStream(0, $MAX_PUBSTATUSES);
+ $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 ($notice) {
@@ -112,16 +127,26 @@ class TwitapistatusesAction extends TwitterapiAction {
$since = $this->arg('since');
$since_id = $this->arg('since_id');
$count = $this->arg('count');
- $page = $this->arg('page');
+ $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;
+ }
+
+ // NOTE: before_id is an extensions to Twitter API -- TB
+ if (!$before_id) {
+ $before_id = 0;
+ }
+
$user = $this->get_user($id, $apidata);
$profile = $user->getProfile();
@@ -133,7 +158,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);
+ $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id);
switch($apidata['content-type']) {
case 'xml':
@@ -215,8 +240,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');
if (!$page) {
$page = 1;
@@ -226,6 +252,15 @@ class TwitapistatusesAction extends TwitterapiAction {
$count = 20;
}
+ if (!$since_id) {
+ $since_id = 0;
+ }
+
+ // NOTE: before_id is an extensions to Twitter API -- TB
+ if (!$before_id) {
+ $before_id = 0;
+ }
+
$sitename = common_config('site', 'name');
$siteserver = common_config('site', 'server');
@@ -235,9 +270,8 @@ class TwitapistatusesAction extends TwitterapiAction {
$subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
# XXX: since
- # XXX: since_id
- $notice = $user->getNotices((($page-1)*20), $count);
+ $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id);
switch($apidata['content-type']) {
case 'xml':
@@ -354,6 +388,8 @@ class TwitapistatusesAction extends TwitterapiAction {
$count = $this->arg('count');
$page = $this->arg('page');
+ $since_id = $this->arg('since_id');
+ $before_id = $this->arg('before_id');
$user = $apidata['user'];
$profile = $user->getProfile();
@@ -374,7 +410,15 @@ class TwitapistatusesAction extends TwitterapiAction {
$count = 20;
}
- $notice = $user->getReplies((($page-1)*20), $count);
+ if (!$since_id) {
+ $since_id = 0;
+ }
+
+ // NOTE: before_id is an extensions to Twitter API -- TB
+ if (!$before_id) {
+ $before_id = 0;
+ }
+ $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id);
$notices = array();
while ($notice->fetch()) {
diff --git a/classes/Notice.php b/classes/Notice.php
index 7566136ce..cb153a2e5 100644
--- a/classes/Notice.php
+++ b/classes/Notice.php
@@ -308,12 +308,38 @@ class Notice extends Memcached_DataObject
return $wrapper;
}
- function publicStream($offset=0, $limit=20) {
+ function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0) {
+ $needAnd = FALSE;
+ $needWhere = TRUE;
+
$qry = 'SELECT * FROM notice ';
if (common_config('public', 'localonly')) {
$qry .= ' WHERE is_local = 1 ';
+ $needWhere = FALSE;
+ $needAnd = TRUE;
+ }
+
+ // NOTE: since_id and before_id are extensions to Twitter API
+ if ($since_id > 0) {
+ if ($needWhere)
+ $qry .= ' WHERE ';
+ if ($needAnd)
+ $qry .= ' AND ';
+ $qry .= ' notice.id > ' . $since_id . ' ';
+ $needAnd = FALSE;
+ $needWhere = FALSE;
+ }
+
+ if ($before_id > 0) {
+ if ($needWhere)
+ $qry .= ' WHERE ';
+ if ($needAnd)
+ $qry .= ' AND ';
+ $qry .= ' notice.id < ' . $before_id . ' ';
+ $needAnd = FALSE;
+ $needWhere = FALSE;
}
return Notice::getStream($qry,
diff --git a/classes/User.php b/classes/User.php
index 2d689fd2b..ce7632ec5 100644
--- a/classes/User.php
+++ b/classes/User.php
@@ -141,6 +141,19 @@ class User extends Memcached_DataObject
return true;
}
+ function noticesWithFriendsWindow() {
+
+
+ $notice = new Notice();
+
+ $notice->query('SELECT notice.* ' .
+ 'FROM notice JOIN subscription on notice.profile_id = subscription.subscribed ' .
+ 'WHERE subscription.subscriber = ' . $this->id . ' ' .
+ 'ORDER BY created DESC, notice.id DESC ' .
+ 'LIMIT 0, ' . WITHFRIENDS_CACHE_WINDOW);
+
+ }
+
static function register($fields) {
# MAGICALLY put fields into current scope
@@ -291,23 +304,45 @@ class User extends Memcached_DataObject
return $user;
}
- function getReplies($offset=0, $limit=NOTICES_PER_PAGE) {
+ function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
$qry =
'SELECT notice.* ' .
'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
'WHERE reply.profile_id = %d ';
+ if ($since_id > 0) {
+ $qry .= ' AND notice.id > ' . $since_id . ' ';
+ $needAnd = FALSE;
+ }
+
+ // NOTE: before_id is an extension to Twitter API
+ if ($before_id > 0) {
+ $qry .= ' AND notice.id < ' . $before_id . ' ';
+ $needAnd = FALSE;
+ }
+
return Notice::getStream(sprintf($qry, $this->id),
'user:replies:'.$this->id,
$offset, $limit);
}
- function getNotices($offset=0, $limit=NOTICES_PER_PAGE) {
+ function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
$qry =
'SELECT * ' .
'FROM notice ' .
'WHERE profile_id = %d ';
+ if ($since_id > 0) {
+ $qry .= ' AND notice.id > ' . $since_id . ' ';
+ $needAnd = FALSE;
+ }
+
+ // NOTE: before_id is an extension to Twitter API
+ if ($before_id > 0) {
+ $qry .= ' AND notice.id < ' . $before_id . ' ';
+ $needAnd = FALSE;
+ }
+
return Notice::getStream(sprintf($qry, $this->id),
'user:notices:'.$this->id,
$offset, $limit);
@@ -324,12 +359,23 @@ class User extends Memcached_DataObject
$offset, $limit);
}
- function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE) {
+ function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
$qry =
'SELECT notice.* ' .
'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
'WHERE subscription.subscriber = %d ';
-
+
+ if ($since_id > 0) {
+ $qry .= ' AND notice.id > ' . $since_id . ' ';
+ $needAnd = FALSE;
+ }
+
+ // NOTE: before_id is an extension to Twitter API
+ if ($before_id > 0) {
+ $qry .= ' AND notice.id < ' . $before_id . ' ';
+ $needAnd = FALSE;
+ }
+
return Notice::getStream(sprintf($qry, $this->id),
'user:notices_with_friends:' . $this->id,
$offset, $limit);