2010-07-01 19:48:07 -04:00
< ? php
2016-08-03 06:44:04 -04:00
/**
* @ file mod / notifications . php
* @ brief The notifications module
*/
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2018-01-09 22:42:04 -05:00
use Friendica\Content\ContactSelector ;
2017-11-07 19:37:53 -05:00
use Friendica\Core\NotificationsManager ;
2017-08-26 03:32:10 -04:00
use Friendica\Core\System ;
2017-11-07 22:57:46 -05:00
use Friendica\Database\DBM ;
2017-04-30 00:07:00 -04:00
2018-01-09 22:42:04 -05:00
require_once " include/network.php " ;
2010-07-01 19:48:07 -04:00
2017-01-09 07:14:25 -05:00
function notifications_post ( App $a ) {
2010-07-01 19:48:07 -04:00
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl ());
2010-07-01 19:48:07 -04:00
}
2013-12-02 14:30:24 -05:00
2010-08-16 00:49:29 -04:00
$request_id = (( $a -> argc > 1 ) ? $a -> argv [ 1 ] : 0 );
2013-12-02 14:30:24 -05:00
2017-03-21 12:02:59 -04:00
if ( $request_id === " all " )
2010-07-01 19:48:07 -04:00
return ;
2017-03-21 12:02:59 -04:00
if ( $request_id ) {
2010-07-01 19:48:07 -04:00
2011-06-27 00:55:24 -04:00
$r = q ( " SELECT * FROM `intro` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $request_id ),
intval ( local_user ())
2010-07-01 19:48:07 -04:00
);
2013-12-02 14:30:24 -05:00
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $r )) {
2010-07-01 19:48:07 -04:00
$intro_id = $r [ 0 ][ 'id' ];
2010-11-06 20:01:57 -04:00
$contact_id = $r [ 0 ][ 'contact-id' ];
2010-07-01 19:48:07 -04:00
}
else {
2010-08-16 00:49:29 -04:00
notice ( t ( 'Invalid request identifier.' ) . EOL );
2010-07-01 19:48:07 -04:00
return ;
}
2011-06-27 00:55:24 -04:00
// If it is a friend suggestion, the contact is not a new friend but an existing friend
// that should not be deleted.
$fid = $r [ 0 ][ 'fid' ];
2017-03-21 12:02:59 -04:00
if ( $_POST [ 'submit' ] == t ( 'Discard' )) {
2014-03-11 18:52:32 -04:00
$r = q ( " DELETE FROM `intro` WHERE `id` = %d " ,
2010-09-08 23:14:17 -04:00
intval ( $intro_id )
2013-12-02 14:30:24 -05:00
);
2017-03-21 12:02:59 -04:00
if ( ! $fid ) {
2012-03-30 18:10:50 -04:00
// The check for blocked and pending is in case the friendship was already approved
// and we just want to get rid of the now pointless notification
2014-03-11 18:52:32 -04:00
$r = q ( " DELETE FROM `contact` WHERE `id` = %d AND `uid` = %d AND `self` = 0 AND `blocked` = 1 AND `pending` = 1 " ,
2011-06-27 00:55:24 -04:00
intval ( $contact_id ),
intval ( local_user ())
);
}
2016-02-17 17:47:32 -05:00
goaway ( 'notifications/intros' );
2010-07-01 19:48:07 -04:00
}
2017-03-21 12:02:59 -04:00
if ( $_POST [ 'submit' ] == t ( 'Ignore' )) {
2013-12-02 14:30:24 -05:00
$r = q ( " UPDATE `intro` SET `ignore` = 1 WHERE `id` = %d " ,
2010-07-01 19:48:07 -04:00
intval ( $intro_id ));
2016-02-17 17:47:32 -05:00
goaway ( 'notifications/intros' );
2010-07-01 19:48:07 -04:00
}
}
}
2017-01-09 07:14:25 -05:00
function notifications_content ( App $a ) {
2010-07-01 19:48:07 -04:00
2016-12-20 05:56:34 -05:00
if ( ! local_user ()) {
2010-08-16 00:49:29 -04:00
notice ( t ( 'Permission denied.' ) . EOL );
2011-08-02 00:02:25 -04:00
return ;
2010-07-01 19:48:07 -04:00
}
2016-08-01 17:04:41 -04:00
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] : 1 );
2016-08-01 12:18:11 -04:00
$show = ( x ( $_REQUEST , 'show' ) ? $_REQUEST [ 'show' ] : 0 );
2016-08-01 17:04:41 -04:00
2013-12-02 14:30:24 -05:00
nav_set_selected ( 'notifications' );
2011-10-12 00:30:23 -04:00
2012-10-14 20:16:25 -04:00
$json = (( $a -> argc > 1 && $a -> argv [ $a -> argc - 1 ] === 'json' ) ? true : false );
2016-07-30 04:51:21 -04:00
$nm = new NotificationsManager ();
2012-10-14 20:16:25 -04:00
2010-08-16 00:49:29 -04:00
$o = '' ;
2016-08-03 06:44:04 -04:00
// Get the nav tabs for the notification pages
2016-07-30 04:51:21 -04:00
$tabs = $nm -> getTabs ();
2016-07-27 13:53:22 -04:00
$notif_content = array ();
2011-10-12 00:30:23 -04:00
2016-08-03 06:44:04 -04:00
// Notification results per page
2016-08-01 17:04:41 -04:00
$perpage = 20 ;
$startrec = ( $page * $perpage ) - $perpage ;
2013-12-02 14:30:24 -05:00
2016-08-03 06:44:04 -04:00
// Get introductions
2017-03-21 12:02:59 -04:00
if ( (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'intros' )) || (( $a -> argc == 1 ))) {
2011-10-12 00:30:23 -04:00
nav_set_selected ( 'introductions' );
2016-08-03 06:44:04 -04:00
$notif_header = t ( 'Notifications' );
2013-12-02 14:30:24 -05:00
2016-08-06 12:59:39 -04:00
$all = (( $a -> argc > 2 ) && ( $a -> argv [ 2 ] == 'all' ));
2013-12-02 14:30:24 -05:00
2016-08-03 06:44:04 -04:00
$notifs = $nm -> introNotifs ( $all , $startrec , $perpage );
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
// Get the network notifications
2017-03-21 12:02:59 -04:00
} else if (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'network' )) {
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
$notif_header = t ( 'Network Notifications' );
$notifs = $nm -> networkNotifs ( $show , $startrec , $perpage );
2010-07-01 19:48:07 -04:00
2016-08-03 06:44:04 -04:00
// Get the system notifications
2017-03-21 12:02:59 -04:00
} else if (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'system' )) {
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
$notif_header = t ( 'System Notifications' );
$notifs = $nm -> systemNotifs ( $show , $startrec , $perpage );
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
// Get the personal notifications
2017-03-21 12:02:59 -04:00
} else if (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'personal' )) {
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
$notif_header = t ( 'Personal Notifications' );
$notifs = $nm -> personalNotifs ( $show , $startrec , $perpage );
2015-10-04 11:18:58 -04:00
2016-08-03 06:44:04 -04:00
// Get the home notifications
2017-03-21 12:02:59 -04:00
} else if (( $a -> argc > 1 ) && ( $a -> argv [ 1 ] == 'home' )) {
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
$notif_header = t ( 'Home Notifications' );
$notifs = $nm -> homeNotifs ( $show , $startrec , $perpage );
2012-12-22 14:57:29 -05:00
2016-08-03 06:44:04 -04:00
}
2012-02-06 19:41:05 -05:00
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
// Set the pager
$a -> set_pager_total ( $notifs [ 'total' ]);
$a -> set_pager_itemspage ( $perpage );
2012-02-06 19:41:05 -05:00
2016-08-03 06:44:04 -04:00
// Add additional informations (needed for json output)
$notifs [ 'items_page' ] = $a -> pager [ 'itemspage' ];
$notifs [ 'page' ] = $a -> pager [ 'page' ];
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
// Json output
2017-03-21 12:02:59 -04:00
if ( intval ( $json ) === 1 )
2016-08-03 06:44:04 -04:00
json_return_and_die ( $notifs );
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
$notif_tpl = get_markup_template ( 'notifications.tpl' );
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
// Process the data for template creation
2017-03-21 12:02:59 -04:00
if ( $notifs [ 'ident' ] === 'introductions' ) {
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
$sugg = get_markup_template ( 'suggestions.tpl' );
$tpl = get_markup_template ( " intros.tpl " );
2011-10-07 02:25:08 -04:00
2016-08-03 06:44:04 -04:00
// The link to switch between ignored and normal connection requests
$notif_show_lnk = array (
2016-08-07 06:26:49 -04:00
'href' => ( ! $all ? 'notifications/intros/all' : 'notifications/intros' ),
'text' => ( ! $all ? t ( 'Show Ignored Requests' ) : t ( 'Hide Ignored Requests' ))
2016-08-03 06:44:04 -04:00
);
// Loop through all introduction notifications.This creates an array with the output html for each
// introduction
foreach ( $notifs [ 'notifications' ] as $it ) {
// 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.
switch ( $it [ 'label' ]) {
case 'friend_suggestion' :
$notif_content [] = replace_macros ( $sugg , array (
'$str_notifytype' => t ( 'Notification type: ' ),
'$notify_type' => $it [ 'notify_type' ],
'$intro_id' => $it [ 'intro_id' ],
'$madeby' => sprintf ( t ( 'suggested by %s' ), $it [ 'madeby' ]),
'$contact_id' => $it [ 'contact-id' ],
'$photo' => $it [ 'photo' ],
'$fullname' => $it [ 'name' ],
'$url' => $it [ 'url' ],
'$hidden' => array ( 'hidden' , t ( 'Hide this contact from others' ), ( $it [ 'hidden' ] == 1 ), '' ),
'$activity' => array ( 'activity' , t ( 'Post a new friend activity' ), $it [ 'post_newfriend' ], t ( 'if applicable' )),
'$knowyou' => $it [ 'knowyou' ],
'$approve' => t ( 'Approve' ),
'$note' => $it [ 'note' ],
'$request' => $it [ 'request' ],
'$ignore' => t ( 'Ignore' ),
'$discard' => t ( 'Discard' ),
));
break ;
// Normal connection requests
default :
$friend_selected = (( $it [ 'network' ] !== NETWORK_OSTATUS ) ? ' checked="checked" ' : ' disabled ' );
$fan_selected = (( $it [ 'network' ] === NETWORK_OSTATUS ) ? ' checked="checked" disabled ' : '' );
$dfrn_tpl = get_markup_template ( 'netfriend.tpl' );
$knowyou = '' ;
$dfrn_text = '' ;
2017-03-21 12:02:59 -04:00
if ( $it [ 'network' ] === NETWORK_DFRN || $it [ 'network' ] === NETWORK_DIASPORA ) {
if ( $it [ 'network' ] === NETWORK_DFRN ) {
2016-08-03 06:44:04 -04:00
$lbl_knowyou = t ( 'Claims to be known to you: ' );
$knowyou = (( $it [ 'knowyou' ]) ? t ( 'yes' ) : t ( 'no' ));
2017-02-26 10:47:11 -05:00
$helptext = t ( 'Shall your connection be bidirectional or not?' );
2017-03-03 04:28:29 -05:00
$helptext2 = sprintf ( 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.' ), $it [ 'name' ], $it [ 'name' ]);
$helptext3 = sprintf ( 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.' ), $it [ 'name' ]);
2016-08-03 06:44:04 -04:00
} else {
$knowyou = '' ;
2017-02-26 10:47:11 -05:00
$helptext = t ( 'Shall your connection be bidirectional or not?' );
2017-03-03 04:28:29 -05:00
$helptext2 = sprintf ( 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.' ), $it [ 'name' ], $it [ 'name' ]);
$helptext3 = sprintf ( 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.' ), $it [ 'name' ]);
2016-08-03 06:44:04 -04:00
}
2015-04-04 12:02:26 -04:00
}
2011-10-07 02:25:08 -04:00
$dfrn_text = replace_macros ( $dfrn_tpl , array (
2016-08-03 06:44:04 -04:00
'$intro_id' => $it [ 'intro_id' ],
2011-10-07 02:25:08 -04:00
'$friend_selected' => $friend_selected ,
'$fan_selected' => $fan_selected ,
2017-02-26 10:47:11 -05:00
'$approve_as1' => $helptext ,
'$approve_as2' => $helptext2 ,
2017-03-03 04:28:29 -05:00
'$approve_as3' => $helptext3 ,
2011-10-07 02:25:08 -04:00
'$as_friend' => t ( 'Friend' ),
2017-02-26 10:47:11 -05:00
'$as_fan' => (( $it [ 'network' ] == NETWORK_DIASPORA ) ? t ( 'Sharer' ) : t ( 'Subscriber' ))
2011-10-07 02:25:08 -04:00
));
2014-07-21 18:36:20 -04:00
2016-08-03 06:44:04 -04:00
$header = $it [ " name " ];
2014-07-21 18:36:20 -04:00
2016-08-03 06:44:04 -04:00
if ( $it [ " addr " ] != " " )
$header .= " < " . $it [ " addr " ] . " > " ;
2014-07-21 18:36:20 -04:00
2018-01-09 22:42:04 -05:00
$header .= " ( " . ContactSelector :: networkToName ( $it [ 'network' ], $it [ 'url' ]) . " ) " ;
2012-02-23 02:34:30 -05:00
2017-04-28 04:36:10 -04:00
if ( $it [ 'network' ] != NETWORK_DIASPORA ) {
$discard = t ( 'Discard' );
} else {
$discard = '' ;
}
2016-08-03 06:44:04 -04:00
$notif_content [] = replace_macros ( $tpl , array (
'$header' => htmlentities ( $header ),
'$str_notifytype' => t ( 'Notification type: ' ),
'$notify_type' => $it [ 'notify_type' ],
'$dfrn_text' => $dfrn_text ,
'$dfrn_id' => $it [ 'dfrn_id' ],
'$uid' => $it [ 'uid' ],
'$intro_id' => $it [ 'intro_id' ],
'$contact_id' => $it [ 'contact_id' ],
'$photo' => $it [ 'photo' ],
'$fullname' => $it [ 'name' ],
'$location' => $it [ 'location' ],
'$lbl_location' => t ( 'Location:' ),
'$about' => $it [ 'about' ],
'$lbl_about' => t ( 'About:' ),
'$keywords' => $it [ 'keywords' ],
'$lbl_keywords' => t ( 'Tags:' ),
'$gender' => $it [ 'gender' ],
'$lbl_gender' => t ( 'Gender:' ),
'$hidden' => array ( 'hidden' , t ( 'Hide this contact from others' ), ( $it [ 'hidden' ] == 1 ), '' ),
'$activity' => array ( 'activity' , t ( 'Post a new friend activity' ), $it [ 'post_newfriend' ], t ( 'if applicable' )),
'$url' => $it [ 'url' ],
'$zrl' => $it [ 'zrl' ],
'$lbl_url' => t ( 'Profile URL' ),
'$addr' => $it [ 'addr' ],
'$lbl_knowyou' => $lbl_knowyou ,
'$lbl_network' => t ( 'Network:' ),
2018-01-09 22:42:04 -05:00
'$network' => ContactSelector :: networkToName ( $it [ 'network' ], $it [ 'url' ]),
2016-08-03 06:44:04 -04:00
'$knowyou' => $knowyou ,
'$approve' => t ( 'Approve' ),
'$note' => $it [ 'note' ],
'$ignore' => t ( 'Ignore' ),
2017-04-28 04:36:10 -04:00
'$discard' => $discard ,
2014-07-21 18:36:20 -04:00
2016-08-03 06:44:04 -04:00
));
break ;
2012-02-23 02:34:30 -05:00
}
}
2014-07-21 18:36:20 -04:00
2017-03-21 12:02:59 -04:00
if ( $notifs [ 'total' ] == 0 )
2016-08-03 06:44:04 -04:00
info ( t ( 'No introductions.' ) . EOL );
2014-07-21 18:36:20 -04:00
2016-08-03 06:44:04 -04:00
// Normal notifications (no introductions)
} else {
2016-08-01 17:04:41 -04:00
2016-08-01 12:18:11 -04:00
// The template files we need in different cases for formatting the content
$tpl_item_like = 'notifications_likes_item.tpl' ;
$tpl_item_dislike = 'notifications_dislikes_item.tpl' ;
2016-08-01 18:01:43 -04:00
$tpl_item_attend = 'notifications_attend_item.tpl' ;
$tpl_item_attendno = 'notifications_attend_item.tpl' ;
$tpl_item_attendmaybe = 'notifications_attend_item.tpl' ;
2016-08-01 12:18:11 -04:00
$tpl_item_friend = 'notifications_friends_item.tpl' ;
$tpl_item_comment = 'notifications_comments_item.tpl' ;
$tpl_item_post = 'notifications_posts_item.tpl' ;
$tpl_item_notify = 'notify.tpl' ;
2016-08-03 06:44:04 -04: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).
2016-08-01 12:18:11 -04:00
foreach ( $notifs [ 'notifications' ] as $it ) {
2016-08-03 06:44:04 -04:00
// We use the notification label to get the correct template file
$tpl_var_name = 'tpl_item_' . $it [ 'label' ];
$tpl_notif = get_markup_template ( $$tpl_var_name );
$notif_content [] = replace_macros ( $tpl_notif , array (
2016-08-01 12:18:11 -04:00
'$item_label' => $it [ 'label' ],
'$item_link' => $it [ 'link' ],
'$item_image' => $it [ 'image' ],
2016-12-21 17:17:55 -05:00
'$item_url' => $it [ 'url' ],
2017-04-18 19:34:46 -04:00
'$item_text' => $it [ 'text' ],
2016-08-01 12:18:11 -04:00
'$item_when' => $it [ 'when' ],
2016-12-21 18:28:52 -05:00
'$item_ago' => $it [ 'ago' ],
2016-08-01 12:18:11 -04:00
'$item_seen' => $it [ 'seen' ],
));
2011-12-01 01:26:02 -05:00
}
2014-07-21 18:36:20 -04:00
2016-08-03 06:44:04 -04:00
// It doesn't make sense to show the Show unread / Show all link visible if the user is on the
// "Show all" page and there are no notifications. So we will hide it.
2017-03-21 12:02:59 -04:00
if ( $show == 0 || intval ( $show ) && $notifs [ 'total' ] > 0 ) {
2016-08-03 06:44:04 -04:00
$notif_show_lnk = array (
'href' => ( $show ? 'notifications/' . $notifs [ 'ident' ] : 'notifications/' . $notifs [ 'ident' ] . '?show=all' ),
'text' => ( $show ? t ( 'Show unread' ) : t ( 'Show all' )),
);
2011-10-07 02:25:08 -04:00
}
2014-07-21 18:36:20 -04:00
2016-08-03 06:44:04 -04:00
// Output if there aren't any notifications available
2017-03-21 12:02:59 -04:00
if ( $notifs [ 'total' ] == 0 )
2016-08-03 06:44:04 -04:00
$notif_nocontent = sprintf ( t ( 'No more %s notifications.' ), $notifs [ 'ident' ]);
2010-07-01 19:48:07 -04:00
}
2016-07-27 15:07:54 -04:00
$o .= replace_macros ( $notif_tpl , array (
'$notif_header' => $notif_header ,
'$tabs' => $tabs ,
'$notif_content' => $notif_content ,
'$notif_nocontent' => $notif_nocontent ,
2016-08-01 12:18:11 -04:00
'$notif_show_lnk' => $notif_show_lnk ,
2016-08-01 17:04:41 -04:00
'$notif_paginate' => paginate ( $a )
2016-07-27 15:07:54 -04:00
));
2016-07-28 05:39:09 -04:00
2010-07-01 19:48:07 -04:00
return $o ;
2011-01-04 08:46:08 -05:00
}