2a4dc77a63
I used this hacky sed-command (run it from your GNU Social root, or change the first grep's path to where it actually lies) to do a rough fix on all ::staticGet calls and rename them to ::getKV sed -i -s -e '/DataObject::staticGet/I!s/::staticGet/::getKV/Ig' $(grep -R ::staticGet `pwd`/* | grep -v -e '^extlib' | grep -v DataObject:: |grep -v "function staticGet"|cut -d: -f1 |sort |uniq) If you're applying this, remember to change the Managed_DataObject and Memcached_DataObject function definitions of staticGet to getKV! This might of course take some getting used to, or modification fo StatusNet plugins, but the result is that all the static calls (to staticGet) are now properly made without breaking PHP Strict Standards. Standards are there to be followed (and they caused some very bad confusion when used with get_called_class) Reasonably any plugin or code that tests for the definition of 'GNUSOCIAL' or similar will take this change into consideration.
286 lines
7.8 KiB
PHP
286 lines
7.8 KiB
PHP
<?php
|
|
/**
|
|
* StatusNet, the distributed open-source microblogging tool
|
|
*
|
|
* widget for displaying a list of notices
|
|
*
|
|
* PHP version 5
|
|
*
|
|
* LICENCE: 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/>.
|
|
*
|
|
* @category Search
|
|
* @package StatusNet
|
|
* @author Zach Copley <zach@status.net>
|
|
* @copyright 2009 StatusNet, Inc.
|
|
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
|
* @link http://status.net/
|
|
*/
|
|
|
|
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|
exit(1);
|
|
}
|
|
|
|
/**
|
|
* widget-like class for showing JSON search results
|
|
*
|
|
* @category Search
|
|
* @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://status.net/
|
|
*
|
|
*/
|
|
|
|
class JSONSearchResultsList
|
|
{
|
|
protected $notice; // protected attrs invisible to json_encode()
|
|
protected $rpp;
|
|
|
|
// The below attributes are carefully named so the JSON output from
|
|
// this obj matches the output from search.twitter.com
|
|
|
|
var $results;
|
|
var $since_id;
|
|
var $max_id;
|
|
var $refresh_url;
|
|
var $results_per_page;
|
|
var $completed_in;
|
|
var $page;
|
|
var $query;
|
|
|
|
/**
|
|
* constructor
|
|
*
|
|
* @param Notice $notice stream of notices from DB_DataObject
|
|
* @param string $query the original search query
|
|
* @param int $rpp the number of results to display per page
|
|
* @param int $page a page offset
|
|
* @param int $since_id only display notices newer than this
|
|
*/
|
|
|
|
function __construct($notice, $query, $rpp, $page, $since_id = 0)
|
|
{
|
|
$this->notice = $notice;
|
|
$this->query = urlencode($query);
|
|
$this->results_per_page = $rpp;
|
|
$this->rpp = $rpp;
|
|
$this->page = $page;
|
|
$this->since_id = $since_id;
|
|
$this->results = array();
|
|
}
|
|
|
|
/**
|
|
* show the list of search results
|
|
*
|
|
* @return int $count of the search results listed.
|
|
*/
|
|
|
|
function show()
|
|
{
|
|
$cnt = 0;
|
|
$this->max_id = 0;
|
|
|
|
$time_start = microtime(true);
|
|
|
|
while ($this->notice->fetch() && $cnt <= $this->rpp) {
|
|
$cnt++;
|
|
|
|
// XXX: Hmmm. this depends on desc sort order
|
|
if (!$this->max_id) {
|
|
$this->max_id = (int)$this->notice->id;
|
|
}
|
|
|
|
if ($this->since_id && $this->notice->id <= $this->since_id) {
|
|
break;
|
|
}
|
|
|
|
if ($cnt > $this->rpp) {
|
|
break;
|
|
}
|
|
|
|
$profile = $this->notice->getProfile();
|
|
|
|
// Don't show notices from deleted users
|
|
|
|
if (!empty($profile)) {
|
|
$item = new ResultItem($this->notice);
|
|
array_push($this->results, $item);
|
|
}
|
|
}
|
|
|
|
$time_end = microtime(true);
|
|
$this->completed_in = $time_end - $time_start;
|
|
|
|
// Set other attrs
|
|
|
|
$this->refresh_url = '?since_id=' . $this->max_id .
|
|
'&q=' . $this->query;
|
|
|
|
// pagination stuff
|
|
|
|
if ($cnt > $this->rpp) {
|
|
$this->next_page = '?page=' . ($this->page + 1) .
|
|
'&max_id=' . $this->max_id;
|
|
if ($this->rpp != 15) {
|
|
$this->next_page .= '&rpp=' . $this->rpp;
|
|
}
|
|
$this->next_page .= '&q=' . $this->query;
|
|
}
|
|
|
|
if ($this->page > 1) {
|
|
$this->previous_page = '?page=' . ($this->page - 1) .
|
|
'&max_id=' . $this->max_id;
|
|
if ($this->rpp != 15) {
|
|
$this->previous_page .= '&rpp=' . $this->rpp;
|
|
}
|
|
$this->previous_page .= '&q=' . $this->query;
|
|
}
|
|
|
|
print json_encode($this);
|
|
|
|
return $cnt;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* widget for displaying a single JSON search result
|
|
*
|
|
* @category UI
|
|
* @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://status.net/
|
|
* @see JSONSearchResultsList
|
|
*/
|
|
|
|
class ResultItem
|
|
{
|
|
/** The notice this item is based on. */
|
|
|
|
protected $notice; // protected attrs invisible to json_encode()
|
|
|
|
/** The profile associated with the notice. */
|
|
|
|
protected $profile;
|
|
|
|
// The below attributes are carefully named so the JSON output from
|
|
// this obj matches the output from search.twitter.com
|
|
|
|
var $text;
|
|
var $to_user_id;
|
|
var $to_user;
|
|
var $from_user;
|
|
var $id;
|
|
var $from_user_id;
|
|
var $iso_language_code;
|
|
var $source;
|
|
var $profile_image_url;
|
|
var $created_at;
|
|
|
|
/**
|
|
* constructor
|
|
*
|
|
* Also initializes the profile attribute.
|
|
*
|
|
* @param Notice $notice The notice we'll display
|
|
*/
|
|
|
|
function __construct($notice)
|
|
{
|
|
$this->notice = $notice;
|
|
$this->profile = $notice->getProfile();
|
|
$this->buildResult();
|
|
}
|
|
|
|
/**
|
|
* Build a search result object
|
|
*
|
|
* This populates the the result in preparation for JSON encoding.
|
|
*
|
|
* @return void
|
|
*/
|
|
|
|
function buildResult()
|
|
{
|
|
$this->text = $this->notice->content;
|
|
$replier_profile = null;
|
|
|
|
if ($this->notice->reply_to) {
|
|
$reply = Notice::getKV(intval($this->notice->reply_to));
|
|
if ($reply) {
|
|
$replier_profile = $reply->getProfile();
|
|
}
|
|
}
|
|
|
|
$this->to_user_id = ($replier_profile) ?
|
|
intval($replier_profile->id) : null;
|
|
$this->to_user = ($replier_profile) ?
|
|
$replier_profile->nickname : null;
|
|
|
|
$this->from_user = $this->profile->nickname;
|
|
$this->id = $this->notice->id;
|
|
$this->from_user_id = $this->profile->id;
|
|
|
|
$user = $this->profile->getUser();
|
|
|
|
if (empty($user)) {
|
|
// Gonna have to do till we can detect it
|
|
$this->iso_language_code = common_config('site', 'language');
|
|
} else {
|
|
$this->iso_language_code = $user->language;
|
|
}
|
|
|
|
$this->source = $this->getSourceLink($this->notice->source);
|
|
|
|
$avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
|
|
|
|
$this->profile_image_url = ($avatar) ?
|
|
$avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
|
|
|
|
$this->created_at = common_date_rfc2822($this->notice->created);
|
|
}
|
|
|
|
/**
|
|
* Show the source of the notice
|
|
*
|
|
* Either the name (and link) of the API client that posted the notice,
|
|
* or one of other other channels.
|
|
*
|
|
* @param string $source the source of the Notice
|
|
*
|
|
* @return string a fully rendered source of the Notice
|
|
*/
|
|
function getSourceLink($source)
|
|
{
|
|
// Gettext translations for the below source types are available.
|
|
$source_name = _($source);
|
|
switch ($source) {
|
|
case 'web':
|
|
case 'xmpp':
|
|
case 'mail':
|
|
case 'omb':
|
|
case 'api':
|
|
break;
|
|
default:
|
|
$ns = Notice_source::getKV($source);
|
|
if ($ns) {
|
|
$source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
|
|
}
|
|
break;
|
|
}
|
|
|
|
return $source_name;
|
|
}
|
|
}
|