From: Zach Copley <zach@controlyourself.ca>
Date: Tue, 9 Dec 2008 05:53:45 +0000 (-0500)
Subject: trac540 - Add 'since' param to Twitter-compatible API calls
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=92ea88fd6030b3def92e100291102187be032490;p=quix0rs-gnu-social.git

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

darcs-hash:20081209055345-7b5ce-e48fd4c87963b8ae15859fd03d2f1f86a16f3a2b.gz
---

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 <http://www.gnu.org/licenses/>.
+ * along with this program.	 If not, see <http://www.gnu.org/licenses/>.
  */
 
 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() {