trac540 - Add 'since' param to Twitter-compatible API calls
darcs-hash:20081209055345-7b5ce-e48fd4c87963b8ae15859fd03d2f1f86a16f3a2b.gz
This commit is contained in:
parent
8445796908
commit
92ea88fd60
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
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);
|
||||
$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);
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user