]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - actions/apitimelinefavorites.php
Do mention lookup for Webfinger accounts in OStatusPlugin
[quix0rs-gnu-social.git] / actions / apitimelinefavorites.php
1 <?php
2 /**
3  * StatusNet, the distributed open-source microblogging tool
4  *
5  * Show a user's favorite 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  API
23  * @package   StatusNet
24  * @author    Craig Andrews <candrews@integralblue.com>
25  * @author    Evan Prodromou <evan@status.net>
26  * @author    Zach Copley <zach@status.net> * @copyright 2009 StatusNet, Inc.
27  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
28  * @link      http://status.net/
29  */
30
31 if (!defined('STATUSNET')) {
32     exit(1);
33 }
34
35 require_once INSTALLDIR.'/lib/apibareauth.php';
36
37 /**
38  * Returns the 20 most recent favorite notices for the authenticating user or user
39  * specified by the ID parameter in the requested format.
40  *
41  * @category API
42  * @package  StatusNet
43  * @author   Craig Andrews <candrews@integralblue.com>
44  * @author   Evan Prodromou <evan@status.net>
45  * @author   Zach Copley <zach@status.net>
46  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
47  * @link     http://status.net/
48  */
49
50 class ApiTimelineFavoritesAction extends ApiBareAuthAction
51 {
52     var $notices  = null;
53
54     /**
55      * Take arguments for running
56      *
57      * @param array $args $_REQUEST args
58      *
59      * @return boolean success flag
60      *
61      */
62
63     function prepare($args)
64     {
65         parent::prepare($args);
66
67         $this->user = $this->getTargetUser($this->arg('id'));
68
69         if (empty($this->user)) {
70             $this->clientError(_('No such user.'), 404, $this->format);
71             return;
72         }
73
74         $this->notices = $this->getNotices();
75
76         return true;
77     }
78
79     /**
80      * Handle the request
81      *
82      * Just show the notices
83      *
84      * @param array $args $_REQUEST data (unused)
85      *
86      * @return void
87      */
88
89     function handle($args)
90     {
91         parent::handle($args);
92         $this->showTimeline();
93     }
94
95     /**
96      * Show the timeline of notices
97      *
98      * @return void
99      */
100
101     function showTimeline()
102     {
103         $profile  = $this->user->getProfile();
104         $avatar   = $profile->getAvatar(AVATAR_PROFILE_SIZE);
105
106         $sitename = common_config('site', 'name');
107         $title    = sprintf(
108             _('%1$s / Favorites from %2$s'),
109             $sitename,
110             $this->user->nickname
111         );
112
113         $taguribase = TagURI::base();
114         $id         = "tag:$taguribase:Favorites:" . $this->user->id;
115
116         $subtitle = sprintf(
117             _('%1$s updates favorited by %2$s / %2$s.'),
118             $sitename,
119             $profile->getBestName(),
120             $this->user->nickname
121         );
122         $logo = !empty($avatar)
123             ? $avatar->displayUrl()
124             : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
125
126         switch($this->format) {
127         case 'xml':
128             $this->showXmlTimeline($this->notices);
129             break;
130         case 'rss':
131             $link = common_local_url(
132                 'showfavorites',
133                 array('nickname' => $this->user->nickname)
134             );
135             $this->showRssTimeline(
136                 $this->notices,
137                 $title,
138                 $link,
139                 $subtitle,
140                 null,
141                 $logo
142             );
143             break;
144         case 'atom':
145
146             header('Content-Type: application/atom+xml; charset=utf-8');
147
148             $atom = new AtomNoticeFeed();
149
150             $atom->setId($id);
151             $atom->setTitle($title);
152             $atom->setSubtitle($subtitle);
153             $atom->setLogo($logo);
154             $atom->setUpdated('now');
155
156             $atom->addLink(
157                 common_local_url(
158                     'showfavorites',
159                     array('nickname' => $this->user->nickname)
160                 )
161             );
162
163             $id = $this->arg('id');
164             $aargs = array('format' => 'atom');
165             if (!empty($id)) {
166                 $aargs['id'] = $id;
167             }
168
169             $atom->addLink(
170                 $this->getSelfUri('ApiTimelineFavorites', $aargs),
171                 array('rel' => 'self', 'type' => 'application/atom+xml')
172             );
173
174             $atom->addEntryFromNotices($this->notices);
175
176             $this->raw($atom->getString());
177
178             break;
179         case 'json':
180             $this->showJsonTimeline($this->notices);
181             break;
182         default:
183             $this->clientError(_('API method not found.'), $code = 404);
184             break;
185         }
186     }
187
188     /**
189      * Get notices
190      *
191      * @return array notices
192      */
193
194     function getNotices()
195     {
196         $notices = array();
197
198         if (!empty($this->auth_user) && $this->auth_user->id == $this->user->id) {
199             $notice = $this->user->favoriteNotices(
200                 ($this->page-1) * $this->count,
201                 $this->count,
202                 true
203             );
204         } else {
205             $notice = $this->user->favoriteNotices(
206                 ($this->page-1) * $this->count,
207                 $this->count,
208                 false
209             );
210         }
211
212         while ($notice->fetch()) {
213             $notices[] = clone($notice);
214         }
215
216         return $notices;
217     }
218
219     /**
220      * Is this action read only?
221      *
222      * @param array $args other arguments
223      *
224      * @return boolean true
225      */
226
227     function isReadOnly($args)
228     {
229         return true;
230     }
231
232     /**
233      * When was this feed last modified?
234      *
235      * @return string datestamp of the latest notice in the stream
236      */
237
238     function lastModified()
239     {
240         if (!empty($this->notices) && (count($this->notices) > 0)) {
241             return strtotime($this->notices[0]->created);
242         }
243
244         return null;
245     }
246
247     /**
248      * An entity tag for this stream
249      *
250      * Returns an Etag based on the action name, language, user ID, and
251      * timestamps of the first and last notice in the timeline
252      *
253      * @return string etag
254      */
255
256     function etag()
257     {
258         if (!empty($this->notices) && (count($this->notices) > 0)) {
259
260             $last = count($this->notices) - 1;
261
262             return '"' . implode(
263                 ':',
264                 array($this->arg('action'),
265                       common_language(),
266                       $this->user->id,
267                       strtotime($this->notices[0]->created),
268                       strtotime($this->notices[$last]->created))
269             )
270             . '"';
271         }
272
273         return null;
274     }
275
276 }