2008-05-07 17:48:07 +01:00
< ? php
2009-01-19 16:56:41 +00:00
/**
* Laconica , 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
* @ package Laconica
* @ author Evan Prodromou < evan @ controlyourself . ca >
2009-01-20 22:36:57 +00:00
* @ author Sarven Capadisli < csarven @ controlyourself . ca >
2009-01-19 16:56:41 +00:00
* @ copyright 2008 - 2009 Control Yourself , Inc .
* @ license http :// www . fsf . org / licensing / licenses / agpl - 3.0 . html GNU Affero General Public License version 3.0
* @ link http :// laconi . ca /
2008-05-14 20:26:48 +01:00
*/
2009-01-19 16:56:41 +00:00
if ( ! defined ( 'LACONICA' )) {
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
* @ package Laconica
* @ author Evan Prodromou < evan @ controlyourself . ca >
* @ license http :// www . fsf . org / licensing / licenses / agpl - 3.0 . html GNU Affero General Public License version 3.0
* @ link http :// laconi . ca /
*/
2008-05-09 03:16:04 +01:00
2009-04-07 22:47:08 +01:00
class ShowstreamAction extends ProfileAction
2008-12-23 19:49:23 +00:00
{
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
{
2009-03-30 14:58:28 +01:00
if ( ! empty ( $this -> profile -> fullname )) {
$base = $this -> profile -> fullname . ' (' . $this -> user -> nickname . ') ' ;
} else {
$base = $this -> user -> nickname ;
}
2009-05-18 22:18:57 +01:00
if ( ! empty ( $this -> tag )) {
$base .= sprintf ( _ ( ' tagged %s' ), $this -> tag );
}
2009-03-30 14:58:28 +01:00
2009-01-19 16:56:41 +00:00
if ( $this -> page == 1 ) {
2009-03-30 14:58:28 +01:00
return $base ;
2009-01-19 16:56:41 +00:00
} else {
return sprintf ( _ ( " %s, page %d " ),
2009-03-30 14:58:28 +01:00
$base ,
2009-01-19 16:56:41 +00:00
$this -> page );
}
}
2008-05-17 20:24:47 +01:00
2009-01-19 16:56:41 +00:00
function handle ( $args )
{
2008-12-23 19:19:07 +00:00
2009-01-19 16:56:41 +00:00
// 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
header ( 'X-XRDS-Location: ' . common_local_url ( 'xrds' , array ( 'nickname' =>
$this -> user -> nickname )));
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 -> showProfile ();
$this -> showNotices ();
}
2008-12-23 19:19:07 +00:00
2009-01-19 16:56:41 +00:00
function showLocalNav ()
{
$nav = new PersonalGroupNav ( $this );
$nav -> show ();
}
2008-12-23 19:19:07 +00:00
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-02-11 16:37:50 +00:00
return array ( new Feed ( Feed :: RSS1 ,
common_local_url ( 'userrss' ,
array ( 'nickname' => $this -> user -> nickname )),
sprintf ( _ ( 'Notice feed for %s (RSS 1.0)' ),
$this -> user -> nickname )),
new Feed ( Feed :: RSS2 ,
common_local_url ( 'api' ,
array ( 'apiaction' => 'statuses' ,
'method' => 'user_timeline' ,
'argument' => $this -> user -> nickname . '.rss' )),
sprintf ( _ ( 'Notice feed for %s (RSS 2.0)' ),
$this -> user -> nickname )),
new Feed ( Feed :: ATOM ,
common_local_url ( 'api' ,
array ( 'apiaction' => 'statuses' ,
'method' => 'user_timeline' ,
'argument' => $this -> user -> nickname . '.atom' )),
sprintf ( _ ( 'Notice feed for %s (Atom)' ),
$this -> user -> nickname )),
new Feed ( Feed :: FOAF ,
common_local_url ( 'foaf' , array ( 'nickname' =>
$this -> user -> nickname )),
sprintf ( _ ( 'FOAF for %s' ), $this -> user -> nickname )));
2009-01-19 16:56:41 +00:00
}
2009-02-08 13:02:51 +00:00
/**
* Output document relationship links
*
* @ return void
*/
function showRelationshipLinks ()
{
2009-02-10 08:42:01 +00:00
$this -> sequenceRelationships ( $this -> page > 1 , $this -> count > NOTICES_PER_PAGE , // FIXME
$this -> page , 'showstream' , array ( 'nickname' => $this -> user -> nickname ));
2009-02-08 13:02:51 +00:00
}
2009-01-19 16:56:41 +00:00
function extraHead ()
{
// for remote subscriptions etc.
2009-01-15 22:57:15 +00:00
$this -> element ( 'meta' , array ( 'http-equiv' => 'X-XRDS-Location' ,
2008-12-23 19:19:07 +00:00
'content' => common_local_url ( 'xrds' , array ( 'nickname' =>
2009-02-09 17:07:21 +00:00
$this -> user -> nickname ))));
2009-01-19 16:56:41 +00:00
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
if ( $this -> user -> jabbermicroid && $this -> user -> jabber && $this -> profile -> profileurl ) {
$id = new Microid ( 'xmpp:' . $this -> user -> jabber ,
$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 ))));
2008-12-23 19:19:07 +00:00
}
2009-01-19 16:56:41 +00:00
function showProfile ()
2008-12-23 19:33:23 +00:00
{
2009-01-21 23:33:52 +00:00
$this -> elementStart ( 'div' , 'entity_profile vcard author' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'h2' , null , _ ( 'User profile' ));
2008-12-23 19:19:07 +00:00
2009-01-19 16:56:41 +00:00
$avatar = $this -> profile -> getAvatar ( AVATAR_PROFILE_SIZE );
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'dl' , 'entity_depiction' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'dt' , null , _ ( 'Photo' ));
$this -> elementStart ( 'dd' );
2009-02-06 08:13:08 +00:00
$this -> element ( 'img' , array ( 'src' => ( $avatar ) ? $avatar -> displayUrl () : Avatar :: defaultImage ( AVATAR_PROFILE_SIZE ),
2009-01-19 22:40:21 +00:00
'class' => 'photo avatar' ,
2008-12-23 19:19:07 +00:00
'width' => AVATAR_PROFILE_SIZE ,
'height' => AVATAR_PROFILE_SIZE ,
2009-01-19 16:56:41 +00:00
'alt' => $this -> profile -> nickname ));
2009-01-19 22:40:21 +00:00
$this -> elementEnd ( 'dd' );
2009-02-09 17:07:21 +00:00
2009-02-06 23:36:34 +00:00
$user = User :: staticGet ( 'id' , $this -> profile -> id );
$cur = common_current_user ();
if ( $cur && $cur -> id == $user -> id ) {
$this -> elementStart ( 'dd' );
$this -> element ( 'a' , array ( 'href' => common_local_url ( 'avatarsettings' )), _ ( 'Edit Avatar' ));
$this -> elementEnd ( 'dd' );
}
2009-02-09 17:07:21 +00:00
2009-01-19 22:40:21 +00:00
$this -> elementEnd ( 'dl' );
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'dl' , 'entity_nickname' );
2009-01-20 05:58:35 +00:00
$this -> element ( 'dt' , null , _ ( 'Nickname' ));
$this -> elementStart ( 'dd' );
2009-01-20 23:50:52 +00:00
$hasFN = ( $this -> profile -> fullname ) ? 'nickname url uid' : 'fn nickname url uid' ;
$this -> element ( 'a' , array ( 'href' => $this -> profile -> profileurl ,
'rel' => 'me' , 'class' => $hasFN ),
2009-02-09 17:07:21 +00:00
$this -> profile -> nickname );
2009-01-20 05:58:35 +00:00
$this -> elementEnd ( 'dd' );
$this -> elementEnd ( 'dl' );
2009-01-19 22:40:21 +00:00
if ( $this -> profile -> fullname ) {
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'dl' , 'entity_fn' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'dt' , null , _ ( 'Full name' ));
$this -> elementStart ( 'dd' );
2009-01-19 23:19:05 +00:00
$this -> element ( 'span' , 'fn' , $this -> profile -> fullname );
2009-01-19 22:40:21 +00:00
$this -> elementEnd ( 'dd' );
$this -> elementEnd ( 'dl' );
}
if ( $this -> profile -> location ) {
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'dl' , 'entity_location' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'dt' , null , _ ( 'Location' ));
2009-02-11 16:50:07 +00:00
$this -> element ( 'dd' , 'label' , $this -> profile -> location );
2009-01-19 22:40:21 +00:00
$this -> elementEnd ( 'dl' );
}
if ( $this -> profile -> homepage ) {
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'dl' , 'entity_url' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'dt' , null , _ ( 'URL' ));
$this -> elementStart ( 'dd' );
$this -> element ( 'a' , array ( 'href' => $this -> profile -> homepage ,
'rel' => 'me' , 'class' => 'url' ),
$this -> profile -> homepage );
$this -> elementEnd ( 'dd' );
$this -> elementEnd ( 'dl' );
}
if ( $this -> profile -> bio ) {
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'dl' , 'entity_note' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'dt' , null , _ ( 'Note' ));
$this -> element ( 'dd' , 'note' , $this -> profile -> bio );
$this -> elementEnd ( 'dl' );
}
$tags = Profile_tag :: getTags ( $this -> profile -> id , $this -> profile -> id );
if ( count ( $tags ) > 0 ) {
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'dl' , 'entity_tags' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'dt' , null , _ ( 'Tags' ));
2009-01-21 01:22:08 +00:00
$this -> elementStart ( 'dd' );
2009-01-19 22:40:21 +00:00
$this -> elementStart ( 'ul' , 'tags xoxo' );
foreach ( $tags as $tag ) {
$this -> elementStart ( 'li' );
2009-02-17 07:37:02 +00:00
// Avoid space by using raw output.
$pt = '<span class="mark_hash">#</span><a rel="tag" href="' .
common_local_url ( 'peopletag' , array ( 'tag' => $tag )) .
'">' . $tag . '</a>' ;
$this -> raw ( $pt );
2009-01-19 22:40:21 +00:00
$this -> elementEnd ( 'li' );
}
$this -> elementEnd ( 'ul' );
$this -> elementEnd ( 'dd' );
$this -> elementEnd ( 'dl' );
}
$this -> elementEnd ( 'div' );
2008-11-16 02:27:35 +00:00
2009-01-22 00:04:13 +00:00
$this -> elementStart ( 'div' , 'entity_actions' );
2009-01-19 22:40:21 +00:00
$this -> element ( 'h2' , null , _ ( 'User actions' ));
$this -> elementStart ( 'ul' );
2008-12-23 19:19:07 +00:00
$cur = common_current_user ();
2009-02-02 16:33:47 +00:00
if ( $cur && $cur -> id == $this -> profile -> id ) {
$this -> elementStart ( 'li' , 'entity_edit' );
$this -> element ( 'a' , array ( 'href' => common_local_url ( 'profilesettings' ),
'title' => _ ( 'Edit profile settings' )),
2009-02-09 17:07:21 +00:00
_ ( 'Edit' ));
2009-02-02 16:33:47 +00:00
$this -> elementEnd ( 'li' );
}
2008-12-23 19:19:07 +00:00
if ( $cur ) {
2009-01-19 16:56:41 +00:00
if ( $cur -> id != $this -> profile -> id ) {
2009-02-02 16:33:47 +00:00
$this -> elementStart ( 'li' , 'entity_subscribe' );
2009-01-19 16:56:41 +00:00
if ( $cur -> isSubscribed ( $this -> profile )) {
$usf = new UnsubscribeForm ( $this , $this -> profile );
$usf -> show ();
2009-01-21 18:03:33 +00:00
} else {
$sf = new SubscribeForm ( $this , $this -> profile );
$sf -> show ();
2008-12-23 19:19:07 +00:00
}
2009-02-02 16:33:47 +00:00
$this -> elementEnd ( 'li' );
2008-12-23 19:19:07 +00:00
}
} else {
2009-02-02 16:33:47 +00:00
$this -> elementStart ( 'li' , 'entity_subscribe' );
2009-01-19 16:56:41 +00:00
$this -> showRemoteSubscribeLink ();
2009-02-02 16:33:47 +00:00
$this -> elementEnd ( 'li' );
2008-12-23 19:19:07 +00:00
}
2009-01-21 06:31:53 +00:00
if ( $cur && $cur -> id != $user -> id && $cur -> mutuallySubscribed ( $user )) {
2009-02-09 17:07:21 +00:00
$this -> elementStart ( 'li' , 'entity_send-a-message' );
2009-01-21 07:14:43 +00:00
$this -> element ( 'a' , array ( 'href' => common_local_url ( 'newmessage' , array ( 'to' => $user -> id )),
'title' => _ ( 'Send a direct message to this user' )),
_ ( 'Message' ));
2009-01-21 06:31:53 +00:00
$this -> elementEnd ( 'li' );
if ( $user -> email && $user -> emailnotifynudge ) {
2009-02-02 16:33:47 +00:00
$this -> elementStart ( 'li' , 'entity_nudge' );
2009-01-21 06:31:53 +00:00
$nf = new NudgeForm ( $this , $user );
$nf -> show ();
$this -> elementEnd ( 'li' );
}
}
2009-01-19 16:56:41 +00:00
if ( $cur && $cur -> id != $this -> profile -> id ) {
$blocked = $cur -> hasBlocked ( $this -> profile );
2009-02-02 16:33:47 +00:00
$this -> elementStart ( 'li' , 'entity_block' );
2008-12-08 17:09:31 +00:00
if ( $blocked ) {
2009-01-19 16:56:41 +00:00
$ubf = new UnblockForm ( $this , $this -> profile );
$ubf -> show ();
2009-01-21 18:03:33 +00:00
} else {
$bf = new BlockForm ( $this , $this -> profile );
$bf -> show ();
2008-12-08 17:09:31 +00:00
}
2009-01-15 22:57:15 +00:00
$this -> elementEnd ( 'li' );
2008-12-08 05:55:11 +00:00
}
2009-01-15 22:57:15 +00:00
$this -> elementEnd ( 'ul' );
2009-01-19 16:56:41 +00:00
$this -> elementEnd ( 'div' );
2008-12-23 19:19:07 +00:00
}
2009-01-19 16:56:41 +00:00
function showRemoteSubscribeLink ()
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
$url = common_local_url ( 'remotesubscribe' ,
2009-01-19 16:56:41 +00:00
array ( 'nickname' => $this -> profile -> nickname ));
2009-01-15 22:57:15 +00:00
$this -> element ( 'a' , array ( 'href' => $url ,
2009-01-23 05:23:28 +00:00
'class' => 'entity_remote_subscribe' ),
2008-12-23 19:19:07 +00:00
_ ( 'Subscribe' ));
}
2009-04-08 00:14:02 +01:00
function showEmptyListMessage ()
{
$message = sprintf ( _ ( 'This is the timeline for %s but %s hasn\'t posted anything yet.' ), $this -> user -> nickname , $this -> user -> nickname ) . ' ' ;
if ( common_logged_in ()) {
$current_user = common_current_user ();
if ( $this -> user -> id === $current_user -> id ) {
$message .= _ ( 'Seen anything interesting recently? You haven\'t posted any notices yet, now would be a good time to start :)' );
} else {
$message .= sprintf ( _ ( 'You can try to nudge %s or [post something to his or her attention](%%%%action.newnotice%%%%?status_textarea=%s).' ), $this -> user -> nickname , '@' . $this -> user -> nickname );
}
}
else {
$message .= sprintf ( _ ( 'Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to his or her attention.' ), $this -> user -> nickname );
}
$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
{
2009-05-18 22:18:57 +01:00
$notice = empty ( $this -> tag )
? $this -> user -> getNotices (( $this -> page - 1 ) * NOTICES_PER_PAGE , NOTICES_PER_PAGE + 1 )
: $this -> user -> getTaggedNotices (( $this -> page - 1 ) * NOTICES_PER_PAGE , NOTICES_PER_PAGE + 1 , 0 , 0 , null , $this -> tag );
2009-01-19 16:56:41 +00:00
$pnl = new ProfileNoticeList ( $notice , $this );
$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
$this -> pagination ( $this -> page > 1 , $cnt > NOTICES_PER_PAGE , $this -> page ,
'showstream' , array ( 'nickname' => $this -> user -> nickname ));
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' ))) {
$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 [Laconica](http://laconi.ca/) tool. ' .
'[Join now](%%%%action.register%%%%) to follow **%s**\'s notices and many more! ([Read more](%%%%doc.help%%%%))' ),
$this -> user -> nickname , $this -> user -> nickname );
} else {
$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 [Laconica](http://laconi.ca/) tool. ' ),
$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 ();
$cloud = new PersonalTagCloudSection ( $this , $this -> user );
$cloud -> show ();
}
2008-12-11 23:12:52 +00:00
}
2008-06-10 15:37:09 +01:00
2009-01-19 16:56:41 +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
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
2008-12-23 19:49:23 +00:00
class ProfileNoticeListItem extends NoticeListItem
{
2008-12-23 19:33:23 +00:00
function showAuthor ()
{
2008-12-11 23:12:52 +00:00
return ;
}
2008-11-16 02:27:35 +00:00
}