2008-07-14 17:09:49 +09:00
|
|
|
<?php
|
|
|
|
/*
|
|
|
|
* Laconica - a distributed open-source microblogging tool
|
|
|
|
* Copyright (C) 2008, Controlez-Vous, Inc.
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
* 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/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (!defined('LACONICA')) { exit(1); }
|
|
|
|
|
2008-07-15 12:18:12 +09:00
|
|
|
require_once(INSTALLDIR.'/lib/twitterapi.php');
|
|
|
|
|
2008-07-15 13:31:21 +09:00
|
|
|
class TwitapistatusesAction extends TwitterapiAction {
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-15 04:03:00 +09:00
|
|
|
function public_timeline($args, $apidata) {
|
|
|
|
parent::handle($args);
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 06:05:19 +09:00
|
|
|
$sitename = common_config('site', 'name');
|
2008-07-29 17:06:41 +09:00
|
|
|
$siteserver = common_config('site', 'server');
|
2008-07-18 06:05:19 +09:00
|
|
|
$title = sprintf(_("%s public timeline"), $sitename);
|
|
|
|
$id = "tag:$siteserver:Statuses";
|
|
|
|
$link = common_root_url();
|
2008-07-25 08:46:01 +09:00
|
|
|
$subtitle = sprintf(_("%s updates from everyone!"), $sitename);
|
2008-07-18 06:05:19 +09:00
|
|
|
|
2008-07-17 07:02:23 +09:00
|
|
|
// Number of public statuses to return by default -- Twitter sends 20
|
|
|
|
$MAX_PUBSTATUSES = 20;
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
2008-10-01 09:12:33 +09:00
|
|
|
$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);
|
2008-10-01 04:44:35 +09:00
|
|
|
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 21:01:19 +09:00
|
|
|
if ($notice) {
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-17 07:02:23 +09:00
|
|
|
switch($apidata['content-type']) {
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'xml':
|
2008-07-18 06:05:19 +09:00
|
|
|
$this->show_xml_timeline($notice);
|
2008-07-17 07:02:23 +09:00
|
|
|
break;
|
|
|
|
case 'rss':
|
2008-09-26 10:20:15 +09:00
|
|
|
$this->show_rss_timeline($notice, $title, $link, $subtitle);
|
2008-07-17 07:02:23 +09:00
|
|
|
break;
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'atom':
|
2008-07-18 06:05:19 +09:00
|
|
|
$this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
|
2008-07-17 07:02:23 +09:00
|
|
|
break;
|
|
|
|
case 'json':
|
2008-07-18 06:05:19 +09:00
|
|
|
$this->show_json_timeline($notice);
|
2008-07-17 07:02:23 +09:00
|
|
|
break;
|
|
|
|
default:
|
2008-08-19 09:29:03 +09:00
|
|
|
common_user_error(_('API method not found!'), $code = 404);
|
2008-07-17 07:02:23 +09:00
|
|
|
break;
|
2008-07-16 16:21:24 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-17 07:02:23 +09:00
|
|
|
} else {
|
2008-08-19 09:29:03 +09:00
|
|
|
common_server_error(_('Couldn\'t find any statuses.'), $code = 503);
|
2008-07-17 07:02:23 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2008-07-15 04:03:00 +09:00
|
|
|
function friends_timeline($args, $apidata) {
|
2008-07-14 17:09:49 +09:00
|
|
|
parent::handle($args);
|
|
|
|
|
2008-07-15 04:03:00 +09:00
|
|
|
$since = $this->arg('since');
|
|
|
|
$since_id = $this->arg('since_id');
|
|
|
|
$count = $this->arg('count');
|
2008-10-01 09:12:33 +09:00
|
|
|
$page = $this->arg('page');
|
|
|
|
$before_id = $this->arg('before_id');
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-10-01 09:12:33 +09:00
|
|
|
if (!$page) {
|
|
|
|
$page = 1;
|
|
|
|
}
|
2008-07-18 06:05:19 +09:00
|
|
|
|
|
|
|
if (!$count) {
|
|
|
|
$count = 20;
|
|
|
|
}
|
2008-07-15 04:03:00 +09:00
|
|
|
|
2008-10-01 09:12:33 +09:00
|
|
|
if (!$since_id) {
|
|
|
|
$since_id = 0;
|
|
|
|
}
|
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
// NOTE: before_id is an extension to Twitter API -- TB
|
2008-10-01 09:12:33 +09:00
|
|
|
if (!$before_id) {
|
|
|
|
$before_id = 0;
|
|
|
|
}
|
|
|
|
|
2008-07-18 06:19:42 +09:00
|
|
|
$user = $this->get_user($id, $apidata);
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->auth_user = $user;
|
|
|
|
|
2008-07-18 06:05:19 +09:00
|
|
|
$profile = $user->getProfile();
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 06:05:19 +09:00
|
|
|
$sitename = common_config('site', 'name');
|
2008-07-29 17:06:41 +09:00
|
|
|
$siteserver = common_config('site', 'server');
|
|
|
|
|
2008-07-18 06:05:19 +09:00
|
|
|
$title = sprintf(_("%s and friends"), $user->nickname);
|
2008-10-17 11:36:38 +09:00
|
|
|
$id = "tag:$siteserver:friends:" . $user->id;
|
2008-07-18 06:05:19 +09:00
|
|
|
$link = common_local_url('all', array('nickname' => $user->nickname));
|
2008-07-29 17:06:41 +09:00
|
|
|
$subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename);
|
2008-07-18 06:05:19 +09:00
|
|
|
|
2008-10-01 09:12:33 +09:00
|
|
|
$notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id);
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 06:05:19 +09:00
|
|
|
switch($apidata['content-type']) {
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'xml':
|
2008-07-18 06:05:19 +09:00
|
|
|
$this->show_xml_timeline($notice);
|
|
|
|
break;
|
|
|
|
case 'rss':
|
2008-10-26 23:57:49 +09:00
|
|
|
$this->show_rss_timeline($notice, $title, $link, $subtitle);
|
2008-07-18 06:05:19 +09:00
|
|
|
break;
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'atom':
|
2008-07-18 06:05:19 +09:00
|
|
|
$this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
|
|
|
|
break;
|
|
|
|
case 'json':
|
|
|
|
$this->show_json_timeline($notice);
|
|
|
|
break;
|
|
|
|
default:
|
2008-08-19 09:29:03 +09:00
|
|
|
common_user_error(_('API method not found!'), $code = 404);
|
2008-07-18 06:05:19 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|
2008-07-18 06:05:19 +09:00
|
|
|
|
2008-07-15 04:03:00 +09:00
|
|
|
function user_timeline($args, $apidata) {
|
|
|
|
parent::handle($args);
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->auth_user = $apidata['user'];
|
|
|
|
$user = $this->get_user($apidata['api_arg'], $apidata);
|
2008-07-18 09:21:31 +09:00
|
|
|
|
|
|
|
if (!$user) {
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->client_error('Not Found', 404, $apidata['content-type']);
|
|
|
|
return;
|
2008-07-18 09:21:31 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
$profile = $user->getProfile();
|
|
|
|
|
|
|
|
if (!$profile) {
|
|
|
|
common_server_error(_('User has no profile.'));
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-07-18 09:21:31 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-15 04:03:00 +09:00
|
|
|
$count = $this->arg('count');
|
|
|
|
$since = $this->arg('since');
|
2008-10-01 09:12:33 +09:00
|
|
|
$since_id = $this->arg('since_id');
|
2008-09-23 06:33:14 +09:00
|
|
|
$page = $this->arg('page');
|
2008-10-01 09:12:33 +09:00
|
|
|
$before_id = $this->arg('before_id');
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 06:19:42 +09:00
|
|
|
if (!$page) {
|
|
|
|
$page = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$count) {
|
|
|
|
$count = 20;
|
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-10-01 09:12:33 +09:00
|
|
|
if (!$since_id) {
|
|
|
|
$since_id = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// NOTE: before_id is an extensions to Twitter API -- TB
|
|
|
|
if (!$before_id) {
|
|
|
|
$before_id = 0;
|
|
|
|
}
|
|
|
|
|
2008-07-18 06:19:42 +09:00
|
|
|
$sitename = common_config('site', 'name');
|
2008-07-29 17:06:41 +09:00
|
|
|
$siteserver = common_config('site', 'server');
|
|
|
|
|
2008-07-18 06:19:42 +09:00
|
|
|
$title = sprintf(_("%s timeline"), $user->nickname);
|
|
|
|
$id = "tag:$siteserver:user:".$user->id;
|
|
|
|
$link = common_local_url('showstream', array('nickname' => $user->nickname));
|
2008-07-29 17:06:41 +09:00
|
|
|
$subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
|
2008-07-18 06:19:42 +09:00
|
|
|
|
2008-10-26 23:53:26 +09:00
|
|
|
# FriendFeed's SUP protocol
|
|
|
|
# Also added RSS and Atom feeds
|
2008-11-04 06:16:53 +09:00
|
|
|
|
2008-10-26 23:53:26 +09:00
|
|
|
$suplink = common_local_url('sup', NULL, $user->id);
|
|
|
|
header('X-SUP-ID: '.$suplink);
|
2008-11-04 06:16:53 +09:00
|
|
|
|
2008-07-18 06:19:42 +09:00
|
|
|
# XXX: since
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-10-01 09:12:33 +09:00
|
|
|
$notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id);
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 06:19:42 +09:00
|
|
|
switch($apidata['content-type']) {
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'xml':
|
2008-07-18 06:19:42 +09:00
|
|
|
$this->show_xml_timeline($notice);
|
|
|
|
break;
|
|
|
|
case 'rss':
|
2008-10-26 23:57:49 +09:00
|
|
|
$this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink);
|
2008-07-18 06:19:42 +09:00
|
|
|
break;
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'atom':
|
2008-10-26 23:53:26 +09:00
|
|
|
$this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink);
|
2008-07-18 06:19:42 +09:00
|
|
|
break;
|
|
|
|
case 'json':
|
|
|
|
$this->show_json_timeline($notice);
|
|
|
|
break;
|
|
|
|
default:
|
2008-08-19 09:29:03 +09:00
|
|
|
common_user_error(_('API method not found!'), $code = 404);
|
2008-07-18 06:19:42 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-15 04:03:00 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-17 14:44:11 +09:00
|
|
|
function update($args, $apidata) {
|
2008-07-31 09:49:22 +09:00
|
|
|
|
2008-07-17 14:44:11 +09:00
|
|
|
parent::handle($args);
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-10-01 11:09:59 +09:00
|
|
|
if (!in_array($apidata['content-type'], array('xml', 'json'))) {
|
|
|
|
common_user_error(_('API method not found!'), $code = 404);
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-10-01 11:09:59 +09:00
|
|
|
}
|
|
|
|
|
2008-08-20 06:49:23 +09:00
|
|
|
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
|
|
|
|
$this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-08-20 06:49:23 +09:00
|
|
|
}
|
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->auth_user = $apidata['user'];
|
|
|
|
$user = $this->auth_user;
|
2008-08-14 04:33:27 +09:00
|
|
|
$status = $this->trimmed('status');
|
2008-07-31 09:49:22 +09:00
|
|
|
$source = $this->trimmed('source');
|
2008-08-16 03:53:17 +09:00
|
|
|
$in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
|
2008-12-11 02:37:26 +09:00
|
|
|
$reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api');
|
|
|
|
if (!$source || in_array($source, $reserved_sources)) {
|
2008-07-31 09:49:22 +09:00
|
|
|
$source = 'api';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$status) {
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-17 14:44:11 +09:00
|
|
|
// XXX: Note: In this case, Twitter simply returns '200 OK'
|
2008-07-29 17:06:41 +09:00
|
|
|
// No error is given, but the status is not posted to the
|
|
|
|
// user's timeline. Seems bad. Shouldn't we throw an
|
2008-07-17 14:44:11 +09:00
|
|
|
// errror? -- Zach
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-11-14 01:47:41 +09:00
|
|
|
// } else if (mb_strlen($status) > 140) {
|
|
|
|
} else {
|
2008-11-07 05:59:26 +09:00
|
|
|
|
2008-11-29 06:01:14 +09:00
|
|
|
$status_shortened = common_shorten_links($status);
|
2008-11-07 05:59:26 +09:00
|
|
|
|
2008-11-29 06:01:14 +09:00
|
|
|
if (mb_strlen($status_shortened) > 140) {
|
2008-11-07 05:59:26 +09:00
|
|
|
|
|
|
|
// 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
|
|
|
|
$this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
2008-07-17 14:44:11 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-10-05 12:09:15 +09:00
|
|
|
// Check for commands
|
|
|
|
$inter = new CommandInterpreter();
|
2008-11-29 06:01:14 +09:00
|
|
|
$cmd = $inter->handle_command($user, $status_shortened);
|
2008-08-16 03:53:17 +09:00
|
|
|
|
2008-10-05 12:09:15 +09:00
|
|
|
if ($cmd) {
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-10-05 12:09:15 +09:00
|
|
|
if ($this->supported($cmd)) {
|
|
|
|
$cmd->execute(new Channel());
|
|
|
|
}
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-10-05 12:09:15 +09:00
|
|
|
// cmd not supported? Twitter just returns your latest status.
|
|
|
|
// And, it returns your last status whether the cmd was successful
|
|
|
|
// or not!
|
|
|
|
$n = $user->getCurrentNotice();
|
|
|
|
$apidata['api_arg'] = $n->id;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
$reply_to = NULL;
|
|
|
|
|
|
|
|
if ($in_reply_to_status_id) {
|
|
|
|
|
|
|
|
// check whether notice actually exists
|
|
|
|
$reply = Notice::staticGet($in_reply_to_status_id);
|
|
|
|
|
|
|
|
if ($reply) {
|
|
|
|
$reply_to = $in_reply_to_status_id;
|
|
|
|
} else {
|
|
|
|
$this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
|
|
|
|
return;
|
|
|
|
}
|
2008-08-16 03:53:17 +09:00
|
|
|
}
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-11-04 06:16:53 +09:00
|
|
|
$notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'),
|
|
|
|
$source, 1, $reply_to);
|
2008-07-15 04:03:00 +09:00
|
|
|
|
2008-10-05 12:09:15 +09:00
|
|
|
if (is_string($notice)) {
|
|
|
|
$this->server_error($notice);
|
|
|
|
return;
|
|
|
|
}
|
2008-07-30 12:00:12 +09:00
|
|
|
|
2008-10-05 12:09:15 +09:00
|
|
|
common_broadcast_notice($notice);
|
|
|
|
$apidata['api_arg'] = $notice->id;
|
|
|
|
}
|
2008-07-31 09:49:22 +09:00
|
|
|
|
2008-07-17 14:44:11 +09:00
|
|
|
$this->show($args, $apidata);
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
function replies($args, $apidata) {
|
2008-07-20 17:34:28 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
parent::handle($args);
|
2008-07-18 07:28:45 +09:00
|
|
|
|
|
|
|
$since = $this->arg('since');
|
|
|
|
$count = $this->arg('count');
|
|
|
|
$page = $this->arg('page');
|
2008-10-01 09:12:33 +09:00
|
|
|
$since_id = $this->arg('since_id');
|
|
|
|
$before_id = $this->arg('before_id');
|
2008-07-18 07:28:45 +09:00
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->auth_user = $apidata['user'];
|
|
|
|
$user = $this->auth_user;
|
2008-07-18 07:28:45 +09:00
|
|
|
$profile = $user->getProfile();
|
|
|
|
|
|
|
|
$sitename = common_config('site', 'name');
|
2008-07-29 17:06:41 +09:00
|
|
|
$siteserver = common_config('site', 'server');
|
2008-07-18 07:28:45 +09:00
|
|
|
|
2008-07-29 17:06:41 +09:00
|
|
|
$title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname);
|
2008-07-18 07:28:45 +09:00
|
|
|
$id = "tag:$siteserver:replies:".$user->id;
|
|
|
|
$link = common_local_url('replies', array('nickname' => $user->nickname));
|
2008-07-29 17:06:41 +09:00
|
|
|
$subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName());
|
2008-07-18 07:28:45 +09:00
|
|
|
|
|
|
|
if (!$page) {
|
|
|
|
$page = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$count) {
|
|
|
|
$count = 20;
|
|
|
|
}
|
|
|
|
|
2008-10-01 09:12:33 +09:00
|
|
|
if (!$since_id) {
|
|
|
|
$since_id = 0;
|
|
|
|
}
|
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
// NOTE: before_id is an extension to Twitter API -- TB
|
2008-10-01 09:12:33 +09:00
|
|
|
if (!$before_id) {
|
|
|
|
$before_id = 0;
|
|
|
|
}
|
|
|
|
$notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id);
|
2008-07-18 07:28:45 +09:00
|
|
|
$notices = array();
|
2008-07-29 17:06:41 +09:00
|
|
|
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 21:01:19 +09:00
|
|
|
while ($notice->fetch()) {
|
|
|
|
$notices[] = clone($notice);
|
2008-07-18 07:28:45 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
switch($apidata['content-type']) {
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'xml':
|
2008-07-18 07:28:45 +09:00
|
|
|
$this->show_xml_timeline($notices);
|
|
|
|
break;
|
|
|
|
case 'rss':
|
2008-10-26 23:57:49 +09:00
|
|
|
$this->show_rss_timeline($notices, $title, $link, $subtitle);
|
2008-07-18 07:28:45 +09:00
|
|
|
break;
|
2008-07-29 17:06:41 +09:00
|
|
|
case 'atom':
|
2008-07-18 07:28:45 +09:00
|
|
|
$this->show_atom_timeline($notices, $title, $id, $link, $subtitle);
|
|
|
|
break;
|
|
|
|
case 'json':
|
|
|
|
$this->show_json_timeline($notices);
|
|
|
|
break;
|
|
|
|
default:
|
2008-08-19 09:29:03 +09:00
|
|
|
common_user_error(_('API method not found!'), $code = 404);
|
2008-07-18 07:28:45 +09:00
|
|
|
}
|
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|
2008-07-18 07:28:45 +09:00
|
|
|
|
2008-08-19 09:39:31 +09:00
|
|
|
function show($args, $apidata) {
|
|
|
|
parent::handle($args);
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-10-01 11:09:59 +09:00
|
|
|
if (!in_array($apidata['content-type'], array('xml', 'json'))) {
|
|
|
|
common_user_error(_('API method not found!'), $code = 404);
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-10-01 11:09:59 +09:00
|
|
|
}
|
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->auth_user = $apidata['user'];
|
2008-09-26 10:20:15 +09:00
|
|
|
$notice_id = $apidata['api_arg'];
|
2008-08-19 09:39:31 +09:00
|
|
|
$notice = Notice::staticGet($notice_id);
|
|
|
|
|
|
|
|
if ($notice) {
|
2008-09-26 10:20:15 +09:00
|
|
|
if ($apidata['content-type'] == 'xml') {
|
2008-08-19 09:39:31 +09:00
|
|
|
$this->show_single_xml_status($notice);
|
|
|
|
} elseif ($apidata['content-type'] == 'json') {
|
|
|
|
$this->show_single_json_status($notice);
|
|
|
|
}
|
|
|
|
} else {
|
2008-08-20 05:23:18 +09:00
|
|
|
// XXX: Twitter just sets a 404 header and doens't bother to return an err msg
|
|
|
|
$this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']);
|
2008-08-19 09:39:31 +09:00
|
|
|
}
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-08-19 09:39:31 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
function destroy($args, $apidata) {
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
parent::handle($args);
|
2008-08-20 04:46:10 +09:00
|
|
|
|
2008-10-01 11:09:59 +09:00
|
|
|
if (!in_array($apidata['content-type'], array('xml', 'json'))) {
|
|
|
|
common_user_error(_('API method not found!'), $code = 404);
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-10-01 11:09:59 +09:00
|
|
|
}
|
|
|
|
|
2008-09-26 10:20:15 +09:00
|
|
|
// Check for RESTfulness
|
2008-08-20 04:46:10 +09:00
|
|
|
if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
|
|
|
|
// XXX: Twitter just prints the err msg, no XML / JSON.
|
|
|
|
$this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-09-26 10:20:15 +09:00
|
|
|
}
|
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->auth_user = $apidata['user'];
|
|
|
|
$user = $this->auth_user;
|
2008-09-26 10:20:15 +09:00
|
|
|
$notice_id = $apidata['api_arg'];
|
2008-08-20 04:46:10 +09:00
|
|
|
$notice = Notice::staticGet($notice_id);
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-08-20 04:46:10 +09:00
|
|
|
if (!$notice) {
|
|
|
|
$this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
|
2008-10-01 11:54:21 +09:00
|
|
|
return;
|
2008-08-20 04:46:10 +09:00
|
|
|
}
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-08-20 04:46:10 +09:00
|
|
|
if ($user->id == $notice->profile_id) {
|
|
|
|
$replies = new Reply;
|
|
|
|
$replies->get('notice_id', $notice_id);
|
|
|
|
common_dequeue_notice($notice);
|
|
|
|
$replies->delete();
|
|
|
|
$notice->delete();
|
2008-09-26 10:20:15 +09:00
|
|
|
|
|
|
|
if ($apidata['content-type'] == 'xml') {
|
2008-08-20 04:46:10 +09:00
|
|
|
$this->show_single_xml_status($notice);
|
|
|
|
} elseif ($apidata['content-type'] == 'json') {
|
|
|
|
$this->show_single_json_status($notice);
|
2008-09-26 10:20:15 +09:00
|
|
|
}
|
2008-08-20 04:46:10 +09:00
|
|
|
} else {
|
|
|
|
$this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']);
|
|
|
|
}
|
2008-09-26 10:20:15 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
function friends($args, $apidata) {
|
|
|
|
parent::handle($args);
|
2008-07-18 14:13:18 +09:00
|
|
|
return $this->subscriptions($apidata, 'subscribed', 'subscriber');
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
function followers($args, $apidata) {
|
|
|
|
parent::handle($args);
|
2008-07-18 14:08:45 +09:00
|
|
|
|
2008-07-18 14:13:18 +09:00
|
|
|
return $this->subscriptions($apidata, 'subscriber', 'subscribed');
|
2008-07-18 14:08:45 +09:00
|
|
|
}
|
2008-07-18 14:13:18 +09:00
|
|
|
|
|
|
|
function subscriptions($apidata, $other_attr, $user_attr) {
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 14:13:18 +09:00
|
|
|
# XXX: lite
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-10-17 11:36:38 +09:00
|
|
|
$this->auth_user = $apidate['user'];
|
|
|
|
$user = $this->get_user($apidata['api_arg'], $apidata);
|
|
|
|
|
|
|
|
if (!$user) {
|
|
|
|
$this->client_error('Not Found', 404, $apidata['content-type']);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-07-18 14:25:57 +09:00
|
|
|
$page = $this->trimmed('page');
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 14:25:57 +09:00
|
|
|
if (!$page || !is_numeric($page)) {
|
|
|
|
$page = 1;
|
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 11:55:54 +09:00
|
|
|
$profile = $user->getProfile();
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 11:55:54 +09:00
|
|
|
if (!$profile) {
|
|
|
|
common_server_error(_('User has no profile.'));
|
|
|
|
return;
|
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 11:55:54 +09:00
|
|
|
$sub = new Subscription();
|
2008-07-18 14:08:45 +09:00
|
|
|
$sub->$user_attr = $profile->id;
|
2008-07-18 11:55:54 +09:00
|
|
|
$sub->orderBy('created DESC');
|
2008-07-18 14:25:57 +09:00
|
|
|
$sub->limit(($page-1)*100, 100);
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 14:08:45 +09:00
|
|
|
$others = array();
|
2008-07-18 11:55:54 +09:00
|
|
|
|
|
|
|
if ($sub->find()) {
|
|
|
|
while ($sub->fetch()) {
|
2008-07-18 14:08:45 +09:00
|
|
|
$others[] = Profile::staticGet($sub->$other_attr);
|
2008-07-18 11:55:54 +09:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// user has no followers
|
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 14:08:45 +09:00
|
|
|
$type = $apidata['content-type'];
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-18 14:08:45 +09:00
|
|
|
$this->init_document($type);
|
|
|
|
$this->show_profiles($others, $type);
|
|
|
|
$this->end_document($type);
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|
2008-07-18 11:55:54 +09:00
|
|
|
|
2008-07-18 14:08:45 +09:00
|
|
|
function show_profiles($profiles, $type) {
|
|
|
|
switch ($type) {
|
|
|
|
case 'xml':
|
|
|
|
common_element_start('users', array('type' => 'array'));
|
|
|
|
foreach ($profiles as $profile) {
|
|
|
|
$this->show_profile($profile);
|
|
|
|
}
|
2008-07-18 14:14:04 +09:00
|
|
|
common_element_end('users');
|
2008-07-18 14:08:45 +09:00
|
|
|
break;
|
|
|
|
case 'json':
|
|
|
|
$arrays = array();
|
|
|
|
foreach ($profiles as $profile) {
|
|
|
|
$arrays[] = $this->twitter_user_array($profile, true);
|
|
|
|
}
|
|
|
|
print json_encode($arrays);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$this->client_error(_('unsupported file type'));
|
|
|
|
}
|
|
|
|
}
|
2008-07-29 17:06:41 +09:00
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
function featured($args, $apidata) {
|
|
|
|
parent::handle($args);
|
2008-08-19 09:29:03 +09:00
|
|
|
common_server_error(_('API method under construction.'), $code=501);
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|
2008-07-18 06:19:42 +09:00
|
|
|
|
2008-10-05 12:09:15 +09:00
|
|
|
function supported($cmd) {
|
|
|
|
|
2008-10-06 03:38:50 +09:00
|
|
|
$cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand');
|
2008-10-05 12:09:15 +09:00
|
|
|
|
|
|
|
if (in_array(get_class($cmd), $cmdlist)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2008-07-14 17:09:49 +09:00
|
|
|
}
|