]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - lib/jsonsearchresultslist.php
Merge branch 'diskcache' into 0.9.x
[quix0rs-gnu-social.git] / lib / jsonsearchresultslist.php
1 <?php
2 /**
3  * StatusNet, the distributed open-source microblogging tool
4  *
5  * widget for displaying a list of notices
6  *
7  * PHP version 5
8  *
9  * LICENCE: This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU Affero General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Affero General Public License for more details.
18  *
19  * You should have received a copy of the GNU Affero General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  * @category  Search
23  * @package   StatusNet
24  * @author    Zach Copley <zach@status.net>
25  * @copyright 2009 StatusNet, Inc.
26  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
27  * @link      http://status.net/
28  */
29
30 if (!defined('STATUSNET') && !defined('LACONICA')) {
31     exit(1);
32 }
33
34 /**
35  * widget-like class for showing JSON search results
36  *
37  * @category Search
38  * @package  StatusNet
39  * @author   Zach Copley <zach@status.net>
40  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
41  * @link     http://status.net/
42  *
43  */
44
45 class JSONSearchResultsList
46 {
47     protected $notice;  // protected attrs invisible to json_encode()
48     protected $rpp;
49
50     // The below attributes are carefully named so the JSON output from
51     // this obj matches the output from search.twitter.com
52
53     var $results;
54     var $since_id;
55     var $max_id;
56     var $refresh_url;
57     var $results_per_page;
58     var $completed_in;
59     var $page;
60     var $query;
61
62     /**
63      * constructor
64      *
65      * @param Notice $notice   stream of notices from DB_DataObject
66      * @param string $query    the original search query
67      * @param int    $rpp      the number of results to display per page
68      * @param int    $page     a page offset
69      * @param int    $since_id only display notices newer than this
70      */
71
72     function __construct($notice, $query, $rpp, $page, $since_id = 0)
73     {
74         $this->notice           = $notice;
75         $this->query            = urlencode($query);
76         $this->results_per_page = $rpp;
77         $this->rpp              = $rpp;
78         $this->page             = $page;
79         $this->since_id         = $since_id;
80         $this->results          = array();
81     }
82
83     /**
84      * show the list of search results
85      *
86      * @return int $count of the search results listed.
87      */
88
89     function show()
90     {
91         $cnt = 0;
92         $this->max_id = 0;
93
94         $time_start = microtime(true);
95
96         while ($this->notice->fetch() && $cnt <= $this->rpp) {
97             $cnt++;
98
99             // XXX: Hmmm. this depends on desc sort order
100             if (!$this->max_id) {
101                 $this->max_id = (int)$this->notice->id;
102             }
103
104             if ($cnt > $this->rpp) {
105                 break;
106             }
107
108             $profile = $this->notice->getProfile();
109
110             // Don't show notices from deleted users
111
112             if (!empty($profile)) {
113                 $item = new ResultItem($this->notice);
114                 array_push($this->results, $item);
115             }
116         }
117
118         $time_end           = microtime(true);
119         $this->completed_in = $time_end - $time_start;
120
121         // Set other attrs
122
123         $this->refresh_url = '?since_id=' . $this->max_id .
124             '&q=' . $this->query;
125
126         // pagination stuff
127
128         if ($cnt > $this->rpp) {
129             $this->next_page = '?page=' . ($this->page + 1) .
130                 '&max_id=' . $this->max_id;
131             if ($this->rpp != 15) {
132                 $this->next_page .= '&rpp=' . $this->rpp;
133             }
134             $this->next_page .= '&q=' . $this->query;
135         }
136
137         if ($this->page > 1) {
138             $this->previous_page = '?page=' . ($this->page - 1) .
139                 '&max_id=' . $this->max_id;
140             if ($this->rpp != 15) {
141                 $this->previous_page .= '&rpp=' . $this->rpp;
142             }
143             $this->previous_page .= '&q=' . $this->query;
144         }
145
146         print json_encode($this);
147
148         return $cnt;
149     }
150 }
151
152 /**
153  * widget for displaying a single JSON search result
154  *
155  * @category UI
156  * @package  StatusNet
157  * @author   Zach Copley <zach@status.net>
158  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
159  * @link     http://status.net/
160  * @see      JSONSearchResultsList
161  */
162
163 class ResultItem
164 {
165     /** The notice this item is based on. */
166
167     protected $notice;  // protected attrs invisible to json_encode()
168
169     /** The profile associated with the notice. */
170
171     protected $profile;
172
173     // The below attributes are carefully named so the JSON output from
174     // this obj matches the output from search.twitter.com
175
176     var $text;
177     var $to_user_id;
178     var $to_user;
179     var $from_user;
180     var $id;
181     var $from_user_id;
182     var $iso_language_code;
183     var $source;
184     var $profile_image_url;
185     var $created_at;
186
187     /**
188      * constructor
189      *
190      * Also initializes the profile attribute.
191      *
192      * @param Notice $notice The notice we'll display
193      */
194
195     function __construct($notice)
196     {
197         $this->notice  = $notice;
198         $this->profile = $notice->getProfile();
199         $this->buildResult();
200     }
201
202     /**
203      * Build a search result object
204      *
205      * This populates the the result in preparation for JSON encoding.
206      *
207      * @return void
208      */
209
210     function buildResult()
211     {
212         $this->text      = $this->notice->content;
213         $replier_profile = null;
214
215         if ($this->notice->reply_to) {
216             $reply = Notice::staticGet(intval($this->notice->reply_to));
217             if ($reply) {
218                 $replier_profile = $reply->getProfile();
219             }
220         }
221
222         $this->to_user_id = ($replier_profile) ?
223             intval($replier_profile->id) : null;
224         $this->to_user    = ($replier_profile) ?
225             $replier_profile->nickname : null;
226
227         $this->from_user    = $this->profile->nickname;
228         $this->id           = $this->notice->id;
229         $this->from_user_id = $this->profile->id;
230
231         $user = User::staticGet('id', $this->profile->id);
232
233         $this->iso_language_code = $user->language;
234
235         $this->source = $this->getSourceLink($this->notice->source);
236
237         $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
238
239         $this->profile_image_url = ($avatar) ?
240             $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
241
242         $this->created_at = common_date_rfc2822($this->notice->created);
243     }
244
245     /**
246      * Show the source of the notice
247      *
248      * Either the name (and link) of the API client that posted the notice,
249      * or one of other other channels.
250      *
251      * @param string $source the source of the Notice
252      *
253      * @return string a fully rendered source of the Notice
254      */
255
256     function getSourceLink($source)
257     {
258         $source_name = _($source);
259         switch ($source) {
260         case 'web':
261         case 'xmpp':
262         case 'mail':
263         case 'omb':
264         case 'api':
265             break;
266         default:
267             $ns = Notice_source::staticGet($source);
268             if ($ns) {
269                 $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
270             }
271             break;
272         }
273
274         return $source_name;
275     }
276
277 }