2008-05-07 17:48:07 +01:00
< ? php
2020-01-09 21:41:34 +00:00
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social 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.
//
// GNU social 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 GNU social. If not, see <http://www.gnu.org/licenses/>.
2009-01-19 16:56:41 +00:00
/**
* User profile page
*
* @ category Personal
2020-01-09 21:41:34 +00:00
* @ package GNUsocial
2009-08-25 23:19:04 +01:00
* @ author Evan Prodromou < evan @ status . net >
* @ author Sarven Capadisli < csarven @ status . net >
2020-01-09 21:41:34 +00:00
* @ copyright 2009 Free Software Foundation , Inc http :// www . fsf . org
* @ license https :// www . gnu . org / licenses / agpl . html GNU AGPL v3 or later
2008-05-14 20:26:48 +01:00
*/
2020-01-09 21:41:34 +00:00
defined ( 'GNUSOCIAL' ) || die ();
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
*/
2015-07-04 18:48:35 +01:00
class ShowstreamAction extends NoticestreamAction
2008-12-23 19:49:23 +00:00
{
2015-06-25 19:13:27 +01:00
public function getStream ()
2011-09-18 17:33:35 +01:00
{
if ( empty ( $this -> tag )) {
2015-04-22 20:22:02 +01:00
$stream = new ProfileNoticeStream ( $this -> target , $this -> scoped );
2011-09-18 17:33:35 +01:00
} else {
2015-04-22 20:22:02 +01:00
$stream = new TaggedProfileNoticeStream ( $this -> target , $this -> tag , $this -> scoped );
2011-09-18 17:33:35 +01:00
}
2015-06-05 20:49:34 +01:00
return $stream ;
2011-09-18 17:33:35 +01:00
}
2020-01-09 21:41:34 +00:00
public function title ()
2008-12-23 19:33:23 +00:00
{
2015-04-22 20:22:02 +01:00
$base = $this -> target -> 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 ) {
2015-07-25 13:45:45 +01:00
return sprintf ( _ ( 'Notices by %s' ), $base );
2010-11-02 21:20:06 +00:00
} 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.
2020-01-09 21:41:34 +00:00
return sprintf (
_ ( 'Notices by %1$s, page %2$d' ),
$base ,
$this -> page
);
2010-11-02 21:20:06 +00:00
}
2009-01-19 16:56:41 +00:00
}
}
2008-05-17 20:24:47 +01:00
2015-09-27 22:46:30 +01:00
protected 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
2020-01-09 21:41:34 +00:00
public function showProfileBlock ()
2011-03-14 16:10:07 +00:00
{
2015-04-22 20:22:02 +01:00
$block = new AccountProfileBlock ( $this , $this -> target );
2011-03-14 16:10:07 +00:00
$block -> show ();
}
2020-01-09 21:41:34 +00:00
public function showPageNoticeBlock ()
2009-01-19 23:19:05 +00:00
{
return ;
2009-01-19 16:56:41 +00:00
}
2020-01-09 21:41:34 +00:00
public function getFeeds ()
2009-01-19 16:56:41 +00:00
{
2009-05-18 23:18:08 +01:00
if ( ! empty ( $this -> tag )) {
2020-01-09 21:41:34 +00:00
return [ new Feed (
Feed :: RSS1 ,
common_local_url (
'userrss' ,
[
'nickname' => $this -> target -> getNickname (),
'tag' => $this -> tag ,
]
),
// TRANS: Title for link to notice feed.
// TRANS: %1$s is a user nickname, %2$s is a hashtag.
sprintf (
_ ( 'Notice feed for %1$s tagged %2$s (RSS 1.0)' ),
$this -> target -> getNickname (),
$this -> tag
)
)];
2009-05-18 23:18:08 +01:00
}
2017-04-09 11:13:53 +01:00
if ( ! $this -> target -> isLocal ()) {
// remote profiles at least have Atom, but we can't guarantee anything else
2020-01-09 21:41:34 +00:00
return [ new Feed (
Feed :: ATOM ,
$this -> target -> getAtomFeed (),
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
sprintf (
_ ( 'Notice feed for %s (Atom)' ),
$this -> target -> getNickname ()
)
)];
2017-04-09 11:13:53 +01:00
}
2020-01-09 21:41:34 +00:00
return [
new Feed (
Feed :: JSON ,
common_local_url (
'ApiTimelineUser' ,
[
'id' => $this -> target -> getID (),
'format' => 'as' ,
]
),
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
sprintf (
_ ( 'Notice feed for %s (Activity Streams JSON)' ),
$this -> target -> getNickname ()
)
),
new Feed (
Feed :: RSS1 ,
common_local_url (
'userrss' ,
[ 'nickname' => $this -> target -> getNickname ()]
),
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
sprintf (
_ ( 'Notice feed for %s (RSS 1.0)' ),
$this -> target -> getNickname ()
)
),
new Feed (
Feed :: RSS2 ,
common_local_url (
'ApiTimelineUser' ,
[
'id' => $this -> target -> getID (),
'format' => 'rss' ,
]
),
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
sprintf (
_ ( 'Notice feed for %s (RSS 2.0)' ),
$this -> target -> getNickname ()
)
),
new Feed (
Feed :: ATOM ,
$this -> target -> getAtomFeed (),
// TRANS: Title for link to notice feed.
// TRANS: %s is a user nickname.
sprintf (
_ ( 'Notice feed for %s (Atom)' ),
$this -> target -> getNickname ()
)
),
new Feed (
Feed :: FOAF ,
common_local_url (
'foaf' ,
[ 'nickname' => $this -> target -> getNickname ()]
),
// 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.
sprintf ( _ ( 'FOAF for %s' ), $this -> target -> getNickname ())
)
];
2009-01-19 16:56:41 +00:00
}
2016-02-24 15:43:09 +00:00
public function extraHeaders ()
{
parent :: extraHeaders ();
// Publish all the rel="me" in the HTTP headers on our main profile page
if ( get_class ( $this ) == 'ShowstreamAction' ) {
foreach ( $this -> target -> getRelMes () as $relMe ) {
2020-01-09 21:41:34 +00:00
header ( 'Link: <' . htmlspecialchars ( $relMe [ 'href' ]) . '>; rel="me"' , false );
2016-02-24 15:43:09 +00:00
}
}
}
2020-01-09 21:41:34 +00:00
public function extraHead ()
2009-01-19 16:56:41 +00:00
{
2020-01-09 17:02:26 +00:00
if ( ! $this -> target -> isLocal ()) {
$this -> element (
'meta' ,
[
'name' => 'robots' ,
'content' => 'noindex' ,
]
);
}
2015-04-22 20:22:02 +01:00
if ( $this -> target -> bio ) {
2020-01-09 21:41:34 +00:00
$this -> element (
'meta' ,
[
'name' => 'description' ,
'content' => $this -> target -> getDescription (),
]
);
2008-12-23 19:19:07 +00:00
}
2020-01-09 21:41:34 +00:00
$rsd = common_local_url (
'rsd' ,
[ 'nickname' => $this -> target -> getNickname ()]
);
2010-01-31 20:16:59 +00:00
// RSD, http://tales.phrasewise.com/rfc/rsd
2020-01-09 21:41:34 +00:00
$this -> element (
'link' ,
[
'rel' => 'EditURI' ,
'type' => 'application/rsd+xml' ,
'href' => $rsd ,
]
);
2012-01-26 16:02:29 +00:00
if ( $this -> page != 1 ) {
2020-01-09 21:41:34 +00:00
$this -> element (
'link' ,
[
'rel' => 'canonical' ,
'href' => $this -> target -> getUrl (),
]
);
2012-01-26 16:02:29 +00:00
}
2008-12-23 19:19:07 +00:00
}
2020-01-09 21:41:34 +00:00
public function showEmptyListMessage ()
2009-04-08 00:14:02 +01:00
{
2011-08-15 14:57:36 +01:00
// TRANS: First sentence of empty list message for a timeline. $1%s is a user nickname.
2015-06-05 20:24:41 +01:00
$message = sprintf ( _ ( 'This is the timeline for %1$s, but %1$s hasn\'t posted anything yet.' ), $this -> target -> getNickname ()) . ' ' ;
2009-04-08 00:14:02 +01:00
2015-06-05 20:24:41 +01:00
if ( $this -> scoped instanceof Profile ) {
if ( $this -> target -> getID () === $this -> scoped -> getID ()) {
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.
2015-06-05 20:24:41 +01:00
$message .= sprintf ( _ ( 'You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%%?status_textarea=%2$s).' ), $this -> target -> getNickname (), '@' . $this -> target -> getNickname ());
2009-04-08 00:14:02 +01:00
}
2020-01-09 21:41:34 +00: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.
2015-06-05 20:24:41 +01:00
$message .= sprintf ( _ ( 'Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.' ), $this -> target -> getNickname ());
2009-04-08 00:14:02 +01:00
}
$this -> elementStart ( 'div' , 'guide' );
$this -> raw ( common_markup_to_html ( $message ));
$this -> elementEnd ( 'div' );
}
2020-01-09 21:41:34 +00:00
public function showNotices ()
2008-12-23 19:33:23 +00:00
{
2016-06-21 14:55:49 +01:00
$pnl = new PrimaryNoticeList ( $this -> notice , $this );
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
2017-07-11 20:16:30 +01:00
// either nickname or id will be used, depending on which action (showstream, userbyid...)
$args = array ( 'nickname' => $this -> target -> getNickname (), 'id' => $this -> target -> getID ());
2020-01-09 21:41:34 +00:00
if ( ! empty ( $this -> tag )) {
2009-09-16 10:07:33 +01:00
$args [ 'tag' ] = $this -> tag ;
}
2020-01-09 21:41:34 +00:00
$this -> pagination (
$this -> page > 1 ,
$cnt > NOTICES_PER_PAGE ,
$this -> page ,
$this -> getActionName (),
$args
);
2008-12-23 19:19:07 +00:00
}
2020-01-09 21:41:34 +00:00
public function showAnonymousMessage ()
2009-01-23 03:15:03 +00:00
{
2020-01-09 21:41:34 +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.
2020-01-09 21:41:34 +00:00
$m = sprintf (
_ ( '**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
'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 -> target -> getNickname (),
$this -> target -> getNickname ()
);
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.
2020-01-09 21:41:34 +00:00
$m = sprintf (
_ ( '**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
'based on the Free Software [StatusNet](http://status.net/) tool.' ),
$this -> target -> getNickname (),
$this -> target -> getNickname ()
);
2009-10-07 10:55:54 +01:00
}
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
}
2020-01-09 21:41:34 +00:00
public function noticeFormOptions ()
2011-03-28 21:24:28 +01:00
{
$options = parent :: noticeFormOptions ();
2015-07-10 11:34:06 +01:00
if ( ! $this -> scoped instanceof Profile || ! $this -> scoped -> sameAs ( $this -> target )) {
2020-01-09 21:41:34 +00:00
$options [ 'to_profile' ] = $this -> target ;
2011-03-28 21:24:28 +01:00
}
return $options ;
}
2008-12-11 23:12:52 +00:00
}