]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - lib/jsonsearchresultslist.php
change Laconica and Control Yourself to StatusNet in PHP files
[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@controlyourself.ca>
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://laconi.ca/
28  */
29
30 if (!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@controlyourself.ca>
40  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
41  * @link     http://laconi.ca/
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             $item = new ResultItem($this->notice);
109             array_push($this->results, $item);
110         }
111
112         $time_end           = microtime(true);
113         $this->completed_in = $time_end - $time_start;
114
115         // Set other attrs
116
117         $this->refresh_url = '?since_id=' . $this->max_id .
118             '&q=' . $this->query;
119
120         // pagination stuff
121
122         if ($cnt > $this->rpp) {
123             $this->next_page = '?page=' . ($this->page + 1) .
124                 '&max_id=' . $this->max_id;
125             if ($this->rpp != 15) {
126                 $this->next_page .= '&rpp=' . $this->rpp;
127             }
128             $this->next_page .= '&q=' . $this->query;
129         }
130
131         if ($this->page > 1) {
132             $this->previous_page = '?page=' . ($this->page - 1) .
133                 '&max_id=' . $this->max_id;
134             if ($this->rpp != 15) {
135                 $this->previous_page .= '&rpp=' . $this->rpp;
136             }
137             $this->previous_page .= '&q=' . $this->query;
138         }
139
140         print json_encode($this);
141
142         return $cnt;
143     }
144 }
145
146 /**
147  * widget for displaying a single JSON search result
148  *
149  * @category UI
150  * @package  StatusNet
151  * @author   Zach Copley <zach@controlyourself.ca>
152  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
153  * @link     http://laconi.ca/
154  * @see      JSONSearchResultsList
155  */
156
157 class ResultItem
158 {
159     /** The notice this item is based on. */
160
161     protected $notice;  // protected attrs invisible to json_encode()
162
163     /** The profile associated with the notice. */
164
165     protected $profile;
166
167     // The below attributes are carefully named so the JSON output from
168     // this obj matches the output from search.twitter.com
169
170     var $text;
171     var $to_user_id;
172     var $to_user;
173     var $from_user;
174     var $id;
175     var $from_user_id;
176     var $iso_language_code;
177     var $source;
178     var $profile_image_url;
179     var $created_at;
180
181     /**
182      * constructor
183      *
184      * Also initializes the profile attribute.
185      *
186      * @param Notice $notice The notice we'll display
187      */
188
189     function __construct($notice)
190     {
191         $this->notice  = $notice;
192         $this->profile = $notice->getProfile();
193         $this->buildResult();
194     }
195
196     /**
197      * Build a search result object
198      *
199      * This populates the the result in preparation for JSON encoding.
200      *
201      * @return void
202      */
203
204     function buildResult()
205     {
206         $this->text      = $this->notice->content;
207         $replier_profile = null;
208
209         if ($this->notice->reply_to) {
210             $reply = Notice::staticGet(intval($this->notice->reply_to));
211             if ($reply) {
212                 $replier_profile = $reply->getProfile();
213             }
214         }
215
216         $this->to_user_id = ($replier_profile) ?
217             intval($replier_profile->id) : null;
218         $this->to_user    = ($replier_profile) ?
219             $replier_profile->nickname : null;
220
221         $this->from_user    = $this->profile->nickname;
222         $this->id           = $this->notice->id;
223         $this->from_user_id = $this->profile->id;
224
225         $user = User::staticGet('id', $this->profile->id);
226
227         $this->iso_language_code = $user->language;
228
229         $this->source = $this->getSourceLink($this->notice->source);
230
231         $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
232
233         $this->profile_image_url = ($avatar) ?
234             $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
235
236         $this->created_at = common_date_rfc2822($this->notice->created);
237     }
238
239     /**
240      * Show the source of the notice
241      *
242      * Either the name (and link) of the API client that posted the notice,
243      * or one of other other channels.
244      *
245      * @param string $source the source of the Notice
246      *
247      * @return string a fully rendered source of the Notice
248      */
249
250     function getSourceLink($source)
251     {
252         $source_name = _($source);
253         switch ($source) {
254         case 'web':
255         case 'xmpp':
256         case 'mail':
257         case 'omb':
258         case 'api':
259             break;
260         default:
261             $ns = Notice_source::staticGet($source);
262             if ($ns) {
263                 $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
264             }
265             break;
266         }
267
268         return $source_name;
269     }
270
271 }