2010-07-02 01:48:07 +02:00
< ? php
2016-08-03 12:44:04 +02:00
/**
* @ file mod / notifications . php
* @ brief The notifications module
*/
2018-07-20 04:15:21 +02:00
2017-04-30 06:07:00 +02:00
use Friendica\App ;
2018-01-10 04:42:04 +01:00
use Friendica\Content\ContactSelector ;
2018-01-15 20:51:56 +01:00
use Friendica\Content\Nav ;
2018-10-24 08:15:24 +02:00
use Friendica\Content\Pager ;
2018-01-21 19:33:59 +01:00
use Friendica\Core\L10n ;
2018-08-11 22:40:44 +02:00
use Friendica\Core\Protocol ;
2018-10-31 15:35:50 +01:00
use Friendica\Core\Renderer ;
2017-08-26 09:32:10 +02:00
use Friendica\Core\System ;
2018-07-20 14:19:26 +02:00
use Friendica\Database\DBA ;
2018-10-07 16:34:08 +02:00
use Friendica\Module\Login ;
2019-09-09 22:03:11 +02:00
use Friendica\Model\Contact ;
2019-10-26 02:01:46 +02:00
use Friendica\Model\Notify ;
2010-07-02 01:48:07 +02:00
2018-06-15 07:50:28 +02:00
function notifications_post ( App $a )
{
if ( ! local_user ()) {
2018-10-19 20:11:27 +02:00
$a -> internalRedirect ();
2010-07-02 01:48:07 +02:00
}
2013-12-02 20:30:24 +01:00
2010-08-16 06:49:29 +02:00
$request_id = (( $a -> argc > 1 ) ? $a -> argv [ 1 ] : 0 );
2013-12-02 20:30:24 +01:00
2018-09-07 00:55:06 +02:00
if ( $request_id === 'all' ) {
2010-07-02 01:48:07 +02:00
return ;
2018-06-15 07:50:28 +02:00
}
2010-07-02 01:48:07 +02:00
2018-06-15 07:50:28 +02:00
if ( $request_id ) {
2018-07-20 14:19:26 +02:00
$intro = DBA :: selectFirst ( 'intro' , [ 'id' , 'contact-id' , 'fid' ], [ 'id' => $request_id , 'uid' => local_user ()]);
2013-12-02 20:30:24 +01:00
2018-07-21 14:46:04 +02:00
if ( DBA :: isResult ( $intro )) {
2018-06-15 07:50:28 +02:00
$intro_id = $intro [ 'id' ];
$contact_id = $intro [ 'contact-id' ];
} else {
2018-01-21 19:33:59 +01:00
notice ( L10n :: t ( 'Invalid request identifier.' ) . EOL );
2010-07-02 01:48:07 +02:00
return ;
}
2011-06-27 06:55:24 +02:00
// If it is a friend suggestion, the contact is not a new friend but an existing friend
// that should not be deleted.
2018-06-15 07:50:28 +02:00
$fid = $intro [ 'fid' ];
2011-06-27 06:55:24 +02:00
2018-06-15 07:50:28 +02:00
if ( $_POST [ 'submit' ] == L10n :: t ( 'Discard' )) {
2018-07-20 14:19:26 +02:00
DBA :: delete ( 'intro' , [ 'id' => $intro_id ]);
2018-06-15 07:50:28 +02:00
if ( ! $fid ) {
2019-09-22 12:51:34 +02:00
// When the contact entry had been created just for that intro, we want to get rid of it now
2018-06-15 07:50:28 +02:00
$condition = [ 'id' => $contact_id , 'uid' => local_user (),
2019-09-09 22:39:19 +02:00
'self' => false , 'pending' => true , 'rel' => [ 0 , Contact :: FOLLOWER ]];
2019-09-22 12:51:34 +02:00
$contact_pending = DBA :: exists ( 'contact' , $condition );
// Remove the "pending" to stop the reappearing in any case
DBA :: update ( 'contact' , [ 'pending' => false ], [ 'id' => $contact_id ]);
if ( $contact_pending ) {
2019-09-09 22:03:11 +02:00
Contact :: remove ( $contact_id );
}
2011-06-27 06:55:24 +02:00
}
2018-10-19 20:11:27 +02:00
$a -> internalRedirect ( 'notifications/intros' );
2010-07-02 01:48:07 +02:00
}
2018-06-15 07:50:28 +02:00
if ( $_POST [ 'submit' ] == L10n :: t ( 'Ignore' )) {
2018-07-20 14:19:26 +02:00
DBA :: update ( 'intro' , [ 'ignore' => true ], [ 'id' => $intro_id ]);
2018-10-19 20:11:27 +02:00
$a -> internalRedirect ( 'notifications/intros' );
2010-07-02 01:48:07 +02:00
}
}
}
2018-06-15 07:50:28 +02:00
function notifications_content ( App $a )
{
if ( ! local_user ()) {
2018-01-21 19:33:59 +01:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2018-10-07 16:34:08 +02:00
return Login :: form ();
2010-07-02 01:48:07 +02:00
}
2019-10-15 15:01:17 +02:00
$page = ( $_REQUEST [ 'page' ] ? ? 0 ) ? : 1 ;
2019-10-26 05:03:58 +02:00
$show = isset ( $_REQUEST [ 'show' ]) ? $_REQUEST [ 'show' ] : false ;
2016-08-01 23:04:41 +02:00
2018-01-15 20:51:56 +01:00
Nav :: setSelected ( 'notifications' );
2011-10-12 06:30:23 +02:00
2012-10-15 02:16:25 +02:00
$json = (( $a -> argc > 1 && $a -> argv [ $a -> argc - 1 ] === 'json' ) ? true : false );
2019-10-26 04:03:27 +02:00
/** @var Notify $nm */
$nm = \Friendica\BaseObject :: getClass ( Notify :: class );
2012-10-15 02:16:25 +02:00
2010-08-16 06:49:29 +02:00
$o = '' ;
2016-08-03 12:44:04 +02:00
// Get the nav tabs for the notification pages
2016-07-30 10:51:21 +02:00
$tabs = $nm -> getTabs ();
2018-01-15 14:05:12 +01:00
$notif_content = [];
2018-07-10 14:27:56 +02:00
$notif_nocontent = '' ;
2011-10-12 06:30:23 +02:00
2016-08-03 12:44:04 +02:00
// Notification results per page
2016-08-01 23:04:41 +02:00
$perpage = 20 ;
$startrec = ( $page * $perpage ) - $perpage ;
2013-12-02 20:30:24 +01:00
2018-09-04 19:48:09 +02:00
$notif_header = L10n :: t ( 'Notifications' );
2019-01-07 18:51:48 +01:00
$all = false ;
2016-08-03 12:44:04 +02:00
// Get introductions
2018-01-15 20:51:56 +01:00
if ((( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'intros' )) || (( $a -> argc == 1 ))) {
Nav :: setSelected ( 'introductions' );
2013-12-02 20:30:24 +01:00
2019-09-09 07:29:33 +02:00
$id = 0 ;
if ( ! empty ( $a -> argv [ 2 ]) && intval ( $a -> argv [ 2 ]) != 0 ) {
$id = ( int ) $a -> argv [ 2 ];
}
2016-08-06 18:59:39 +02:00
$all = (( $a -> argc > 2 ) && ( $a -> argv [ 2 ] == 'all' ));
2013-12-02 20:30:24 +01:00
2019-10-26 05:02:14 +02:00
$notifs = $nm -> getIntroList ( $all , $startrec , $perpage , $id );
2011-10-07 08:25:08 +02:00
2016-08-03 12:44:04 +02:00
// Get the network notifications
2018-06-15 07:50:28 +02:00
} elseif (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'network' )) {
2018-01-22 15:16:25 +01:00
$notif_header = L10n :: t ( 'Network Notifications' );
2019-10-26 05:02:14 +02:00
$notifs = $nm -> getNetworkList ( $show , $startrec , $perpage );
2010-07-02 01:48:07 +02:00
2016-08-03 12:44:04 +02:00
// Get the system notifications
2018-06-15 07:50:28 +02:00
} elseif (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'system' )) {
2018-01-22 15:16:25 +01:00
$notif_header = L10n :: t ( 'System Notifications' );
2019-10-26 05:02:14 +02:00
$notifs = $nm -> getSystemList ( $show , $startrec , $perpage );
2011-10-07 08:25:08 +02:00
2016-08-03 12:44:04 +02:00
// Get the personal notifications
2018-06-15 07:50:28 +02:00
} elseif (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'personal' )) {
2018-01-22 15:16:25 +01:00
$notif_header = L10n :: t ( 'Personal Notifications' );
2019-10-26 05:02:14 +02:00
$notifs = $nm -> getPersonalList ( $show , $startrec , $perpage );
2015-10-04 17:18:58 +02:00
2016-08-03 12:44:04 +02:00
// Get the home notifications
2018-06-15 07:50:28 +02:00
} elseif (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'home' )) {
2018-01-22 15:16:25 +01:00
$notif_header = L10n :: t ( 'Home Notifications' );
2019-10-26 05:02:14 +02:00
$notifs = $nm -> getHomeList ( $show , $startrec , $perpage );
2019-05-29 19:54:25 +02:00
// fallback - redirect to main page
} else {
$a -> internalRedirect ( 'notifications' );
2016-08-03 12:44:04 +02:00
}
2012-02-07 01:41:05 +01:00
2016-08-03 12:44:04 +02:00
// Set the pager
2018-10-24 17:50:37 +02:00
$pager = new Pager ( $a -> query_string , $perpage );
2012-02-07 01:41:05 +01:00
2016-08-03 12:44:04 +02:00
// Add additional informations (needed for json output)
2018-10-24 08:15:24 +02:00
$notifs [ 'items_page' ] = $pager -> getItemsPerPage ();
$notifs [ 'page' ] = $pager -> getPage ();
2011-10-07 08:25:08 +02:00
2016-08-03 12:44:04 +02:00
// Json output
2018-01-27 14:25:54 +01:00
if ( intval ( $json ) === 1 ) {
2018-01-27 17:59:10 +01:00
System :: jsonExit ( $notifs );
2018-01-27 14:25:54 +01:00
}
2011-10-07 08:25:08 +02:00
2018-10-31 15:44:06 +01:00
$notif_tpl = Renderer :: getMarkupTemplate ( 'notifications.tpl' );
2011-10-07 08:25:08 +02:00
2018-09-12 01:54:45 +02:00
$notif_show_lnk = [
'href' => ( $show ? 'notifications/' . $notifs [ 'ident' ] : 'notifications/' . $notifs [ 'ident' ] . '?show=all' ),
'text' => ( $show ? L10n :: t ( 'Show unread' ) : L10n :: t ( 'Show all' )),
];
2016-08-03 12:44:04 +02:00
// Process the data for template creation
2019-10-15 15:01:17 +02:00
if (( $notifs [ 'ident' ] ? ? '' ) == 'introductions' ) {
2018-10-31 15:44:06 +01:00
$sugg = Renderer :: getMarkupTemplate ( 'suggestions.tpl' );
$tpl = Renderer :: getMarkupTemplate ( 'intros.tpl' );
2011-10-07 08:25:08 +02:00
2016-08-03 12:44:04 +02:00
// The link to switch between ignored and normal connection requests
2018-01-15 14:05:12 +01:00
$notif_show_lnk = [
2016-08-07 12:26:49 +02:00
'href' => ( ! $all ? 'notifications/intros/all' : 'notifications/intros' ),
2018-01-22 15:16:25 +01:00
'text' => ( ! $all ? L10n :: t ( 'Show Ignored Requests' ) : L10n :: t ( 'Hide Ignored Requests' ))
2018-01-15 14:05:12 +01:00
];
2016-08-03 12:44:04 +02:00
// Loop through all introduction notifications.This creates an array with the output html for each
// introduction
2018-09-07 00:55:06 +02:00
foreach ( $notifs [ 'notifications' ] as $notif ) {
2016-08-03 12:44:04 +02:00
// There are two kind of introduction. Contacts suggested by other contacts and normal connection requests.
// We have to distinguish between these two because they use different data.
2018-09-07 00:55:06 +02:00
switch ( $notif [ 'label' ]) {
2016-08-03 12:44:04 +02:00
case 'friend_suggestion' :
2018-10-31 15:35:50 +01:00
$notif_content [] = Renderer :: replaceMacros ( $sugg , [
2018-09-07 00:55:06 +02:00
'$type' => $notif [ 'label' ],
2018-06-14 17:05:23 +02:00
'$str_notifytype' => L10n :: t ( 'Notification type:' ),
2018-09-07 00:55:06 +02:00
'$notify_type' => $notif [ 'notify_type' ],
'$intro_id' => $notif [ 'intro_id' ],
2018-06-14 17:05:23 +02:00
'$lbl_madeby' => L10n :: t ( 'Suggested by:' ),
2018-09-07 00:55:06 +02:00
'$madeby' => $notif [ 'madeby' ],
'$madeby_url' => $notif [ 'madeby_url' ],
'$madeby_zrl' => $notif [ 'madeby_zrl' ],
'$madeby_addr' => $notif [ 'madeby_addr' ],
'$contact_id' => $notif [ 'contact_id' ],
'$photo' => $notif [ 'photo' ],
'$fullname' => $notif [ 'name' ],
'$url' => $notif [ 'url' ],
'$zrl' => $notif [ 'zrl' ],
'$lbl_url' => L10n :: t ( 'Profile URL' ),
'$addr' => $notif [ 'addr' ],
'$hidden' => [ 'hidden' , L10n :: t ( 'Hide this contact from others' ), ( $notif [ 'hidden' ] == 1 ), '' ],
'$knowyou' => $notif [ 'knowyou' ],
'$approve' => L10n :: t ( 'Approve' ),
'$note' => $notif [ 'note' ],
'$request' => $notif [ 'request' ],
'$ignore' => L10n :: t ( 'Ignore' ),
'$discard' => L10n :: t ( 'Discard' ),
2018-01-15 14:05:12 +01:00
]);
2016-08-03 12:44:04 +02:00
break ;
// Normal connection requests
default :
2018-09-07 00:55:06 +02:00
$friend_selected = (( $notif [ 'network' ] !== Protocol :: OSTATUS ) ? ' checked="checked" ' : ' disabled ' );
$fan_selected = (( $notif [ 'network' ] === Protocol :: OSTATUS ) ? ' checked="checked" disabled ' : '' );
2016-08-03 12:44:04 +02:00
2018-07-10 14:27:56 +02:00
$lbl_knowyou = '' ;
2018-09-07 00:55:06 +02:00
$knowyou = '' ;
$helptext = '' ;
$helptext2 = '' ;
$helptext3 = '' ;
if ( $notif [ 'network' ] === Protocol :: DFRN ) {
$lbl_knowyou = L10n :: t ( 'Claims to be known to you: ' );
$knowyou = (( $notif [ 'knowyou' ]) ? L10n :: t ( 'yes' ) : L10n :: t ( 'no' ));
$helptext = L10n :: t ( 'Shall your connection be bidirectional or not?' );
$helptext2 = L10n :: t ( 'Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed.' , $notif [ 'name' ], $notif [ 'name' ]);
$helptext3 = L10n :: t ( 'Accepting %s as a subscriber allows them to subscribe to your posts, but you will not receive updates from them in your news feed.' , $notif [ 'name' ]);
} elseif ( $notif [ 'network' ] === Protocol :: DIASPORA ) {
$helptext = L10n :: t ( 'Shall your connection be bidirectional or not?' );
$helptext2 = L10n :: t ( 'Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed.' , $notif [ 'name' ], $notif [ 'name' ]);
$helptext3 = L10n :: t ( 'Accepting %s as a sharer allows them to subscribe to your posts, but you will not receive updates from them in your news feed.' , $notif [ 'name' ]);
2015-04-04 18:02:26 +02:00
}
2018-10-31 15:44:06 +01:00
$dfrn_tpl = Renderer :: getMarkupTemplate ( 'netfriend.tpl' );
2018-10-31 15:35:50 +01:00
$dfrn_text = Renderer :: replaceMacros ( $dfrn_tpl , [
2018-09-07 00:55:06 +02:00
'$intro_id' => $notif [ 'intro_id' ],
2011-10-07 08:25:08 +02:00
'$friend_selected' => $friend_selected ,
2018-09-07 00:55:06 +02:00
'$fan_selected' => $fan_selected ,
2017-02-26 16:47:11 +01:00
'$approve_as1' => $helptext ,
'$approve_as2' => $helptext2 ,
2017-03-03 10:28:29 +01:00
'$approve_as3' => $helptext3 ,
2018-09-07 00:55:06 +02:00
'$as_friend' => L10n :: t ( 'Friend' ),
'$as_fan' => (( $notif [ 'network' ] == Protocol :: DIASPORA ) ? L10n :: t ( 'Sharer' ) : L10n :: t ( 'Subscriber' ))
2018-01-15 14:05:12 +01:00
]);
2014-07-22 00:36:20 +02:00
2019-05-06 07:46:13 +02:00
$contact = DBA :: selectFirst ( 'contact' , [ 'network' , 'protocol' ], [ 'id' => $notif [ 'contact_id' ]]);
if (( $contact [ 'network' ] != Protocol :: DFRN ) || ( $contact [ 'protocol' ] == Protocol :: ACTIVITYPUB )) {
$action = 'follow_confirm' ;
} else {
$action = 'dfrn_confirm' ;
}
2018-09-07 00:55:06 +02:00
$header = $notif [ 'name' ];
2014-07-22 00:36:20 +02:00
2018-09-07 00:55:06 +02:00
if ( $notif [ 'addr' ] != '' ) {
$header .= ' <' . $notif [ 'addr' ] . '>' ;
2018-06-15 07:50:28 +02:00
}
2014-07-22 00:36:20 +02:00
2018-09-07 00:55:06 +02:00
$header .= ' (' . ContactSelector :: networkToName ( $notif [ 'network' ], $notif [ 'url' ]) . ')' ;
2012-02-23 08:34:30 +01:00
2018-09-07 00:55:06 +02:00
if ( $notif [ 'network' ] != Protocol :: DIASPORA ) {
2018-01-22 15:16:25 +01:00
$discard = L10n :: t ( 'Discard' );
2017-04-28 10:36:10 +02:00
} else {
$discard = '' ;
}
2018-10-31 15:35:50 +01:00
$notif_content [] = Renderer :: replaceMacros ( $tpl , [
2018-09-07 00:55:06 +02:00
'$type' => $notif [ 'label' ],
2018-12-25 13:30:27 +01:00
'$header' => $header ,
2018-06-14 17:05:23 +02:00
'$str_notifytype' => L10n :: t ( 'Notification type:' ),
2018-09-07 00:55:06 +02:00
'$notify_type' => $notif [ 'notify_type' ],
'$dfrn_text' => $dfrn_text ,
'$dfrn_id' => $notif [ 'dfrn_id' ],
'$uid' => $notif [ 'uid' ],
'$intro_id' => $notif [ 'intro_id' ],
'$contact_id' => $notif [ 'contact_id' ],
'$photo' => $notif [ 'photo' ],
'$fullname' => $notif [ 'name' ],
'$location' => $notif [ 'location' ],
'$lbl_location' => L10n :: t ( 'Location:' ),
'$about' => $notif [ 'about' ],
'$lbl_about' => L10n :: t ( 'About:' ),
'$keywords' => $notif [ 'keywords' ],
'$lbl_keywords' => L10n :: t ( 'Tags:' ),
'$gender' => $notif [ 'gender' ],
'$lbl_gender' => L10n :: t ( 'Gender:' ),
'$hidden' => [ 'hidden' , L10n :: t ( 'Hide this contact from others' ), ( $notif [ 'hidden' ] == 1 ), '' ],
'$url' => $notif [ 'url' ],
'$zrl' => $notif [ 'zrl' ],
'$lbl_url' => L10n :: t ( 'Profile URL' ),
'$addr' => $notif [ 'addr' ],
2016-08-03 12:44:04 +02:00
'$lbl_knowyou' => $lbl_knowyou ,
2018-01-22 15:16:25 +01:00
'$lbl_network' => L10n :: t ( 'Network:' ),
2018-09-07 00:55:06 +02:00
'$network' => ContactSelector :: networkToName ( $notif [ 'network' ], $notif [ 'url' ]),
'$knowyou' => $knowyou ,
'$approve' => L10n :: t ( 'Approve' ),
'$note' => $notif [ 'note' ],
'$ignore' => L10n :: t ( 'Ignore' ),
'$discard' => $discard ,
2019-05-06 07:46:13 +02:00
'$action' => $action ,
2018-01-15 14:05:12 +01:00
]);
2016-08-03 12:44:04 +02:00
break ;
2012-02-23 08:34:30 +01:00
}
}
2014-07-22 00:36:20 +02:00
2018-06-15 07:50:28 +02:00
if ( count ( $notifs [ 'notifications' ]) == 0 ) {
2018-01-21 19:33:59 +01:00
info ( L10n :: t ( 'No introductions.' ) . EOL );
2018-06-15 07:50:28 +02:00
}
2014-07-22 00:36:20 +02:00
2018-09-07 00:55:06 +02:00
// Normal notifications (no introductions)
2018-09-04 19:48:09 +02:00
} elseif ( ! empty ( $notifs [ 'notifications' ])) {
2016-08-03 12:44:04 +02:00
// Loop trough ever notification This creates an array with the output html for each
// notification and apply the correct template according to the notificationtype (label).
2018-09-07 00:55:06 +02:00
foreach ( $notifs [ 'notifications' ] as $notif ) {
2018-09-07 17:15:23 +02:00
$notification_templates = [
'like' => 'notifications_likes_item.tpl' ,
'dislike' => 'notifications_dislikes_item.tpl' ,
'attend' => 'notifications_attend_item.tpl' ,
'attendno' => 'notifications_attend_item.tpl' ,
'attendmaybe' => 'notifications_attend_item.tpl' ,
'friend' => 'notifications_friends_item.tpl' ,
'comment' => 'notifications_comments_item.tpl' ,
'post' => 'notifications_posts_item.tpl' ,
'notify' => 'notify.tpl' ,
];
2018-10-31 15:44:06 +01:00
$tpl_notif = Renderer :: getMarkupTemplate ( $notification_templates [ $notif [ 'label' ]]);
2016-08-03 12:44:04 +02:00
2018-10-31 15:35:50 +01:00
$notif_content [] = Renderer :: replaceMacros ( $tpl_notif , [
2018-09-07 00:55:06 +02:00
'$item_label' => $notif [ 'label' ],
'$item_link' => $notif [ 'link' ],
'$item_image' => $notif [ 'image' ],
'$item_url' => $notif [ 'url' ],
'$item_text' => $notif [ 'text' ],
'$item_when' => $notif [ 'when' ],
'$item_ago' => $notif [ 'ago' ],
'$item_seen' => $notif [ 'seen' ],
2018-01-15 14:05:12 +01:00
]);
2011-12-01 07:26:02 +01:00
}
2018-09-07 00:42:57 +02:00
} else {
$notif_nocontent = L10n :: t ( 'No more %s notifications.' , $notifs [ 'ident' ]);
2010-07-02 01:48:07 +02:00
}
2018-10-31 15:35:50 +01:00
$o .= Renderer :: replaceMacros ( $notif_tpl , [
2018-09-07 00:55:06 +02:00
'$notif_header' => $notif_header ,
'$tabs' => $tabs ,
'$notif_content' => $notif_content ,
2016-07-27 21:07:54 +02:00
'$notif_nocontent' => $notif_nocontent ,
2018-09-07 00:55:06 +02:00
'$notif_show_lnk' => $notif_show_lnk ,
2018-10-24 08:15:24 +02:00
'$notif_paginate' => $pager -> renderMinimal ( count ( $notif_content ))
2018-01-15 14:05:12 +01:00
]);
2016-07-28 11:39:09 +02:00
2010-07-02 01:48:07 +02:00
return $o ;
2011-01-04 14:46:08 +01:00
}