2008-05-07 17:48:07 +01:00
< ? php
2009-01-19 16:56:41 +00:00
/**
2009-08-25 23:12:20 +01:00
* StatusNet , the distributed open - source microblogging tool
2008-05-17 20:24:47 +01:00
*
2009-01-19 16:56:41 +00:00
* User profile page
*
* PHP version 5
*
* LICENCE : This program is free software : you can redistribute it and / or modify
2008-05-14 20:26:48 +01:00
* 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 .
2008-05-17 20:24:47 +01:00
*
2008-05-14 20:26:48 +01:00
* 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 .
2008-05-17 20:24:47 +01:00
*
2008-05-14 20:26:48 +01:00
* 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 />.
2009-01-19 16:56:41 +00:00
*
* @ category Personal
2009-08-25 23:12:20 +01:00
* @ package StatusNet
2009-08-25 23:19:04 +01:00
* @ author Evan Prodromou < evan @ status . net >
* @ author Sarven Capadisli < csarven @ status . net >
2009-08-25 23:12:20 +01:00
* @ copyright 2008 - 2009 StatusNet , Inc .
2009-01-19 16:56:41 +00:00
* @ license http :// www . fsf . org / licensing / licenses / agpl - 3.0 . html GNU Affero General Public License version 3.0
2009-08-25 23:16:46 +01:00
* @ link http :// status . net /
2008-05-14 20:26:48 +01:00
*/
2009-08-26 15:41:36 +01:00
if ( ! defined ( 'STATUSNET' ) && ! defined ( 'LACONICA' )) {
2009-01-19 16:56:41 +00:00
exit ( 1 );
}
2008-05-07 17:48:07 +01:00
2009-01-19 16:56:41 +00:00
require_once INSTALLDIR . '/lib/personalgroupnav.php' ;
require_once INSTALLDIR . '/lib/noticelist.php' ;
2009-01-21 18:03:33 +00:00
require_once INSTALLDIR . '/lib/profileminilist.php' ;
2009-01-21 18:33:06 +00:00
require_once INSTALLDIR . '/lib/groupminilist.php' ;
2009-01-19 16:56:41 +00:00
require_once INSTALLDIR . '/lib/feedlist.php' ;
2008-05-17 20:10:34 +01:00
2009-01-19 16:56:41 +00:00
/**
* User profile page
*
* When I created this page , " show stream " seemed like the best name for it .
* Now , it seems like a really bad name .
*
* It shows a stream of the user ' s posts , plus lots of profile info , links
* to subscriptions and stuff , etc .
*
* @ category Personal
2009-08-25 23:12:20 +01:00
* @ package StatusNet
2009-08-25 23:19:04 +01:00
* @ author Evan Prodromou < evan @ status . net >
2009-01-19 16:56:41 +00:00
* @ license http :// www . fsf . org / licensing / licenses / agpl - 3.0 . html GNU Affero General Public License version 3.0
2009-08-25 23:16:46 +01:00
* @ link http :// status . net /
2009-01-19 16:56:41 +00:00
*/
2009-04-07 22:47:08 +01:00
class ShowstreamAction extends ProfileAction
2008-12-23 19:49:23 +00:00
{
2011-09-18 17:33:35 +01:00
var $notice ;
function prepare ( $args )
{
parent :: prepare ( $args );
$p = Profile :: current ();
2011-12-31 17:09:07 +00:00
// Only the user him/herself, or someone with the power to unsilence,
// can view the page of a silenced user.
if (( $this -> profile -> hasRole ( Profile_role :: SILENCED )) &&
( empty ( $p ) || (( $p -> id != $this -> profile -> id ) && ( ! $p -> hasRight ( Right :: SILENCEUSER ))))) {
throw new ServerException ( sprintf ( _ ( " User %s has been silenced. " ), $this -> profile -> nickname ),
403 );
}
2011-09-18 17:33:35 +01:00
if ( empty ( $this -> tag )) {
$stream = new ProfileNoticeStream ( $this -> profile , $p );
} else {
$stream = new TaggedProfileNoticeStream ( $this -> profile , $this -> tag , $p );
}
$this -> notice = $stream -> getNotices (( $this -> page - 1 ) * NOTICES_PER_PAGE , NOTICES_PER_PAGE + 1 );
return true ;
}
2009-04-13 20:49:26 +01:00
function isReadOnly ( $args )
2009-01-23 08:45:48 +00:00
{
return true ;
}
2009-01-19 16:56:41 +00:00
function title ()
2008-12-23 19:33:23 +00:00
{
2010-11-02 20:42:33 +00:00
$base = $this -> profile -> getFancyName ();
2009-05-18 22:18:57 +01:00
if ( ! empty ( $this -> tag )) {
2010-11-02 21:20:06 +00:00
if ( $this -> page == 1 ) {
2011-08-15 14:57:36 +01:00
// TRANS: Page title showing tagged notices in one user's timeline.
2011-03-24 11:09:50 +00:00
// TRANS: %1$s is the username, %2$s is the hash tag.
2011-03-31 21:43:57 +01:00
return sprintf ( _ ( 'Notices by %1$s tagged %2$s' ), $base , $this -> tag );
2010-11-02 21:20:06 +00:00
} else {
2011-08-15 14:57:36 +01:00
// TRANS: Page title showing tagged notices in one user's timeline.
2011-02-16 23:39:53 +00:00
// TRANS: %1$s is the username, %2$s is the hash tag, %3$d is the page number.
2011-03-31 21:43:57 +01:00
return sprintf ( _ ( 'Notices by %1$s tagged %2$s, page %3$d' ), $base , $this -> tag , $this -> page );
2010-11-02 21:20:06 +00:00
}
2009-01-19 16:56:41 +00:00
} else {
2010-11-02 21:20:06 +00:00
if ( $this -> page == 1 ) {
return $base ;
} else {
2011-08-15 14:57:36 +01:00
// TRANS: Extended page title showing tagged notices in one user's timeline.
2010-11-02 22:48:36 +00:00
// TRANS: %1$s is the username, %2$d is the page number.
2011-03-31 21:43:57 +01:00
return sprintf ( _ ( 'Notices by %1$s, page %2$d' ),
2010-11-02 21:20:06 +00:00
$base ,
$this -> page );
}
2009-01-19 16:56:41 +00:00
}
}
2008-05-17 20:24:47 +01:00
2009-01-19 16:56:41 +00:00
function handle ( $args )
{
// Looks like we're good; start output
2008-12-23 19:19:07 +00:00
2009-01-19 16:56:41 +00:00
// For YADIS discovery, we also have a <meta> tag
2008-12-23 19:19:07 +00:00
2009-01-19 16:56:41 +00:00
$this -> showPage ();
2008-12-23 19:19:07 +00:00
}
2009-01-19 16:56:41 +00:00
function showContent ()
2008-12-23 19:33:23 +00:00
{
2009-01-19 16:56:41 +00:00
$this -> showNotices ();
}
2008-12-23 19:19:07 +00:00
2011-03-14 16:10:07 +00:00
function showProfileBlock ()
{
$block = new AccountProfileBlock ( $this , $this -> profile );
$block -> show ();
}
2009-01-19 23:19:05 +00:00
function showPageNoticeBlock ()
{
return ;
2009-01-19 16:56:41 +00:00
}
2009-02-11 16:37:50 +00:00
function getFeeds ()
2009-01-19 16:56:41 +00:00
{
2009-05-18 23:18:08 +01:00
if ( ! empty ( $this -> tag )) {
return array ( new Feed ( Feed :: RSS1 ,
2009-10-07 10:55:54 +01:00
common_local_url ( 'userrss' ,
array ( 'nickname' => $this -> user -> nickname ,
'tag' => $this -> tag )),
2010-11-02 22:48:36 +00:00
// TRANS: Title for link to notice feed.
// TRANS: %1$s is a user nickname, %2$s is a hashtag.
2010-01-10 00:45:58 +00:00
sprintf ( _ ( 'Notice feed for %1$s tagged %2$s (RSS 1.0)' ),
2009-10-07 10:55:54 +01:00
$this -> user -> nickname , $this -> tag )));
2009-05-18 23:18:08 +01:00
}
2011-06-22 22:09:04 +01:00
return array ( new Feed ( Feed :: JSON ,
common_local_url ( 'ApiTimelineUser' ,
array (
'id' => $this -> user -> id ,
'format' => 'as' )),
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
sprintf ( _ ( 'Notice feed for %s (Activity Streams JSON)' ),
$this -> user -> nickname )),
new Feed ( Feed :: RSS1 ,
2009-02-11 16:37:50 +00:00
common_local_url ( 'userrss' ,
array ( 'nickname' => $this -> user -> nickname )),
2010-11-02 22:48:36 +00:00
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
2009-02-11 16:37:50 +00:00
sprintf ( _ ( 'Notice feed for %s (RSS 1.0)' ),
$this -> user -> nickname )),
new Feed ( Feed :: RSS2 ,
2009-10-29 23:09:42 +00:00
common_local_url ( 'ApiTimelineUser' ,
array (
2010-02-08 22:06:36 +00:00
'id' => $this -> user -> id ,
2009-10-29 23:09:42 +00:00
'format' => 'rss' )),
2010-11-02 22:48:36 +00:00
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
2009-02-11 16:37:50 +00:00
sprintf ( _ ( 'Notice feed for %s (RSS 2.0)' ),
$this -> user -> nickname )),
new Feed ( Feed :: ATOM ,
2009-10-29 23:09:42 +00:00
common_local_url ( 'ApiTimelineUser' ,
array (
2010-02-08 22:06:36 +00:00
'id' => $this -> user -> id ,
2009-10-29 23:09:42 +00:00
'format' => 'atom' )),
2011-03-24 11:09:50 +00:00
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
2009-02-11 16:37:50 +00:00
sprintf ( _ ( 'Notice feed for %s (Atom)' ),
$this -> user -> nickname )),
new Feed ( Feed :: FOAF ,
common_local_url ( 'foaf' , array ( 'nickname' =>
$this -> user -> nickname )),
2010-11-02 22:48:36 +00:00
// TRANS: Title for link to notice feed. FOAF stands for Friend of a Friend.
// TRANS: More information at http://www.foaf-project.org. %s is a user nickname.
2009-02-11 16:37:50 +00:00
sprintf ( _ ( 'FOAF for %s' ), $this -> user -> nickname )));
2009-01-19 16:56:41 +00:00
}
function extraHead ()
{
if ( $this -> profile -> bio ) {
2009-01-15 22:57:15 +00:00
$this -> element ( 'meta' , array ( 'name' => 'description' ,
2009-01-19 16:56:41 +00:00
'content' => $this -> profile -> bio ));
2008-12-23 19:19:07 +00:00
}
2009-01-19 16:56:41 +00:00
if ( $this -> user -> emailmicroid && $this -> user -> email && $this -> profile -> profileurl ) {
$id = new Microid ( 'mailto:' . $this -> user -> email ,
$this -> selfUrl ());
2009-01-15 22:57:15 +00:00
$this -> element ( 'meta' , array ( 'name' => 'microid' ,
2009-01-19 16:56:41 +00:00
'content' => $id -> toString ()));
2008-12-23 19:19:07 +00:00
}
2009-01-19 16:56:41 +00:00
// See https://wiki.mozilla.org/Microsummaries
2008-12-23 19:19:07 +00:00
2009-01-15 22:57:15 +00:00
$this -> element ( 'link' , array ( 'rel' => 'microsummary' ,
2008-12-23 19:19:07 +00:00
'href' => common_local_url ( 'microsummary' ,
2009-01-19 16:56:41 +00:00
array ( 'nickname' => $this -> profile -> nickname ))));
2010-01-31 20:16:59 +00:00
$rsd = common_local_url ( 'rsd' ,
array ( 'nickname' => $this -> profile -> nickname ));
// RSD, http://tales.phrasewise.com/rfc/rsd
$this -> element ( 'link' , array ( 'rel' => 'EditURI' ,
'type' => 'application/rsd+xml' ,
'href' => $rsd ));
2008-12-23 19:19:07 +00:00
}
2009-04-08 00:14:02 +01:00
function showEmptyListMessage ()
{
2011-08-15 14:57:36 +01:00
// TRANS: First sentence of empty list message for a timeline. $1%s is a user nickname.
2010-11-02 22:48:36 +00:00
$message = sprintf ( _ ( 'This is the timeline for %1$s, but %1$s hasn\'t posted anything yet.' ), $this -> user -> nickname ) . ' ' ;
2009-04-08 00:14:02 +01:00
if ( common_logged_in ()) {
$current_user = common_current_user ();
if ( $this -> user -> id === $current_user -> id ) {
2010-11-02 22:48:36 +00:00
// TRANS: Second sentence of empty list message for a stream for the user themselves.
2009-04-08 00:14:02 +01:00
$message .= _ ( 'Seen anything interesting recently? You haven\'t posted any notices yet, now would be a good time to start :)' );
} else {
2011-08-15 14:57:36 +01:00
// TRANS: Second sentence of empty list message for a non-self timeline. %1$s is a user nickname, %2$s is a part of a URL.
2010-11-02 22:48:36 +00:00
// TRANS: This message contains a Markdown link. Keep "](" together.
2010-07-31 23:16:39 +01:00
$message .= sprintf ( _ ( 'You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%%?status_textarea=%2$s).' ), $this -> user -> nickname , '@' . $this -> user -> nickname );
2009-04-08 00:14:02 +01:00
}
}
else {
2010-11-02 22:48:36 +00:00
// TRANS: Second sentence of empty message for anonymous users. %s is a user nickname.
// TRANS: This message contains a Markdown link. Keep "](" together.
2010-07-31 23:16:39 +01:00
$message .= sprintf ( _ ( 'Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.' ), $this -> user -> nickname );
2009-04-08 00:14:02 +01:00
}
$this -> elementStart ( 'div' , 'guide' );
$this -> raw ( common_markup_to_html ( $message ));
$this -> elementEnd ( 'div' );
}
2009-01-19 16:56:41 +00:00
function showNotices ()
2008-12-23 19:33:23 +00:00
{
2010-10-01 19:05:15 +01:00
$pnl = null ;
2011-09-18 17:33:35 +01:00
if ( Event :: handle ( 'ShowStreamNoticeList' , array ( $this -> notice , $this , & $pnl ))) {
$pnl = new ProfileNoticeList ( $this -> notice , $this );
2010-10-01 19:05:15 +01:00
}
2009-01-19 16:56:41 +00:00
$cnt = $pnl -> show ();
2009-04-08 00:14:02 +01:00
if ( 0 == $cnt ) {
2009-04-08 02:20:50 +01:00
$this -> showEmptyListMessage ();
2009-04-08 00:14:02 +01:00
}
2009-01-19 16:56:41 +00:00
2009-09-16 10:07:33 +01:00
$args = array ( 'nickname' => $this -> user -> nickname );
if ( ! empty ( $this -> tag ))
{
$args [ 'tag' ] = $this -> tag ;
}
2009-01-19 16:56:41 +00:00
$this -> pagination ( $this -> page > 1 , $cnt > NOTICES_PER_PAGE , $this -> page ,
2009-09-16 10:07:33 +01:00
'showstream' , $args );
2008-12-23 19:19:07 +00:00
}
2009-01-23 03:15:03 +00:00
function showAnonymousMessage ()
{
2009-03-19 21:55:03 +00:00
if ( ! ( common_config ( 'site' , 'closed' ) || common_config ( 'site' , 'inviteonly' ))) {
2011-08-15 14:57:36 +01:00
// TRANS: Announcement for anonymous users showing a timeline if site registrations are open.
2010-11-02 22:48:36 +00:00
// TRANS: This message contains a Markdown link. Keep "](" together.
2009-03-19 21:55:03 +00:00
$m = sprintf ( _ ( '**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
2009-10-07 10:55:54 +01:00
'based on the Free Software [StatusNet](http://status.net/) tool. ' .
'[Join now](%%%%action.register%%%%) to follow **%s**\'s notices and many more! ([Read more](%%%%doc.help%%%%))' ),
$this -> user -> nickname , $this -> user -> nickname );
2009-03-19 21:55:03 +00:00
} else {
2011-08-15 14:57:36 +01:00
// TRANS: Announcement for anonymous users showing a timeline if site registrations are closed or invite only.
2010-11-02 22:48:36 +00:00
// TRANS: This message contains a Markdown link. Keep "](" together.
2009-03-19 21:55:03 +00:00
$m = sprintf ( _ ( '**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
2011-10-29 13:34:50 +01:00
'based on the Free Software [StatusNet](http://status.net/) tool.' ),
2009-10-07 10:55:54 +01:00
$this -> user -> nickname , $this -> user -> nickname );
}
2009-01-23 03:47:32 +00:00
$this -> elementStart ( 'div' , array ( 'id' => 'anon_notice' ));
2009-01-23 03:15:03 +00:00
$this -> raw ( common_markup_to_html ( $m ));
2009-01-23 03:31:50 +00:00
$this -> elementEnd ( 'div' );
2009-01-23 03:15:03 +00:00
}
2009-04-07 22:47:08 +01:00
function showSections ()
{
parent :: showSections ();
2011-09-20 02:55:11 +01:00
if ( ! common_config ( 'performance' , 'high' )) {
$cloud = new PersonalTagCloudSection ( $this , $this -> user );
$cloud -> show ();
}
2009-04-07 22:47:08 +01:00
}
2011-03-28 21:24:28 +01:00
function noticeFormOptions ()
{
$options = parent :: noticeFormOptions ();
$cur = common_current_user ();
if ( empty ( $cur ) || $cur -> id != $this -> profile -> id ) {
$options [ 'to_profile' ] = $this -> profile ;
}
return $options ;
}
2008-12-11 23:12:52 +00:00
}
2008-06-10 15:37:09 +01:00
2009-11-09 19:01:46 +00:00
// We don't show the author for a profile, since we already know who it is!
2008-07-30 04:39:39 +01:00
2011-03-16 21:54:14 +00:00
/**
* Slightly modified from standard list ; the author & avatar are hidden
* in CSS . We used to remove them here too , but as it turns out that
* confuses the inline reply code ... and we hide them in CSS anyway
* since realtime updates come through in original form .
*
* Remaining customization right now is for the repeat marker , where
* it ' ll list who the original poster was instead of who did the repeat
* ( since the repeater is you , and the repeatee isn ' t shown ! )
* This will remain inconsistent if realtime updates come through ,
* since those ' ll get rendered as a regular NoticeListItem .
*/
2008-12-23 19:49:23 +00:00
class ProfileNoticeList extends NoticeList
{
2008-12-23 19:33:23 +00:00
function newListItem ( $notice )
{
2009-01-19 16:56:41 +00:00
return new ProfileNoticeListItem ( $notice , $this -> out );
2008-12-11 23:12:52 +00:00
}
}
2008-12-03 03:59:47 +00:00
2010-10-18 16:29:52 +01:00
class ProfileNoticeListItem extends DoFollowListItem
2008-12-23 19:49:23 +00:00
{
2009-12-11 17:16:11 +00:00
/**
* show a link to the author of repeat
*
* @ return void
*/
function showRepeat ()
{
if ( ! empty ( $this -> repeat )) {
// FIXME: this code is almost identical to default; need to refactor
$attrs = array ( 'href' => $this -> profile -> profileurl ,
'class' => 'url' );
if ( ! empty ( $this -> profile -> fullname )) {
2010-12-18 00:21:33 +00:00
$attrs [ 'title' ] = $this -> profile -> getFancyName ();
2009-12-11 17:16:11 +00:00
}
$this -> out -> elementStart ( 'span' , 'repeat' );
$text_link = XMLStringer :: estring ( 'a' , $attrs , $this -> profile -> nickname );
2010-11-02 22:48:36 +00:00
// TRANS: Link to the author of a repeated notice. %s is a linked nickname.
2009-12-11 17:16:11 +00:00
$this -> out -> raw ( sprintf ( _ ( 'Repeat of %s' ), $text_link ));
$this -> out -> elementEnd ( 'span' );
}
}
2008-11-16 02:27:35 +00:00
}