]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Add support for since_id and before_id to Twitter API. Ticket #540.
authormac65 <mac65@mac65.com>
Wed, 1 Oct 2008 00:12:33 +0000 (20:12 -0400)
committermac65 <mac65@mac65.com>
Wed, 1 Oct 2008 00:12:33 +0000 (20:12 -0400)
darcs-hash:20081001001233-e558a-3fcc269985050021ec9b44c052206c731cc4689d.gz

actions/twitapistatuses.php
classes/Notice.php
classes/User.php

index 4f2139bc59fce5bd33774343e0fe0730b8c0293d..3271f1e2898ae56cfc4389835f594eec2845b08a 100644 (file)
@@ -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()) {
index 7566136ce80ec62756192ce76c07f61a1c279351..cb153a2e5f227e6e59e7934dcad1ef41e8c4820d 100644 (file)
@@ -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,
index 2d689fd2b9743316280c2b7165a8c6f9aafc4fe1..ce7632ec5bfe655c5eaba5032b874af24d45ebd1 100644 (file)
@@ -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);