<?php
/**
- * Laconica, the distributed open-source microblogging tool
+ * StatusNet, the distributed open-source microblogging tool
*
* Action for showing Twitter-like Atom search results
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Search
- * @package Laconica
- * @author Zach Copley <zach@controlyourself.ca>
- * @copyright 2008-2009 Control Yourself, Inc.
+ * @package StatusNet
+ * @author Zach Copley <zach@status.net>
+ * @copyright 2008-2009 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link http://laconi.ca/
+ * @link http://status.net/
*/
-if (!defined('LACONICA')) {
+if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
-require_once INSTALLDIR.'/lib/twitterapi.php';
+require_once INSTALLDIR.'/lib/api.php';
/**
* Action for outputting search results in Twitter compatible Atom
* RSS10Action.
*
* @category Search
- * @package Laconica
- * @author Zach Copley <zach@controlyourself.ca>
+ * @package StatusNet
+ * @author Zach Copley <zach@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link http://laconi.ca/
+ * @link http://status.net/
*
- * @see TwitterapiAction
+ * @see ApiAction
*/
-class TwitapisearchatomAction extends TwitterapiAction
+class TwitapisearchatomAction extends ApiAction
{
- var $notices;
var $cnt;
var $query;
var $lang;
* @see Action::__construct
*/
- function __construct($output='php://output', $indent=true)
+ function __construct($output='php://output', $indent=null)
{
parent::__construct($output, $indent);
}
{
// TODO: Support search operators like from: and to:, boolean, etc.
+ $notices = array();
$notice = new Notice();
// lcase it for comparison
$q = strtolower($this->query);
- $search_engine = $notice->getSearchEngine('identica_notices');
+ $search_engine = $notice->getSearchEngine('notice');
$search_engine->set_sort_mode('chron');
$search_engine->limit(($this->page - 1) * $this->rpp,
$this->rpp + 1, true);
- $search_engine->query($q);
- $this->cnt = $notice->find();
+ if (false === $search_engine->query($q)) {
+ $this->cnt = 0;
+ } else {
+ $this->cnt = $notice->find();
+ }
$cnt = 0;
+ $this->max_id = 0;
- while ($notice->fetch()) {
+ if ($this->cnt > 0) {
+ while ($notice->fetch()) {
- ++$cnt;
+ ++$cnt;
- if (!$this->max_id) {
- $this->max_id = $notice->id;
- }
+ if (!$this->max_id) {
+ $this->max_id = $notice->id;
+ }
- if ($cnt > $this->rpp) {
- break;
- }
+ if ($cnt > $this->rpp) {
+ break;
+ }
- $notices[] = clone($notice);
+ $notices[] = clone($notice);
+ }
}
return $notices;
$this->showFeed();
foreach ($notices as $n) {
- $this->showEntry($n);
+
+ $profile = $n->getProfile();
+
+ // Don't show notices from deleted users
+
+ if (!empty($profile)) {
+ $this->showEntry($n);
+ }
}
$this->endAtom();
{
// TODO: A9 OpenSearch stuff like search.twitter.com?
- $lang = common_config('site', 'language');
$server = common_config('site', 'server');
$sitename = common_config('site', 'name');
- // XXX: Use xmlns:laconica instead?
+ // XXX: Use xmlns:statusnet instead?
$this->elementStart('feed',
array('xmlns' => 'http://www.w3.org/2005/Atom',
+
+ // XXX: xmlns:twitter causes Atom validation to fail
+ // It's used for the source attr on notices
+
'xmlns:twitter' => 'http://api.twitter.com/',
- 'xml:lang' => $lang));
+ 'xml:lang' => 'en-US')); // XXX Other locales ?
- $year = date('Y');
- $this->element('id', null, "tag:$server,$year:search/$server");
+ $taguribase = common_config('integration', 'taguri');
+ $this->element('id', null, "tag:$taguribase:search/$server");
$site_uri = common_path(false);
// self link
- $self_uri = $search_uri . '&page=' . $this->page;
+ $self_uri = $search_uri;
+ $self_uri .= ($this->page > 1) ? '&page=' . $this->page : '';
$this->element('link', array('type' => 'application/atom+xml',
'rel' => 'self',
'href' => $self_uri));
$this->element('title', null, "$this->query - $sitename Search");
+ $this->element('updated', null, common_date_iso8601('now'));
+
+ // XXX: The below "rel" links are not valid Atom, but it's what
+ // Twitter does...
// refresh link
$this->elementStart('entry');
- $year = date('Y', strtotime($notice->created));
+ $taguribase = common_config('integration', 'taguri');
- $this->element('id', null, "tag:$server,$year:$notice->id");
+ $this->element('id', null, "tag:$taguribase:$notice->id");
$this->element('published', null, common_date_w3dtf($notice->created));
$this->element('link', array('type' => 'text/html',
'rel' => 'alternate',
'href' => $nurl));
$this->element('title', null, common_xml_safe_str(trim($notice->content)));
- $this->element('content', array('type' => 'text/html'), $notice->rendered);
+ $this->element('content', array('type' => 'html'), $notice->rendered);
$this->element('updated', null, common_date_w3dtf($notice->created));
$this->element('link', array('type' => 'image/png',
- 'rel' => 'image',
+ // XXX: Twitter uses rel="image" (not valid)
+ 'rel' => 'related',
'href' => $profile->avatarUrl()));
// TODO: Here is where we'd put in a link to an atom feed for threads
$this->element("twitter:source", null,
- htmlentities($this->source_link($notice->source)));
+ htmlentities($this->sourceLink($notice->source)));
$this->elementStart('author');