2011-12-08 10:28:27 +01:00
< ? php
2017-11-20 21:37:30 +01:00
/**
* @ file include / enotify . php
*/
2018-01-25 03:08:45 +01:00
2018-02-15 03:33:55 +01:00
use Friendica\Content\Text\BBCode ;
2018-12-26 07:06:24 +01:00
use Friendica\Core\Hook ;
2018-10-29 22:20:46 +01:00
use Friendica\Core\Logger ;
2018-10-31 15:35:50 +01:00
use Friendica\Core\Renderer ;
2017-08-26 08:04:21 +02:00
use Friendica\Core\System ;
2018-07-20 14:19:26 +02:00
use Friendica\Database\DBA ;
2019-12-16 00:47:24 +01:00
use Friendica\DI ;
2018-07-20 04:15:21 +02:00
use Friendica\Model\Item ;
2020-01-08 22:48:59 +01:00
use Friendica\Model\ItemContent ;
2020-01-26 20:30:24 +01:00
use Friendica\Model\Notify ;
2019-01-21 17:38:01 +01:00
use Friendica\Model\User ;
2020-01-06 01:59:18 +01:00
use Friendica\Model\UserItem ;
2019-10-24 00:25:43 +02:00
use Friendica\Protocol\Activity ;
2017-04-30 06:07:00 +02:00
2016-05-21 13:19:30 +02:00
/**
2020-01-19 07:05:23 +01:00
* Creates a notification entry and possibly sends a mail
2016-05-21 13:19:30 +02:00
*
* @ param array $params Array with the elements :
2019-01-07 16:24:06 +01:00
* uid , item , parent , type , otype , verb , event ,
* link , subject , body , to_name , to_email , source_name ,
* source_link , activity , preamble , notify_flags ,
* language , show_in_notification_page
2019-01-21 17:36:01 +01:00
* @ return bool
2019-01-07 16:24:06 +01:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2016-05-21 13:19:30 +02:00
*/
2018-01-04 03:12:19 +01:00
function notification ( $params )
{
2020-02-04 22:30:34 +01:00
/** @var string the common prefix of a notification subject */
2020-02-05 22:22:12 +01:00
$subjectPrefix = DI :: l10n () -> t ( '[Friendica:Notify]' );
2020-02-04 22:30:34 +01:00
2018-08-02 07:21:01 +02:00
// Temporary logging for finding the origin
2019-02-23 05:00:16 +01:00
if ( ! isset ( $params [ 'uid' ])) {
Logger :: notice ( 'Missing parameters "uid".' , [ 'params' => $params , 'callstack' => System :: callstack ()]);
2018-08-02 07:21:01 +02:00
}
2018-08-23 10:00:25 +02:00
// Ensure that the important fields are set at any time
$fields = [ 'notify-flags' , 'language' , 'username' , 'email' ];
$user = DBA :: selectFirst ( 'user' , $fields , [ 'uid' => $params [ 'uid' ]]);
if ( ! DBA :: isResult ( $user )) {
2019-02-23 05:00:16 +01:00
Logger :: error ( 'Unknown user' , [ 'uid' => $params [ 'uid' ]]);
2019-01-21 17:36:01 +01:00
return false ;
2018-08-23 10:00:25 +02:00
}
2019-10-16 14:43:59 +02:00
$params [ 'notify_flags' ] = ( $params [ 'notify_flags' ] ? ? '' ) ? : $user [ 'notify-flags' ];
$params [ 'language' ] = ( $params [ 'language' ] ? ? '' ) ? : $user [ 'language' ];
$params [ 'to_name' ] = ( $params [ 'to_name' ] ? ? '' ) ? : $user [ 'username' ];
$params [ 'to_email' ] = ( $params [ 'to_email' ] ? ? '' ) ? : $user [ 'email' ];
2018-08-23 10:00:25 +02:00
2012-03-26 10:43:26 +02:00
// from here on everything is in the recipients language
2020-01-18 20:54:15 +01:00
$l10n = DI :: l10n () -> withLang ( $params [ 'language' ]);
2012-03-26 10:43:26 +02:00
2019-12-30 23:02:20 +01:00
$siteurl = DI :: baseUrl () -> get ( true );
2020-01-19 21:21:13 +01:00
$sitename = DI :: config () -> get ( 'config' , 'sitename' );
2014-09-06 18:15:18 +02:00
2019-12-16 00:47:24 +01:00
$hostname = DI :: baseUrl () -> getHostname ();
2018-01-04 03:12:19 +01:00
if ( strpos ( $hostname , ':' )) {
2016-05-21 13:19:30 +02:00
$hostname = substr ( $hostname , 0 , strpos ( $hostname , ':' ));
2018-01-04 03:12:19 +01:00
}
2015-04-16 07:18:06 +02:00
2020-02-02 08:45:10 +01:00
$user = User :: getById ( $params [ 'uid' ], [ 'nickname' , 'page-flags' ]);
2017-08-12 07:08:45 +02:00
2020-02-01 20:08:54 +01:00
// There is no need to create notifications for forum accounts
if ( ! DBA :: isResult ( $user ) || in_array ( $user [ " page-flags " ], [ User :: PAGE_FLAGS_COMMUNITY , User :: PAGE_FLAGS_PRVGROUP ])) {
return false ;
2017-08-12 07:08:45 +02:00
}
2020-02-01 20:08:54 +01:00
$nickname = $user [ " nickname " ];
2014-12-23 00:55:36 +01:00
2014-09-06 18:15:18 +02:00
// with $params['show_in_notification_page'] == false, the notification isn't inserted into
// the database, and an email is sent if applicable.
// default, if not specified: true
2018-10-14 17:30:39 +02:00
$show_in_notification_page = isset ( $params [ 'show_in_notification_page' ]) ? $params [ 'show_in_notification_page' ] : true ;
2014-09-06 18:15:18 +02:00
2020-02-03 00:07:22 +01:00
$additional_mail_header = " X-Friendica-Account: < " . $nickname . " @ " . $hostname . " > \n " ;
2014-09-06 18:15:18 +02:00
2016-05-21 13:19:30 +02:00
if ( array_key_exists ( 'item' , $params )) {
2011-12-27 00:47:40 +01:00
$title = $params [ 'item' ][ 'title' ];
$body = $params [ 'item' ][ 'body' ];
2018-01-04 03:12:19 +01:00
} else {
2011-12-27 00:47:40 +01:00
$title = $body = '' ;
2018-01-04 03:12:19 +01:00
}
2011-12-24 08:07:05 +01:00
2018-01-04 03:12:19 +01:00
if ( isset ( $params [ 'item' ][ 'id' ])) {
2015-04-16 07:18:06 +02:00
$item_id = $params [ 'item' ][ 'id' ];
2018-01-04 03:12:19 +01:00
} else {
2015-04-16 07:18:06 +02:00
$item_id = 0 ;
2018-01-04 03:12:19 +01:00
}
2015-04-16 07:18:06 +02:00
2018-01-04 03:12:19 +01:00
if ( isset ( $params [ 'parent' ])) {
2015-04-14 06:54:41 +02:00
$parent_id = $params [ 'parent' ];
2018-01-04 03:12:19 +01:00
} else {
2015-04-14 06:54:41 +02:00
$parent_id = 0 ;
2018-01-04 03:12:19 +01:00
}
2015-04-14 06:54:41 +02:00
2018-08-02 07:21:01 +02:00
$epreamble = '' ;
2019-01-07 18:51:48 +01:00
$preamble = '' ;
$subject = '' ;
$sitelink = '' ;
$tsitelink = '' ;
$hsitelink = '' ;
$itemlink = '' ;
2018-08-02 07:21:01 +02:00
2020-02-04 22:10:19 +01:00
if ( $params [ 'type' ] == Notify\Type :: MAIL ) {
2018-07-10 14:27:56 +02:00
$itemlink = $siteurl . '/message/' . $params [ 'item' ][ 'id' ];
2018-07-31 18:39:23 +02:00
$params [ " link " ] = $itemlink ;
2018-07-10 14:27:56 +02:00
2020-02-09 22:42:51 +01:00
$subject = $l10n -> t ( '%s New mail received at %s' , $subjectPrefix , $sitename );
2011-12-24 08:07:05 +01:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%1$s sent you a new private message at %2$s.' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%1$s sent you %2$s.' , '[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' , '[url=' . $itemlink . ']' . $l10n -> t ( 'a private message' ) . '[/url]' );
2011-12-24 08:07:05 +01:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to your private messages.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl . '/message/' . $params [ 'item' ][ 'id' ]);
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '/message/' . $params [ 'item' ][ 'id' ] . '">' . $sitename . '</a>' );
2011-12-26 23:16:25 +01:00
}
2020-02-04 22:13:06 +01:00
if ( $params [ 'type' ] == Notify\Type :: COMMENT || $params [ 'type' ] == Notify\Type :: TAG_SELF ) {
2019-09-10 07:44:09 +02:00
$thread = Item :: selectFirstThreadForUser ( $params [ 'uid' ], [ 'ignored' ], [ 'iid' => $parent_id , 'deleted' => false ]);
2019-01-06 02:25:05 +01:00
if ( DBA :: isResult ( $thread ) && $thread [ 'ignored' ]) {
Logger :: log ( 'Thread ' . $parent_id . ' will be ignored' , Logger :: DEBUG );
2019-01-21 17:36:01 +01:00
return false ;
2014-09-04 00:58:52 +02:00
}
2013-01-24 02:46:46 +01:00
// Check to see if there was already a tag notify or comment notify for this post.
2012-07-04 06:40:13 +02:00
// If so don't create a second notification
2020-01-08 22:48:59 +01:00
/// @todo In the future we should store the notification with the highest "value" and replace notifications
2020-02-04 22:21:02 +01:00
$condition = [ 'type' => [ Notify\Type :: TAG_SELF , Notify\Type :: COMMENT , Notify\Type :: SHARE ],
2018-08-19 14:46:11 +02:00
'link' => $params [ 'link' ], 'uid' => $params [ 'uid' ]];
if ( DBA :: exists ( 'notify' , $condition )) {
2019-01-21 17:36:01 +01:00
return false ;
2012-07-04 06:40:13 +02:00
}
2014-01-05 16:10:02 +01:00
2012-03-01 03:19:08 +01:00
// if it's a post figure out who's post it is.
2018-01-11 09:26:30 +01:00
$item = null ;
2020-02-04 22:01:55 +01:00
if ( $params [ 'otype' ] === Notify\ObjectType :: ITEM && $parent_id ) {
2019-09-10 07:44:09 +02:00
$item = Item :: selectFirstForUser ( $params [ 'uid' ], Item :: ITEM_FIELDLIST , [ 'id' => $parent_id , 'deleted' => false ]);
2012-03-01 03:19:08 +01:00
}
2020-01-08 22:48:59 +01:00
if ( empty ( $item )) {
return false ;
}
2018-11-07 03:16:27 +01:00
$item_post_type = Item :: postType ( $item );
2012-03-01 04:23:01 +01:00
2020-01-08 22:48:59 +01:00
$content = ItemContent :: getPlaintextPost ( $item , 70 );
if ( ! empty ( $content [ 'text' ])) {
$title = '"' . trim ( str_replace ( " \n " , " " , $content [ 'text' ])) . '"' ;
2019-01-06 02:25:05 +01:00
} else {
2020-01-08 22:48:59 +01:00
$title = '' ;
2019-01-06 02:25:05 +01:00
}
2020-01-08 22:48:59 +01:00
// First go for the general message
2019-01-06 02:25:05 +01:00
// "George Bull's post"
2020-01-08 23:36:31 +01:00
if ( $params [ 'activity' ][ 'origin_comment' ]) {
2020-01-08 22:59:12 +01:00
$message = '%1$s replied to you on %2$s\'s %3$s %4$s' ;
2020-01-08 23:36:31 +01:00
} elseif ( $params [ 'activity' ][ 'explicit_tagged' ]) {
$message = '%1$s tagged you on %2$s\'s %3$s %4$s' ;
2020-01-08 22:48:59 +01:00
} else {
$message = '%1$s commented on %2$s\'s %3$s %4$s' ;
2018-01-04 03:12:19 +01:00
}
2014-01-05 16:10:02 +01:00
2020-01-08 22:48:59 +01:00
$dest_str = $l10n -> t ( $message , $params [ 'source_name' ], $item [ 'author-name' ], $item_post_type , $title );
// Then look for the special cases
2012-03-01 04:23:01 +01:00
// "your post"
2020-01-08 22:48:59 +01:00
if ( $params [ 'activity' ][ 'origin_thread' ]) {
2020-01-08 23:36:31 +01:00
if ( $params [ 'activity' ][ 'origin_comment' ]) {
2020-01-08 22:59:12 +01:00
$message = '%1$s replied to you on your %2$s %3$s' ;
2020-01-08 23:36:31 +01:00
} elseif ( $params [ 'activity' ][ 'explicit_tagged' ]) {
$message = '%1$s tagged you on your %2$s %3$s' ;
2019-01-06 02:25:05 +01:00
} else {
2020-01-08 22:48:59 +01:00
$message = '%1$s commented on your %2$s %3$s' ;
2019-01-06 02:25:05 +01:00
}
2020-01-08 22:48:59 +01:00
$dest_str = $l10n -> t ( $message , $params [ 'source_name' ], $item_post_type , $title );
2019-01-06 02:25:05 +01:00
// "their post"
2020-01-08 22:48:59 +01:00
} elseif ( $item [ 'author-link' ] == $params [ 'source_link' ]) {
2020-01-08 23:36:31 +01:00
if ( $params [ 'activity' ][ 'origin_comment' ]) {
2020-01-08 22:59:12 +01:00
$message = '%1$s replied to you on their %2$s %3$s' ;
2020-01-08 23:36:31 +01:00
} elseif ( $params [ 'activity' ][ 'explicit_tagged' ]) {
$message = '%1$s tagged you on their %2$s %3$s' ;
2019-01-06 02:25:05 +01:00
} else {
2020-01-08 22:48:59 +01:00
$message = '%1$s commented on their %2$s %3$s' ;
2019-01-06 02:25:05 +01:00
}
2020-01-08 22:48:59 +01:00
$dest_str = $l10n -> t ( $message , $params [ 'source_name' ], $item_post_type , $title );
2018-01-04 03:12:19 +01:00
}
2012-03-01 03:19:08 +01:00
2019-01-06 02:25:05 +01:00
// Some mail software relies on subject field for threading.
2012-02-26 01:56:14 +01:00
// So, we cannot have different subjects for notifications of the same thread.
2014-09-04 00:58:52 +02:00
// Before this we have the name of the replier on the subject rendering
2019-01-06 02:25:05 +01:00
// different subjects for messages on the same thread.
2020-01-08 22:48:59 +01:00
if ( $params [ 'activity' ][ 'explicit_tagged' ]) {
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s %s tagged you' , $subjectPrefix , $params [ 'source_name' ]);
2012-02-28 02:18:19 +01:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%1$s tagged you at %2$s' , $params [ 'source_name' ], $sitename );
2019-01-06 02:25:05 +01:00
} else {
2020-02-09 22:42:51 +01:00
$subject = $l10n -> t ( '%1$s Comment to conversation #%2$d by %3$s' , $subjectPrefix , $parent_id , $params [ 'source_name' ]);
2019-01-06 02:25:05 +01:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%s commented on an item/conversation you have been following.' , $params [ 'source_name' ]);
2019-01-06 02:25:05 +01:00
}
2016-05-21 13:19:30 +02:00
2014-01-05 16:10:02 +01:00
$epreamble = $dest_str ;
2012-02-18 12:18:20 +01:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
2019-01-06 02:25:05 +01:00
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2011-12-26 23:16:25 +01:00
$itemlink = $params [ 'link' ];
}
2020-02-04 22:07:10 +01:00
if ( $params [ 'type' ] == Notify\Type :: WALL ) {
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s %s posted to your profile wall' , $subjectPrefix , $params [ 'source_name' ]);
2014-01-05 16:10:02 +01:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%1$s posted to your profile wall at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%1$s posted to [url=%2$s]your wall[/url]' ,
2018-01-24 03:59:16 +01:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2014-01-05 16:10:02 +01:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-01-05 16:10:02 +01:00
$itemlink = $params [ 'link' ];
}
2020-02-04 22:21:02 +01:00
if ( $params [ 'type' ] == Notify\Type :: SHARE ) {
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s %s shared a new post' , $subjectPrefix , $params [ 'source_name' ]);
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%1$s shared a new post at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%1$s [url=%2$s]shared a post[/url].' ,
2018-01-24 03:59:16 +01:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2012-02-09 23:06:17 +01:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-07-20 05:13:40 +02:00
$itemlink = $params [ 'link' ];
}
2020-02-04 22:15:33 +01:00
if ( $params [ 'type' ] == Notify\Type :: POKE ) {
2020-02-09 22:42:51 +01:00
$subject = $l10n -> t ( '%1$s %2$s poked you' , $subjectPrefix , $params [ 'source_name' ]);
2012-07-20 05:13:40 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%1$s poked you at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%1$s [url=%2$s]poked you[/url].' ,
2018-01-24 03:59:16 +01:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2012-07-20 05:13:40 +02:00
2019-12-28 23:12:01 +01:00
$subject = str_replace ( 'poked' , $l10n -> t ( $params [ 'activity' ]), $subject );
$preamble = str_replace ( 'poked' , $l10n -> t ( $params [ 'activity' ]), $preamble );
$epreamble = str_replace ( 'poked' , $l10n -> t ( $params [ 'activity' ]), $epreamble );
2012-07-20 05:13:40 +02:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-02-09 23:06:17 +01:00
$itemlink = $params [ 'link' ];
}
2020-02-04 22:14:42 +01:00
if ( $params [ 'type' ] == Notify\Type :: TAG_SHARE ) {
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s %s tagged your post' , $subjectPrefix , $params [ 'source_name' ]);
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%1$s tagged your post at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%1$s tagged [url=%2$s]your post[/url]' ,
2018-01-24 03:59:16 +01:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink
);
2012-02-09 23:06:17 +01:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-02-09 23:06:17 +01:00
}
2020-02-04 22:03:45 +01:00
if ( $params [ 'type' ] == Notify\Type :: INTRO ) {
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s Introduction received' , $subjectPrefix );
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( 'You\'ve received an introduction from \'%1$s\' at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( 'You\'ve received [url=%1$s]an introduction[/url] from %2$s.' ,
2018-01-24 03:59:16 +01:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$body = $l10n -> t ( 'You may visit their profile at %s' , $params [ 'source_link' ]);
2011-12-27 00:47:40 +01:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to approve or reject the introduction.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-09-06 18:15:18 +02:00
switch ( $params [ 'verb' ]) {
2019-10-24 00:25:43 +02:00
case Activity :: FRIEND :
2014-09-06 18:15:18 +02:00
// someone started to share with user (mostly OStatus)
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s A new person is sharing with you' , $subjectPrefix );
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '%1$s is sharing with you at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%1$s is sharing with you at %2$s' ,
2018-01-24 03:59:16 +01:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$sitename
);
2014-09-06 18:15:18 +02:00
break ;
2019-10-24 00:25:43 +02:00
case Activity :: FOLLOW :
2014-09-06 18:15:18 +02:00
// someone started to follow the user (mostly OStatus)
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s You have a new follower' , $subjectPrefix );
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( 'You have a new follower at %2$s : %1$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( 'You have a new follower at %2$s : %1$s' ,
2018-01-24 03:59:16 +01:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$sitename
);
2014-09-06 18:15:18 +02:00
break ;
default :
2014-09-07 10:27:39 +02:00
// ACTIVITY_REQ_FRIEND is default activity for notifications
2014-09-06 18:15:18 +02:00
break ;
}
2011-12-27 00:47:40 +01:00
}
2020-02-04 22:11:11 +01:00
if ( $params [ 'type' ] == Notify\Type :: SUGGEST ) {
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s Friend suggestion received' , $subjectPrefix );
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( 'You\'ve received a friend suggestion from \'%1$s\' at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( 'You\'ve received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s.' ,
2018-01-24 03:59:16 +01:00
$itemlink ,
'[url=' . $params [ 'item' ][ 'url' ] . ']' . $params [ 'item' ][ 'name' ] . '[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2014-08-21 00:53:01 +02:00
2019-12-28 23:12:01 +01:00
$body = $l10n -> t ( 'Name:' ) . ' ' . $params [ 'item' ][ 'name' ] . " \n " ;
$body .= $l10n -> t ( 'Photo:' ) . ' ' . $params [ 'item' ][ 'photo' ] . " \n " ;
$body .= $l10n -> t ( 'You may visit their profile at %s' , $params [ 'item' ][ 'url' ]);
2012-01-04 02:29:07 +01:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to approve or reject the suggestion.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-01-04 02:29:07 +01:00
}
2020-02-04 22:05:56 +01:00
if ( $params [ 'type' ] == Notify\Type :: CONFIRM ) {
2019-10-24 00:25:43 +02:00
if ( $params [ 'verb' ] == Activity :: FRIEND ) { // mutual connection
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s Connection accepted' , $subjectPrefix );
2014-09-06 18:15:18 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '\'%1$s\' has accepted your connection request at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%2$s has accepted your [url=%1$s]connection request[/url].' ,
2018-01-24 03:59:16 +01:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$body = $l10n -> t ( 'You are now mutual friends and may exchange status updates, photos, and email without restriction.' );
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s if you wish to make any changes to this relationship.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-09-06 18:15:18 +02:00
} else { // ACTIVITY_FOLLOW
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2020-02-05 22:22:12 +01:00
$subject = $l10n -> t ( '%s Connection accepted' , $subjectPrefix );
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( '\'%1$s\' has accepted your connection request at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( '%2$s has accepted your [url=%1$s]connection request[/url].' ,
2018-01-24 03:59:16 +01:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$body = $l10n -> t ( '\'%1$s\' has chosen to accept you a fan, which restricts some forms of communication - such as private messaging and some profile interactions. If this is a celebrity or community page, these settings were applied automatically.' , $params [ 'source_name' ]);
2014-09-06 18:15:18 +02:00
$body .= " \n \n " ;
2019-12-28 23:12:01 +01:00
$body .= $l10n -> t ( '\'%1$s\' may choose to extend this into a two-way or more permissive relationship in the future.' , $params [ 'source_name' ]);
2014-09-06 18:15:18 +02:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s if you wish to make any changes to this relationship.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-09-06 18:15:18 +02:00
}
2012-03-25 13:37:09 +02:00
}
2020-02-04 22:23:37 +01:00
if ( $params [ 'type' ] == Notify\Type :: SYSTEM ) {
2014-09-07 13:55:02 +02:00
switch ( $params [ 'event' ]) {
case " SYSTEM_REGISTER_REQUEST " :
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2019-12-28 23:12:01 +01:00
$subject = $l10n -> t ( '[Friendica System Notify]' ) . ' ' . $l10n -> t ( 'registration request' );
2016-05-21 13:19:30 +02:00
2019-12-28 23:12:01 +01:00
$preamble = $l10n -> t ( 'You\'ve received a registration request from \'%1$s\' at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = $l10n -> t ( 'You\'ve received a [url=%1$s]registration request[/url] from %2$s.' ,
2018-01-24 03:59:16 +01:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2019-12-28 23:12:01 +01:00
$body = $l10n -> t ( " Full Name: %s \n Site Location: %s \n Login Name: %s (%s) " ,
2018-01-24 03:59:16 +01:00
$params [ 'source_name' ],
$siteurl , $params [ 'source_mail' ],
$params [ 'source_nick' ]
);
2014-09-07 13:55:02 +02:00
2019-12-28 23:12:01 +01:00
$sitelink = $l10n -> t ( 'Please visit %s to approve or reject the request.' );
2016-05-21 13:19:30 +02:00
$tsitelink = sprintf ( $sitelink , $params [ 'link' ]);
$hsitelink = sprintf ( $sitelink , '<a href="' . $params [ 'link' ] . '">' . $sitename . '</a><br><br>' );
2014-09-07 13:55:02 +02:00
break ;
case " SYSTEM_DB_UPDATE_FAIL " :
break ;
}
2014-09-07 10:27:39 +02:00
}
2014-12-23 00:55:36 +01:00
$subject .= " ( " . $nickname . " @ " . $hostname . " ) " ;
2014-09-06 15:52:53 +02:00
2018-01-15 14:05:12 +01:00
$h = [
2014-09-04 00:58:52 +02:00
'params' => $params ,
2012-03-25 14:06:11 +02:00
'subject' => $subject ,
2014-09-04 00:58:52 +02:00
'preamble' => $preamble ,
'epreamble' => $epreamble ,
'body' => $body ,
2012-03-25 14:06:11 +02:00
'sitelink' => $sitelink ,
'tsitelink' => $tsitelink ,
'hsitelink' => $hsitelink ,
'itemlink' => $itemlink
2018-01-15 14:05:12 +01:00
];
2014-08-21 00:53:01 +02:00
2018-12-26 07:06:24 +01:00
Hook :: callAll ( 'enotify' , $h );
2012-03-25 14:06:11 +02:00
$subject = $h [ 'subject' ];
2016-05-21 13:19:30 +02:00
2012-03-25 14:06:11 +02:00
$preamble = $h [ 'preamble' ];
$epreamble = $h [ 'epreamble' ];
2016-05-21 13:19:30 +02:00
2012-03-25 14:06:11 +02:00
$body = $h [ 'body' ];
2016-05-21 13:19:30 +02:00
2012-03-25 14:06:11 +02:00
$tsitelink = $h [ 'tsitelink' ];
$hsitelink = $h [ 'hsitelink' ];
2014-03-11 23:52:32 +01:00
$itemlink = $h [ 'itemlink' ];
2012-03-25 14:06:11 +02:00
2019-01-07 18:51:48 +01:00
$notify_id = 0 ;
2014-09-07 10:27:39 +02:00
if ( $show_in_notification_page ) {
2020-01-26 20:30:24 +01:00
$notification = DI :: notify () -> insert ([
2020-01-28 22:26:23 +01:00
'name' => $params [ 'source_name' ] ? ? '' ,
'name_cache' => strip_tags ( BBCode :: convert ( $params [ 'source_name' ] ? ? '' )),
'url' => $params [ 'source_link' ] ? ? '' ,
'photo' => $params [ 'source_photo' ] ? ? '' ,
'link' => $itemlink ? ? '' ,
'uid' => $params [ 'uid' ] ? ? 0 ,
'iid' => $item_id ? ? 0 ,
'parent' => $parent_id ? ? 0 ,
'type' => $params [ 'type' ] ? ? '' ,
'verb' => $params [ 'verb' ] ? ? '' ,
'otype' => $params [ 'otype' ] ? ? '' ,
2020-01-25 02:01:49 +01:00
]);
2013-02-08 08:43:55 +01:00
2020-01-28 01:12:11 +01:00
$notification -> msg = Renderer :: replaceMacros ( $epreamble , [ '$itemlink' => $notification -> link ]);
2013-02-08 08:43:55 +01:00
2020-01-26 20:30:24 +01:00
DI :: notify () -> update ( $notification );
2018-08-19 14:46:11 +02:00
2020-01-28 23:21:24 +01:00
$itemlink = DI :: baseUrl () . '/notification/' . $notification -> id ;
2020-01-25 02:01:49 +01:00
$notify_id = $notification -> id ;
2014-09-06 18:15:18 +02:00
}
// send email notification if notification preferences permit
2018-08-23 10:00:25 +02:00
if (( intval ( $params [ 'notify_flags' ]) & intval ( $params [ 'type' ]))
2020-02-04 22:23:37 +01:00
|| $params [ 'type' ] == Notify\Type :: SYSTEM ) {
2011-12-24 08:07:05 +01:00
2018-10-29 22:20:46 +01:00
Logger :: log ( 'sending notification email' );
2011-12-24 08:07:05 +01:00
2017-06-08 04:00:59 +02:00
if ( isset ( $params [ 'parent' ]) && ( intval ( $params [ 'parent' ]) != 0 )) {
2020-01-26 01:04:54 +01:00
$id_for_parent = $params [ 'parent' ] . " @ " . $hostname ;
2012-02-26 01:56:14 +01:00
2014-08-21 00:53:01 +02:00
// Is this the first email notification for this parent item and user?
2018-08-19 14:46:11 +02:00
if ( ! DBA :: exists ( 'notify-threads' , [ 'master-parent-item' => $params [ 'parent' ], 'receiver-uid' => $params [ 'uid' ]])) {
2020-01-26 01:04:54 +01:00
Logger :: log ( " notify_id: " . intval ( $notify_id ) . " , parent: " . intval ( $params [ 'parent' ]) . " uid: " . intval ( $params [ 'uid' ]), Logger :: DEBUG );
2018-08-19 14:46:11 +02:00
2020-01-26 01:04:54 +01:00
$fields = [ 'notify-id' => $notify_id , 'master-parent-item' => $params [ 'parent' ],
'receiver-uid' => $params [ 'uid' ], 'parent-item' => 0 ];
2018-08-19 14:46:11 +02:00
DBA :: insert ( 'notify-threads' , $fields );
2014-08-21 00:53:01 +02:00
$additional_mail_header .= " Message-ID: < ${ id_for_parent } > \n " ;
2020-01-26 01:04:54 +01:00
$log_msg = " include/enotify: No previous notification found for this parent: \n " .
" parent: ${ params['parent'] } \n " . " uid : ${ params['uid'] } \n " ;
2018-10-30 14:58:45 +01:00
Logger :: log ( $log_msg , Logger :: DEBUG );
2014-08-21 00:53:01 +02:00
} else {
// If not, just "follow" the thread.
$additional_mail_header .= " References: < ${ id_for_parent } > \n In-Reply-To: < ${ id_for_parent } > \n " ;
2018-10-30 14:58:45 +01:00
Logger :: log ( " There's already a notification for this parent. " , Logger :: DEBUG );
2014-08-21 00:53:01 +02:00
}
2012-02-26 01:56:14 +01:00
}
2020-02-03 00:07:22 +01:00
$datarray = [
'preamble' => $preamble ,
'type' => $params [ 'type' ],
'parent' => $parent_id ,
'source_name' => $params [ 'source_name' ] ? ? null ,
'source_link' => $params [ 'source_link' ] ? ? null ,
'source_photo' => $params [ 'source_photo' ] ? ? null ,
'uid' => $params [ 'uid' ],
'hsitelink' => $hsitelink ,
'tsitelink' => $tsitelink ,
'itemlink' => $itemlink ,
'title' => $title ,
'body' => $body ,
'subject' => $subject ,
'headers' => $additional_mail_header ,
];
2012-02-27 08:54:04 +01:00
2018-12-26 07:06:24 +01:00
Hook :: callAll ( 'enotify_mail' , $datarray );
2012-02-27 08:54:04 +01:00
2020-02-03 00:07:22 +01:00
$builder = DI :: emailer ()
2020-02-04 21:27:52 +01:00
-> newNotifyMail ()
2020-02-03 00:07:22 +01:00
-> addHeaders ( $datarray [ 'headers' ])
-> withRecipient ( $params [ 'to_email' ])
2020-02-04 21:26:03 +01:00
-> forUser ([
'uid' => $datarray [ 'uid' ],
'language' => $params [ 'language' ],
])
2020-02-03 00:07:22 +01:00
-> withNotification ( $datarray [ 'subject' ], $datarray [ 'preamble' ], $datarray [ 'title' ], $datarray [ 'body' ])
-> withSiteLink ( $datarray [ 'tsitelink' ], $datarray [ 'hsitelink' ])
-> withItemLink ( $datarray [ 'itemlink' ]);
// If a photo is present, add it to the email
if ( ! empty ( $datarray [ 'source_photo' ])) {
$builder -> withPhoto (
$datarray [ 'source_photo' ],
$datarray [ 'source_link' ] ? ? $sitelink ,
$datarray [ 'source_name' ] ? ? $sitename );
}
2011-12-24 08:07:05 +01:00
2020-02-03 00:07:22 +01:00
$email = $builder -> build ();
2020-01-26 20:23:58 +01:00
// use the Emailer class to send the message
return DI :: emailer () -> send ( $email );
2011-12-24 08:07:05 +01:00
}
2012-02-18 11:57:42 +01:00
2017-11-20 21:37:30 +01:00
return false ;
2011-12-24 08:07:05 +01:00
}
2011-12-08 10:28:27 +01:00
2018-01-07 12:08:36 +01:00
/**
2020-01-19 07:05:23 +01:00
* Checks for users who should be notified
2018-01-07 12:08:36 +01:00
*
* @ param int $itemid ID of the item for which the check should be done
2019-01-07 16:24:06 +01:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2018-01-07 12:08:36 +01:00
*/
function check_user_notification ( $itemid ) {
2020-01-06 01:59:18 +01:00
// fetch all users with notifications
$useritems = DBA :: select ( 'user-item' , [ 'uid' , 'notification-type' ], [ 'iid' => $itemid ]);
while ( $useritem = DBA :: fetch ( $useritems )) {
check_item_notification ( $itemid , $useritem [ 'uid' ], $useritem [ 'notification-type' ]);
2018-01-07 12:08:36 +01:00
}
2020-01-06 01:59:18 +01:00
DBA :: close ( $useritems );
2018-01-07 12:08:36 +01:00
}
2016-01-28 22:58:05 +01:00
/**
2020-01-19 07:05:23 +01:00
* Checks for item related notifications and sends them
2016-01-28 22:58:05 +01:00
*
2020-01-06 01:59:18 +01:00
* @ param int $itemid ID of the item for which the check should be done
* @ param int $uid User ID
* @ param int $notification_type Notification bits
2019-01-07 16:24:06 +01:00
* @ return bool
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2016-01-28 22:58:05 +01:00
*/
2020-01-06 01:59:18 +01:00
function check_item_notification ( $itemid , $uid , $notification_type ) {
2018-06-30 15:54:01 +02:00
$fields = [ 'id' , 'mention' , 'tag' , 'parent' , 'title' , 'body' ,
'author-link' , 'author-name' , 'author-avatar' , 'author-id' ,
'guid' , 'parent-uri' , 'uri' , 'contact-id' , 'network' ];
2019-09-10 07:44:09 +02:00
$condition = [ 'id' => $itemid , 'gravity' => [ GRAVITY_PARENT , GRAVITY_COMMENT ], 'deleted' => false ];
2019-03-15 06:23:45 +01:00
$item = Item :: selectFirstForUser ( $uid , $fields , $condition );
2020-01-06 01:59:18 +01:00
if ( ! DBA :: isResult ( $item )) {
2019-01-21 17:36:01 +01:00
return false ;
2018-06-16 00:30:49 +02:00
}
2018-06-09 18:56:37 +02:00
2016-01-28 22:58:05 +01:00
// Generate the notification array
2018-01-15 14:05:12 +01:00
$params = [];
2020-01-06 01:59:18 +01:00
$params [ 'uid' ] = $uid ;
$params [ 'item' ] = $item ;
$params [ 'parent' ] = $item [ 'parent' ];
$params [ 'link' ] = DI :: baseUrl () . '/display/' . urlencode ( $item [ 'guid' ]);
$params [ 'otype' ] = 'item' ;
$params [ 'source_name' ] = $item [ 'author-name' ];
$params [ 'source_link' ] = $item [ 'author-link' ];
$params [ 'source_photo' ] = $item [ 'author-avatar' ];
2020-01-08 22:48:59 +01:00
// Set the activity flags
$params [ 'activity' ][ 'explicit_tagged' ] = ( $notification_type & UserItem :: NOTIF_EXPLICIT_TAGGED );
$params [ 'activity' ][ 'implicit_tagged' ] = ( $notification_type & UserItem :: NOTIF_IMPLICIT_TAGGED );
$params [ 'activity' ][ 'origin_comment' ] = ( $notification_type & UserItem :: NOTIF_DIRECT_COMMENT );
$params [ 'activity' ][ 'origin_thread' ] = ( $notification_type & UserItem :: NOTIF_THREAD_COMMENT );
$params [ 'activity' ][ 'thread_comment' ] = ( $notification_type & UserItem :: NOTIF_COMMENT_PARTICIPATION );
$params [ 'activity' ][ 'thread_activity' ] = ( $notification_type & UserItem :: NOTIF_ACTIVITY_PARTICIPATION );
2020-01-09 18:53:17 +01:00
// Tagging a user in a direct post (first comment level) means a direct comment
if ( $params [ 'activity' ][ 'explicit_tagged' ] && ( $notification_type & UserItem :: NOTIF_DIRECT_THREAD_COMMENT )) {
$params [ 'activity' ][ 'origin_comment' ] = true ;
}
2020-01-06 01:59:18 +01:00
if ( $notification_type & UserItem :: NOTIF_SHARED ) {
2020-02-04 22:21:02 +01:00
$params [ 'type' ] = Notify\Type :: SHARE ;
2020-01-08 22:48:59 +01:00
$params [ 'verb' ] = Activity :: POST ;
2020-01-06 01:59:18 +01:00
} elseif ( $notification_type & UserItem :: NOTIF_EXPLICIT_TAGGED ) {
2020-02-04 22:13:06 +01:00
$params [ 'type' ] = Notify\Type :: TAG_SELF ;
2020-01-06 01:59:18 +01:00
$params [ 'verb' ] = Activity :: TAG ;
} elseif ( $notification_type & UserItem :: NOTIF_IMPLICIT_TAGGED ) {
2020-02-04 22:09:00 +01:00
$params [ 'type' ] = Notify\Type :: COMMENT ;
2020-01-08 22:48:59 +01:00
$params [ 'verb' ] = Activity :: POST ;
2020-01-06 01:59:18 +01:00
} elseif ( $notification_type & UserItem :: NOTIF_THREAD_COMMENT ) {
2020-02-04 22:09:00 +01:00
$params [ 'type' ] = Notify\Type :: COMMENT ;
2020-01-06 01:59:18 +01:00
$params [ 'verb' ] = Activity :: POST ;
} elseif ( $notification_type & UserItem :: NOTIF_DIRECT_COMMENT ) {
2020-02-04 22:09:00 +01:00
$params [ 'type' ] = Notify\Type :: COMMENT ;
2020-01-06 01:59:18 +01:00
$params [ 'verb' ] = Activity :: POST ;
} elseif ( $notification_type & UserItem :: NOTIF_COMMENT_PARTICIPATION ) {
2020-02-04 22:09:00 +01:00
$params [ 'type' ] = Notify\Type :: COMMENT ;
2020-01-06 01:59:18 +01:00
$params [ 'verb' ] = Activity :: POST ;
} elseif ( $notification_type & UserItem :: NOTIF_ACTIVITY_PARTICIPATION ) {
2020-02-04 22:09:00 +01:00
$params [ 'type' ] = Notify\Type :: COMMENT ;
2020-01-06 01:59:18 +01:00
$params [ 'verb' ] = Activity :: POST ;
} else {
return false ;
2018-08-12 06:34:56 +02:00
}
2020-01-06 01:59:18 +01:00
notification ( $params );
2016-01-28 22:58:05 +01:00
}