2011-12-08 04:28:27 -05:00
< ? php
2017-11-20 15:37:30 -05:00
/**
* @ file include / enotify . php
*/
2018-01-24 21:08:45 -05:00
2018-02-14 21:33:55 -05:00
use Friendica\Content\Text\BBCode ;
2017-11-06 21:22:52 -05:00
use Friendica\Core\Config ;
2018-12-26 01:06:24 -05:00
use Friendica\Core\Hook ;
2018-01-21 11:38:01 -05:00
use Friendica\Core\L10n ;
2018-10-29 17:20:46 -04:00
use Friendica\Core\Logger ;
2018-10-31 10:35:50 -04:00
use Friendica\Core\Renderer ;
2017-08-26 02:04:21 -04:00
use Friendica\Core\System ;
2018-07-20 08:19:26 -04:00
use Friendica\Database\DBA ;
2018-07-19 22:15:21 -04:00
use Friendica\Model\Item ;
2019-01-21 11:38:01 -05:00
use Friendica\Model\User ;
2018-01-26 21:38:34 -05:00
use Friendica\Util\DateTimeFormat ;
2017-11-20 15:37:30 -05:00
use Friendica\Util\Emailer ;
2018-11-08 08:45:46 -05:00
use Friendica\Util\Strings ;
2017-04-30 00:07:00 -04:00
2016-05-21 07:19:30 -04:00
/**
* @ brief Creates a notification entry and possibly sends a mail
*
* @ param array $params Array with the elements :
2019-01-07 10:24:06 -05: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 11:36:01 -05:00
* @ return bool
2019-01-07 10:24:06 -05:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2016-05-21 07:19:30 -04:00
*/
2018-01-03 21:12:19 -05:00
function notification ( $params )
{
2018-12-27 19:22:35 -05:00
$a = \get_app ();
2012-03-26 04:43:26 -04:00
2018-08-02 01:21:01 -04:00
// Temporary logging for finding the origin
2019-02-22 23:00:16 -05:00
if ( ! isset ( $params [ 'uid' ])) {
Logger :: notice ( 'Missing parameters "uid".' , [ 'params' => $params , 'callstack' => System :: callstack ()]);
2018-08-02 01:21:01 -04:00
}
2018-08-23 04:00:25 -04: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-22 23:00:16 -05:00
Logger :: error ( 'Unknown user' , [ 'uid' => $params [ 'uid' ]]);
2019-01-21 11:36:01 -05:00
return false ;
2018-08-23 04:00:25 -04:00
}
2019-10-16 08:43:59 -04: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 04:00:25 -04:00
2012-03-26 04:43:26 -04:00
// from here on everything is in the recipients language
2018-01-21 11:38:01 -05:00
L10n :: pushLang ( $params [ 'language' ]);
2012-03-26 04:43:26 -04:00
2018-01-21 13:33:59 -05:00
$banner = L10n :: t ( 'Friendica Notification' );
2014-09-06 12:15:18 -04:00
$product = FRIENDICA_PLATFORM ;
2017-08-26 03:32:10 -04:00
$siteurl = System :: baseUrl ( true );
2018-01-21 13:33:59 -05:00
$thanks = L10n :: t ( 'Thank You,' );
2018-07-07 17:46:30 -04:00
$sitename = Config :: get ( 'config' , 'sitename' );
if ( Config :: get ( 'config' , 'admin_name' )) {
$site_admin = L10n :: t ( '%1$s, %2$s Administrator' , Config :: get ( 'config' , 'admin_name' ), $sitename );
2018-01-03 21:12:19 -05:00
} else {
2018-07-07 17:46:30 -04:00
$site_admin = L10n :: t ( '%s Administrator' , $sitename );
2018-01-03 21:12:19 -05:00
}
2014-09-06 12:15:18 -04:00
2015-01-31 12:44:30 -05:00
$sender_name = $sitename ;
2018-10-09 13:58:58 -04:00
$hostname = $a -> getHostName ();
2018-01-03 21:12:19 -05:00
if ( strpos ( $hostname , ':' )) {
2016-05-21 07:19:30 -04:00
$hostname = substr ( $hostname , 0 , strpos ( $hostname , ':' ));
2018-01-03 21:12:19 -05:00
}
2015-04-16 01:18:06 -04:00
2018-04-06 21:47:42 -04:00
$sender_email = $a -> getSenderEmailAddress ();
2014-09-06 12:15:18 -04:00
2017-09-08 11:14:33 -04:00
if ( $params [ 'type' ] != SYSTEM_EMAIL ) {
2018-07-20 08:19:26 -04:00
$user = DBA :: selectFirst ( 'user' , [ 'nickname' , 'page-flags' ],
2018-01-10 13:04:00 -05:00
[ 'uid' => $params [ 'uid' ]]);
2017-08-12 01:08:45 -04:00
2017-09-08 11:14:33 -04:00
// There is no need to create notifications for forum accounts
2019-01-06 12:37:48 -05:00
if ( ! DBA :: isResult ( $user ) || in_array ( $user [ " page-flags " ], [ User :: PAGE_FLAGS_COMMUNITY , User :: PAGE_FLAGS_PRVGROUP ])) {
2019-01-21 11:36:01 -05:00
return false ;
2017-09-08 11:14:33 -04:00
}
2018-08-02 01:21:01 -04:00
$nickname = $user [ " nickname " ];
} else {
$nickname = '' ;
2017-08-12 01:08:45 -04:00
}
2014-12-22 18:55:36 -05:00
2014-09-06 12:15:18 -04: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 11:30:39 -04:00
$show_in_notification_page = isset ( $params [ 'show_in_notification_page' ]) ? $params [ 'show_in_notification_page' ] : true ;
2014-09-06 12:15:18 -04:00
$additional_mail_header = " " ;
$additional_mail_header .= " Precedence: list \n " ;
$additional_mail_header .= " X-Friendica-Host: " . $hostname . " \n " ;
2014-12-22 18:55:36 -05:00
$additional_mail_header .= " X-Friendica-Account: < " . $nickname . " @ " . $hostname . " > \n " ;
2014-09-06 12:15:18 -04:00
$additional_mail_header .= " X-Friendica-Platform: " . FRIENDICA_PLATFORM . " \n " ;
$additional_mail_header .= " X-Friendica-Version: " . FRIENDICA_VERSION . " \n " ;
$additional_mail_header .= " List-ID: <notification. " . $hostname . " > \n " ;
2017-08-26 03:32:10 -04:00
$additional_mail_header .= " List-Archive: < " . System :: baseUrl () . " /notifications/system> \n " ;
2014-09-06 12:15:18 -04:00
2016-05-21 07:19:30 -04:00
if ( array_key_exists ( 'item' , $params )) {
2011-12-26 18:47:40 -05:00
$title = $params [ 'item' ][ 'title' ];
$body = $params [ 'item' ][ 'body' ];
2018-01-03 21:12:19 -05:00
} else {
2011-12-26 18:47:40 -05:00
$title = $body = '' ;
2018-01-03 21:12:19 -05:00
}
2011-12-24 02:07:05 -05:00
2018-01-03 21:12:19 -05:00
if ( isset ( $params [ 'item' ][ 'id' ])) {
2015-04-16 01:18:06 -04:00
$item_id = $params [ 'item' ][ 'id' ];
2018-01-03 21:12:19 -05:00
} else {
2015-04-16 01:18:06 -04:00
$item_id = 0 ;
2018-01-03 21:12:19 -05:00
}
2015-04-16 01:18:06 -04:00
2018-01-03 21:12:19 -05:00
if ( isset ( $params [ 'parent' ])) {
2015-04-14 00:54:41 -04:00
$parent_id = $params [ 'parent' ];
2018-01-03 21:12:19 -05:00
} else {
2015-04-14 00:54:41 -04:00
$parent_id = 0 ;
2018-01-03 21:12:19 -05:00
}
2015-04-14 00:54:41 -04:00
2018-08-02 01:21:01 -04:00
$epreamble = '' ;
2019-01-07 12:51:48 -05:00
$preamble = '' ;
$subject = '' ;
$sitelink = '' ;
$tsitelink = '' ;
$hsitelink = '' ;
$itemlink = '' ;
2018-08-02 01:21:01 -04:00
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_MAIL ) {
2018-07-10 08:27:56 -04:00
$itemlink = $siteurl . '/message/' . $params [ 'item' ][ 'id' ];
2018-07-31 12:39:23 -04:00
$params [ " link " ] = $itemlink ;
2018-07-10 08:27:56 -04:00
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] New mail received at %s' , $sitename );
2011-12-24 02:07:05 -05:00
2018-01-23 21:59:16 -05:00
$preamble = L10n :: t ( '%1$s sent you a new private message at %2$s.' , $params [ 'source_name' ], $sitename );
2019-01-05 20:25:05 -05:00
$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 02:07:05 -05:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to view and/or reply to your private messages.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl . '/message/' . $params [ 'item' ][ 'id' ]);
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '/message/' . $params [ 'item' ][ 'id' ] . '">' . $sitename . '</a>' );
2011-12-26 17:16:25 -05:00
}
2019-01-05 20:25:05 -05:00
if ( $params [ 'type' ] == NOTIFY_COMMENT || $params [ 'type' ] == NOTIFY_TAGSELF ) {
2019-09-10 01:44:09 -04:00
$thread = Item :: selectFirstThreadForUser ( $params [ 'uid' ], [ 'ignored' ], [ 'iid' => $parent_id , 'deleted' => false ]);
2019-01-05 20:25:05 -05:00
if ( DBA :: isResult ( $thread ) && $thread [ 'ignored' ]) {
Logger :: log ( 'Thread ' . $parent_id . ' will be ignored' , Logger :: DEBUG );
2018-10-20 09:02:10 -04:00
L10n :: popLang ();
2019-01-21 11:36:01 -05:00
return false ;
2014-09-03 18:58:52 -04:00
}
2013-01-23 20:46:46 -05:00
// Check to see if there was already a tag notify or comment notify for this post.
2012-07-04 00:40:13 -04:00
// If so don't create a second notification
2018-08-19 08:46:11 -04:00
$condition = [ 'type' => [ NOTIFY_TAGSELF , NOTIFY_COMMENT , NOTIFY_SHARE ],
'link' => $params [ 'link' ], 'uid' => $params [ 'uid' ]];
if ( DBA :: exists ( 'notify' , $condition )) {
2018-01-21 11:38:01 -05:00
L10n :: popLang ();
2019-01-21 11:36:01 -05:00
return false ;
2012-07-04 00:40:13 -04:00
}
2014-01-05 10:10:02 -05:00
2012-02-29 21:19:08 -05:00
// if it's a post figure out who's post it is.
2018-01-11 03:26:30 -05:00
$item = null ;
2016-05-21 07:19:30 -04:00
if ( $params [ 'otype' ] === 'item' && $parent_id ) {
2019-09-10 01:44:09 -04:00
$item = Item :: selectFirstForUser ( $params [ 'uid' ], Item :: ITEM_FIELDLIST , [ 'id' => $parent_id , 'deleted' => false ]);
2012-02-29 21:19:08 -05:00
}
2018-11-06 21:16:27 -05:00
$item_post_type = Item :: postType ( $item );
2018-07-10 08:27:56 -04:00
$itemlink = $item [ 'plink' ];
2012-02-29 22:23:01 -05:00
// "a post"
2019-01-05 20:25:05 -05:00
if ( $params [ 'type' ] == NOTIFY_TAGSELF ) {
$dest_str = L10n :: t ( '%1$s tagged you on [url=%2$s]a %3$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
2018-01-23 21:59:16 -05:00
$itemlink ,
$item_post_type
);
2019-01-05 20:25:05 -05:00
} else {
$dest_str = L10n :: t ( '%1$s commented on [url=%2$s]a %3$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink ,
$item_post_type
);
}
// "George Bull's post"
if ( DBA :: isResult ( $item )) {
if ( $params [ 'type' ] == NOTIFY_TAGSELF ) {
$dest_str = L10n :: t ( '%1$s tagged you on [url=%2$s]%3$s\'s %4$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink ,
$item [ 'author-name' ],
$item_post_type
);
} else {
$dest_str = L10n :: t ( '%1$s commented on [url=%2$s]%3$s\'s %4$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink ,
$item [ 'author-name' ],
$item_post_type
);
}
2018-01-03 21:12:19 -05:00
}
2014-01-05 10:10:02 -05:00
2012-02-29 22:23:01 -05:00
// "your post"
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $item ) && $item [ 'owner-id' ] == $item [ 'author-id' ] && $item [ 'wall' ]) {
2019-01-05 20:25:05 -05:00
if ( $params [ 'type' ] == NOTIFY_TAGSELF ) {
$dest_str = L10n :: t ( '%1$s tagged you on [url=%2$s]your %3$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink ,
$item_post_type
);
} else {
$dest_str = L10n :: t ( '%1$s commented on [url=%2$s]your %3$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink ,
$item_post_type
);
}
}
// "their post"
if ( DBA :: isResult ( $item ) && $item [ 'author-link' ] == $params [ 'source_link' ]) {
if ( $params [ 'type' ] == NOTIFY_TAGSELF ) {
$dest_str = L10n :: t ( '%1$s tagged you on [url=%2$s]their %3$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink ,
$item_post_type
);
} else {
$dest_str = L10n :: t ( '%1$s commented on [url=%2$s]their %3$s[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink ,
$item_post_type
);
}
2018-01-03 21:12:19 -05:00
}
2012-02-29 21:19:08 -05:00
2019-01-05 20:25:05 -05:00
// Some mail software relies on subject field for threading.
2012-02-25 19:56:14 -05:00
// So, we cannot have different subjects for notifications of the same thread.
2014-09-03 18:58:52 -04:00
// Before this we have the name of the replier on the subject rendering
2019-01-05 20:25:05 -05:00
// different subjects for messages on the same thread.
if ( $params [ 'type' ] == NOTIFY_TAGSELF ) {
$subject = L10n :: t ( '[Friendica:Notify] %s tagged you' , $params [ 'source_name' ]);
2012-02-27 20:18:19 -05:00
2019-01-05 20:25:05 -05:00
$preamble = L10n :: t ( '%1$s tagged you at %2$s' , $params [ 'source_name' ], $sitename );
} else {
$subject = L10n :: t ( '[Friendica:Notify] Comment to conversation #%1$d by %2$s' , $parent_id , $params [ 'source_name' ]);
$preamble = L10n :: t ( '%s commented on an item/conversation you have been following.' , $params [ 'source_name' ]);
}
2016-05-21 07:19:30 -04:00
2014-01-05 10:10:02 -05:00
$epreamble = $dest_str ;
2012-02-18 06:18:20 -05:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
2019-01-05 20:25:05 -05:00
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2011-12-26 17:16:25 -05:00
$itemlink = $params [ 'link' ];
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_WALL ) {
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] %s posted to your profile wall' , $params [ 'source_name' ]);
2014-01-05 10:10:02 -05:00
2018-01-23 21:59:16 -05: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]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2014-01-05 10:10:02 -05:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-01-05 10:10:02 -05:00
$itemlink = $params [ 'link' ];
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_SHARE ) {
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] %s shared a new post' , $params [ 'source_name' ]);
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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].' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2012-02-09 17:06:17 -05:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-07-19 23:13:40 -04:00
$itemlink = $params [ 'link' ];
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_POKE ) {
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] %1$s poked you' , $params [ 'source_name' ]);
2012-07-19 23:13:40 -04:00
2018-01-23 21:59:16 -05: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].' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2012-07-19 23:13:40 -04:00
2018-01-21 13:33:59 -05: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-19 23:13:40 -04:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-02-09 17:06:17 -05:00
$itemlink = $params [ 'link' ];
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_TAGSHARE ) {
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] %s tagged your post' , $params [ 'source_name' ]);
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink
);
2012-02-09 17:06:17 -05:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to view and/or reply to the conversation.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-02-09 17:06:17 -05:00
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_INTRO ) {
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] Introduction received' );
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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.' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05:00
$body = L10n :: t ( 'You may visit their profile at %s' , $params [ 'source_link' ]);
2011-12-26 18:47:40 -05:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to approve or reject the introduction.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-09-06 12:15:18 -04:00
switch ( $params [ 'verb' ]) {
case ACTIVITY_FRIEND :
// someone started to share with user (mostly OStatus)
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] A new person is sharing with you' );
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$sitename
);
2014-09-06 12:15:18 -04:00
break ;
case ACTIVITY_FOLLOW :
// someone started to follow the user (mostly OStatus)
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] You have a new follower' );
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$sitename
);
2014-09-06 12:15:18 -04:00
break ;
default :
2014-09-07 04:27:39 -04:00
// ACTIVITY_REQ_FRIEND is default activity for notifications
2014-09-06 12:15:18 -04:00
break ;
}
2011-12-26 18:47:40 -05:00
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_SUGGEST ) {
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] Friend suggestion received' );
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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.' ,
$itemlink ,
'[url=' . $params [ 'item' ][ 'url' ] . ']' . $params [ 'item' ][ 'name' ] . '[/url]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2014-08-20 18:53:01 -04:00
2018-01-21 13:33:59 -05:00
$body = L10n :: t ( 'Name:' ) . ' ' . $params [ 'item' ][ 'name' ] . " \n " ;
$body .= L10n :: t ( 'Photo:' ) . ' ' . $params [ 'item' ][ 'photo' ] . " \n " ;
2018-01-23 21:59:16 -05:00
$body .= L10n :: t ( 'You may visit their profile at %s' , $params [ 'item' ][ 'url' ]);
2012-01-03 20:29:07 -05:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to approve or reject the suggestion.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2012-01-03 20:29:07 -05:00
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_CONFIRM ) {
if ( $params [ 'verb' ] == ACTIVITY_FRIEND ) { // mutual connection
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] Connection accepted' );
2014-09-06 12:15:18 -04:00
2018-01-23 21:59:16 -05: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].' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 07:19:30 -04:00
2018-01-21 13:33:59 -05:00
$body = L10n :: t ( 'You are now mutual friends and may exchange status updates, photos, and email without restriction.' );
2016-05-21 07:19:30 -04:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s if you wish to make any changes to this relationship.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-09-06 12:15:18 -04:00
} else { // ACTIVITY_FOLLOW
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2018-01-23 21:59:16 -05:00
$subject = L10n :: t ( '[Friendica:Notify] Connection accepted' );
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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].' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 07:19:30 -04:00
2018-01-24 16:51:32 -05: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 12:15:18 -04:00
$body .= " \n \n " ;
2018-01-23 21:59:16 -05: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 12:15:18 -04:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s if you wish to make any changes to this relationship.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
2014-09-06 12:15:18 -04:00
}
2012-03-25 07:37:09 -04:00
}
2016-05-21 07:19:30 -04:00
if ( $params [ 'type' ] == NOTIFY_SYSTEM ) {
2014-09-07 07:55:02 -04:00
switch ( $params [ 'event' ]) {
case " SYSTEM_REGISTER_REQUEST " :
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2018-04-15 05:39:05 -04:00
$subject = L10n :: t ( '[Friendica System Notify]' ) . ' ' . L10n :: t ( 'registration request' );
2016-05-21 07:19:30 -04:00
2018-01-23 21:59:16 -05: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.' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2018-06-14 23:42:08 -04:00
$body = L10n :: t ( " Full Name: %s \n Site Location: %s \n Login Name: %s (%s) " ,
2018-01-23 21:59:16 -05:00
$params [ 'source_name' ],
$siteurl , $params [ 'source_mail' ],
$params [ 'source_nick' ]
);
2014-09-07 07:55:02 -04:00
2018-01-21 13:33:59 -05:00
$sitelink = L10n :: t ( 'Please visit %s to approve or reject the request.' );
2016-05-21 07:19:30 -04:00
$tsitelink = sprintf ( $sitelink , $params [ 'link' ]);
$hsitelink = sprintf ( $sitelink , '<a href="' . $params [ 'link' ] . '">' . $sitename . '</a><br><br>' );
2014-09-07 07:55:02 -04:00
break ;
case " SYSTEM_DB_UPDATE_FAIL " :
break ;
}
2014-09-07 04:27:39 -04:00
}
2017-09-08 11:14:33 -04:00
if ( $params [ 'type' ] == SYSTEM_EMAIL ) {
2014-09-07 04:27:39 -04:00
// not part of the notifications.
// it just send a mail to the user.
// It will be used by the system to send emails to users (like
// password reset, invitations and so) using one look (but without
// add a notification to the user, with could be inexistent)
2019-03-13 15:44:07 -04:00
if ( ! isset ( $params [ 'subject' ])) {
Logger :: warning ( 'subject isn\'t set.' , [ 'type' => $params [ 'type' ]]);
}
2019-10-16 08:43:59 -04:00
$subject = $params [ 'subject' ] ? ? '' ;
2016-05-21 07:19:30 -04:00
2019-03-13 15:44:07 -04:00
if ( ! isset ( $params [ 'preamble' ])) {
Logger :: warning ( 'preamble isn\'t set.' , [ 'type' => $params [ 'type' ], 'subject' => $subject ]);
}
2019-10-16 08:43:59 -04:00
$preamble = $params [ 'preamble' ] ? ? '' ;
2016-05-21 07:19:30 -04:00
2019-03-13 15:44:07 -04:00
if ( ! isset ( $params [ 'body' ])) {
Logger :: warning ( 'body isn\'t set.' , [ 'type' => $params [ 'type' ], 'subject' => $subject , 'preamble' => $preamble ]);
}
2019-10-16 08:43:59 -04:00
$body = $params [ 'body' ] ? ? '' ;
2016-05-21 07:19:30 -04:00
$show_in_notification_page = false ;
2011-12-26 18:47:40 -05:00
}
2014-12-22 18:55:36 -05:00
$subject .= " ( " . $nickname . " @ " . $hostname . " ) " ;
2014-09-06 09:52:53 -04:00
2018-01-15 08:05:12 -05:00
$h = [
2014-09-03 18:58:52 -04:00
'params' => $params ,
2012-03-25 08:06:11 -04:00
'subject' => $subject ,
2014-09-03 18:58:52 -04:00
'preamble' => $preamble ,
'epreamble' => $epreamble ,
'body' => $body ,
2012-03-25 08:06:11 -04:00
'sitelink' => $sitelink ,
'tsitelink' => $tsitelink ,
'hsitelink' => $hsitelink ,
'itemlink' => $itemlink
2018-01-15 08:05:12 -05:00
];
2014-08-20 18:53:01 -04:00
2018-12-26 01:06:24 -05:00
Hook :: callAll ( 'enotify' , $h );
2012-03-25 08:06:11 -04:00
$subject = $h [ 'subject' ];
2016-05-21 07:19:30 -04:00
2012-03-25 08:06:11 -04:00
$preamble = $h [ 'preamble' ];
$epreamble = $h [ 'epreamble' ];
2016-05-21 07:19:30 -04:00
2012-03-25 08:06:11 -04:00
$body = $h [ 'body' ];
2016-05-21 07:19:30 -04:00
2012-03-25 08:06:11 -04:00
$tsitelink = $h [ 'tsitelink' ];
$hsitelink = $h [ 'hsitelink' ];
2014-03-11 18:52:32 -04:00
$itemlink = $h [ 'itemlink' ];
2012-03-25 08:06:11 -04:00
2019-01-07 12:51:48 -05:00
$notify_id = 0 ;
2014-09-07 04:27:39 -04:00
if ( $show_in_notification_page ) {
2018-10-30 09:58:45 -04:00
Logger :: log ( " adding notification entry " , Logger :: DEBUG );
2014-09-06 12:15:18 -04:00
do {
$dups = false ;
2018-11-08 08:45:46 -05:00
$hash = Strings :: getRandomHex ();
2018-08-19 08:46:11 -04:00
if ( DBA :: exists ( 'notify' , [ 'hash' => $hash ])) {
2014-09-06 12:15:18 -04:00
$dups = true ;
2017-04-04 13:47:32 -04:00
}
} while ( $dups == true );
2012-02-18 05:57:42 -05:00
2017-04-04 13:47:32 -04:00
/// @TODO One statement is enough
2018-01-15 08:05:12 -05:00
$datarray = [];
2014-09-06 12:15:18 -04:00
$datarray [ 'hash' ] = $hash ;
$datarray [ 'name' ] = $params [ 'source_name' ];
2018-02-14 21:33:55 -05:00
$datarray [ 'name_cache' ] = strip_tags ( BBCode :: convert ( $params [ 'source_name' ]));
2014-09-06 12:15:18 -04:00
$datarray [ 'url' ] = $params [ 'source_link' ];
$datarray [ 'photo' ] = $params [ 'source_photo' ];
2018-01-26 21:38:34 -05:00
$datarray [ 'date' ] = DateTimeFormat :: utcNow ();
2014-09-06 12:15:18 -04:00
$datarray [ 'uid' ] = $params [ 'uid' ];
$datarray [ 'link' ] = $itemlink ;
2015-04-16 01:18:06 -04:00
$datarray [ 'iid' ] = $item_id ;
2014-09-06 12:15:18 -04:00
$datarray [ 'parent' ] = $parent_id ;
$datarray [ 'type' ] = $params [ 'type' ];
$datarray [ 'verb' ] = $params [ 'verb' ];
$datarray [ 'otype' ] = $params [ 'otype' ];
$datarray [ 'abort' ] = false ;
2012-02-20 22:50:05 -05:00
2018-12-26 01:06:24 -05:00
Hook :: callAll ( 'enotify_store' , $datarray );
2013-02-08 02:43:55 -05:00
2016-05-21 07:19:30 -04:00
if ( $datarray [ 'abort' ]) {
2018-01-21 11:38:01 -05:00
L10n :: popLang ();
2019-01-21 11:36:01 -05:00
return false ;
2013-02-08 02:43:55 -05:00
}
2014-09-06 12:15:18 -04:00
// create notification entry in DB
2018-08-19 08:46:11 -04:00
$fields = [ 'hash' => $datarray [ 'hash' ], 'name' => $datarray [ 'name' ], 'url' => $datarray [ 'url' ],
'photo' => $datarray [ 'photo' ], 'date' => $datarray [ 'date' ], 'uid' => $datarray [ 'uid' ],
'link' => $datarray [ 'link' ], 'iid' => $datarray [ 'iid' ], 'parent' => $datarray [ 'parent' ],
'type' => $datarray [ 'type' ], 'verb' => $datarray [ 'verb' ], 'otype' => $datarray [ 'otype' ],
'name_cache' => $datarray [ " name_cache " ]];
DBA :: insert ( 'notify' , $fields );
2013-02-08 02:43:55 -05:00
2018-08-19 08:46:11 -04:00
$notify_id = DBA :: lastInsertId ();
2013-02-08 02:43:55 -05:00
2014-09-06 12:15:18 -04:00
// we seem to have a lot of duplicate comment notifications due to race conditions, mostly from forums
// After we've stored everything, look again to see if there are any duplicates and if so remove them
2017-01-04 18:12:28 -05:00
$p = q ( " SELECT `id` FROM `notify` WHERE `type` IN (%d, %d) AND `link` = '%s' AND `uid` = %d ORDER BY `id` " ,
2014-09-06 12:15:18 -04:00
intval ( NOTIFY_TAGSELF ),
intval ( NOTIFY_COMMENT ),
2018-07-21 09:10:13 -04:00
DBA :: escape ( $params [ 'link' ]),
2014-09-06 12:15:18 -04:00
intval ( $params [ 'uid' ])
);
2016-05-21 07:19:30 -04:00
if ( $p && ( count ( $p ) > 1 )) {
2014-09-06 12:15:18 -04:00
for ( $d = 1 ; $d < count ( $p ); $d ++ ) {
2018-07-20 08:19:26 -04:00
DBA :: delete ( 'notify' , [ 'id' => $p [ $d ][ 'id' ]]);
2014-09-06 12:15:18 -04:00
}
// only continue on if we stored the first one
2016-05-21 07:19:30 -04:00
if ( $notify_id != $p [ 0 ][ 'id' ]) {
2018-01-21 11:38:01 -05:00
L10n :: popLang ();
return false ;
2014-09-06 12:15:18 -04:00
}
}
2014-03-11 18:52:32 -04:00
2017-08-26 03:32:10 -04:00
$itemlink = System :: baseUrl () . '/notify/view/' . $notify_id ;
2018-10-31 10:35:50 -04:00
$msg = Renderer :: replaceMacros ( $epreamble , [ '$itemlink' => $itemlink ]);
2018-02-14 21:33:55 -05:00
$msg_cache = format_notification_message ( $datarray [ 'name_cache' ], strip_tags ( BBCode :: convert ( $msg )));
2018-08-19 08:46:11 -04:00
$fields = [ 'msg' => $msg , 'msg_cache' => $msg_cache ];
$condition = [ 'id' => $notify_id , 'uid' => $params [ 'uid' ]];
DBA :: update ( 'notify' , $fields , $condition );
2014-09-06 12:15:18 -04:00
}
// send email notification if notification preferences permit
2018-08-23 04:00:25 -04:00
if (( intval ( $params [ 'notify_flags' ]) & intval ( $params [ 'type' ]))
2014-09-07 04:27:39 -04:00
|| $params [ 'type' ] == NOTIFY_SYSTEM
2017-09-08 11:14:33 -04:00
|| $params [ 'type' ] == SYSTEM_EMAIL ) {
2011-12-24 02:07:05 -05:00
2018-10-29 17:20:46 -04:00
Logger :: log ( 'sending notification email' );
2011-12-24 02:07:05 -05:00
2017-06-07 22:00:59 -04:00
if ( isset ( $params [ 'parent' ]) && ( intval ( $params [ 'parent' ]) != 0 )) {
2014-08-20 18:53:01 -04:00
$id_for_parent = $params [ 'parent' ] . " @ " . $hostname ;
2012-02-25 19:56:14 -05:00
2014-08-20 18:53:01 -04:00
// Is this the first email notification for this parent item and user?
2018-08-19 08:46:11 -04:00
if ( ! DBA :: exists ( 'notify-threads' , [ 'master-parent-item' => $params [ 'parent' ], 'receiver-uid' => $params [ 'uid' ]])) {
2018-10-30 09:58:45 -04:00
Logger :: log ( " notify_id: " . intval ( $notify_id ) . " , parent: " . intval ( $params [ 'parent' ]) . " uid: " . intval ( $params [ 'uid' ]), Logger :: DEBUG );
2018-08-19 08:46:11 -04:00
$fields = [ 'notify-id' => $notify_id , 'master-parent-item' => $params [ 'parent' ],
'receiver-uid' => $params [ 'uid' ], 'parent-item' => 0 ];
DBA :: insert ( 'notify-threads' , $fields );
2014-08-20 18:53:01 -04:00
$additional_mail_header .= " Message-ID: < ${ id_for_parent } > \n " ;
2016-05-21 07:19:30 -04:00
$log_msg = " include/enotify: No previous notification found for this parent: \n " .
" parent: ${ params['parent'] } \n " . " uid : ${ params['uid'] } \n " ;
2018-10-30 09:58:45 -04:00
Logger :: log ( $log_msg , Logger :: DEBUG );
2014-08-20 18:53:01 -04: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 09:58:45 -04:00
Logger :: log ( " There's already a notification for this parent. " , Logger :: DEBUG );
2014-08-20 18:53:01 -04:00
}
2012-02-25 19:56:14 -05:00
}
2018-06-14 23:42:08 -04:00
$textversion = BBCode :: toPlaintext ( $body );
$htmlversion = BBCode :: convert ( $body );
2014-09-07 04:27:39 -04:00
2018-01-15 08:05:12 -05:00
$datarray = [];
2012-02-27 02:54:04 -05:00
$datarray [ 'banner' ] = $banner ;
$datarray [ 'product' ] = $product ;
$datarray [ 'preamble' ] = $preamble ;
$datarray [ 'sitename' ] = $sitename ;
$datarray [ 'siteurl' ] = $siteurl ;
2012-02-27 20:18:19 -05:00
$datarray [ 'type' ] = $params [ 'type' ];
2018-07-10 08:27:56 -04:00
$datarray [ 'parent' ] = $parent_id ;
2019-10-16 08:43:59 -04:00
$datarray [ 'source_name' ] = $params [ 'source_name' ] ? ? '' ;
$datarray [ 'source_link' ] = $params [ 'source_link' ] ? ? '' ;
$datarray [ 'source_photo' ] = $params [ 'source_photo' ] ? ? '' ;
2012-02-27 20:18:19 -05:00
$datarray [ 'uid' ] = $params [ 'uid' ];
2019-10-16 08:43:59 -04:00
$datarray [ 'username' ] = $params [ 'to_name' ] ? ? '' ;
2012-02-27 02:54:04 -05:00
$datarray [ 'hsitelink' ] = $hsitelink ;
$datarray [ 'tsitelink' ] = $tsitelink ;
2016-05-21 07:19:30 -04:00
$datarray [ 'hitemlink' ] = '<a href="' . $itemlink . '">' . $itemlink . '</a>' ;
2012-02-27 02:54:04 -05:00
$datarray [ 'titemlink' ] = $itemlink ;
$datarray [ 'thanks' ] = $thanks ;
$datarray [ 'site_admin' ] = $site_admin ;
$datarray [ 'title' ] = stripslashes ( $title );
$datarray [ 'htmlversion' ] = $htmlversion ;
$datarray [ 'textversion' ] = $textversion ;
$datarray [ 'subject' ] = $subject ;
$datarray [ 'headers' ] = $additional_mail_header ;
2018-12-26 01:06:24 -05:00
Hook :: callAll ( 'enotify_mail' , $datarray );
2012-02-27 02:54:04 -05:00
2013-02-23 11:31:34 -05:00
// check whether sending post content in email notifications is allowed
2017-09-08 11:14:33 -04:00
// always true for SYSTEM_EMAIL
2017-11-06 21:22:52 -05:00
$content_allowed = (( ! Config :: get ( 'system' , 'enotify_no_content' )) || ( $params [ 'type' ] == SYSTEM_EMAIL ));
2013-02-23 11:31:34 -05:00
2011-12-24 02:07:05 -05:00
// load the template for private message notifications
2018-10-31 10:44:06 -04:00
$tpl = Renderer :: getMarkupTemplate ( 'email_notify_html.tpl' );
2018-10-31 10:35:50 -04:00
$email_html_body = Renderer :: replaceMacros ( $tpl , [
2012-02-27 02:54:04 -05:00
'$banner' => $datarray [ 'banner' ],
'$product' => $datarray [ 'product' ],
2016-05-21 07:19:30 -04:00
'$preamble' => str_replace ( " \n " , " <br> \n " , $datarray [ 'preamble' ]),
2012-02-27 02:54:04 -05:00
'$sitename' => $datarray [ 'sitename' ],
'$siteurl' => $datarray [ 'siteurl' ],
'$source_name' => $datarray [ 'source_name' ],
'$source_link' => $datarray [ 'source_link' ],
'$source_photo' => $datarray [ 'source_photo' ],
2018-07-10 08:27:56 -04:00
'$username' => $datarray [ 'username' ],
2012-02-27 02:54:04 -05:00
'$hsitelink' => $datarray [ 'hsitelink' ],
'$hitemlink' => $datarray [ 'hitemlink' ],
'$thanks' => $datarray [ 'thanks' ],
'$site_admin' => $datarray [ 'site_admin' ],
2016-05-21 07:19:30 -04:00
'$title' => $datarray [ 'title' ],
2013-02-23 11:31:34 -05:00
'$htmlversion' => $datarray [ 'htmlversion' ],
'$content_allowed' => $content_allowed ,
2018-01-15 08:05:12 -05:00
]);
2014-09-03 18:58:52 -04:00
2011-12-24 02:07:05 -05:00
// load the template for private message notifications
2018-10-31 10:44:06 -04:00
$tpl = Renderer :: getMarkupTemplate ( 'email_notify_text.tpl' );
2018-10-31 10:35:50 -04:00
$email_text_body = Renderer :: replaceMacros ( $tpl , [
2012-02-27 02:54:04 -05:00
'$banner' => $datarray [ 'banner' ],
'$product' => $datarray [ 'product' ],
'$preamble' => $datarray [ 'preamble' ],
'$sitename' => $datarray [ 'sitename' ],
'$siteurl' => $datarray [ 'siteurl' ],
'$source_name' => $datarray [ 'source_name' ],
'$source_link' => $datarray [ 'source_link' ],
'$source_photo' => $datarray [ 'source_photo' ],
2018-07-10 08:27:56 -04:00
'$username' => $datarray [ 'username' ],
2012-02-27 02:54:04 -05:00
'$tsitelink' => $datarray [ 'tsitelink' ],
'$titemlink' => $datarray [ 'titemlink' ],
'$thanks' => $datarray [ 'thanks' ],
'$site_admin' => $datarray [ 'site_admin' ],
2016-05-21 07:19:30 -04:00
'$title' => $datarray [ 'title' ],
2014-09-03 18:58:52 -04:00
'$textversion' => $datarray [ 'textversion' ],
2013-02-23 11:31:34 -05:00
'$content_allowed' => $content_allowed ,
2018-01-15 08:05:12 -05:00
]);
2011-12-24 02:07:05 -05:00
2018-10-20 09:02:10 -04:00
L10n :: popLang ();
2014-09-06 09:52:53 -04:00
// use the Emailer class to send the message
2019-01-21 11:36:01 -05:00
return Emailer :: send ([
2014-12-29 10:04:51 -05:00
'uid' => $params [ 'uid' ],
2011-12-26 02:00:19 -05:00
'fromName' => $sender_name ,
'fromEmail' => $sender_email ,
'replyTo' => $sender_email ,
'toEmail' => $params [ 'to_email' ],
2012-02-27 02:54:04 -05:00
'messageSubject' => $datarray [ 'subject' ],
2011-12-26 02:00:19 -05:00
'htmlVersion' => $email_html_body ,
2012-02-25 19:56:14 -05:00
'textVersion' => $email_text_body ,
2019-01-21 11:36:01 -05:00
'additionalMailHeader' => $datarray [ 'headers' ]
]);
2011-12-24 02:07:05 -05:00
}
2012-02-18 05:57:42 -05:00
2018-10-20 09:02:10 -04:00
L10n :: popLang ();
2017-11-20 15:37:30 -05:00
return false ;
2011-12-24 02:07:05 -05:00
}
2011-12-08 04:28:27 -05:00
2018-01-07 06:08:36 -05:00
/**
* @ brief Checks for users who should be notified
*
* @ param int $itemid ID of the item for which the check should be done
2019-01-07 10:24:06 -05:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2018-01-07 06:08:36 -05:00
*/
function check_user_notification ( $itemid ) {
// fetch all users in the thread
2018-07-20 08:19:26 -04:00
$users = DBA :: p ( " SELECT DISTINCT(`contact`.`uid`) FROM `item`
2018-01-07 07:10:31 -05:00
INNER JOIN `contact` ON `contact` . `id` = `item` . `contact-id` AND `contact` . `uid` != 0
WHERE `parent` IN ( SELECT `parent` FROM `item` WHERE `id` = ? ) " , $itemid );
2018-07-20 08:19:26 -04:00
while ( $user = DBA :: fetch ( $users )) {
2018-01-07 06:08:36 -05:00
check_item_notification ( $itemid , $user [ 'uid' ]);
}
2018-07-20 08:19:26 -04:00
DBA :: close ( $users );
2018-01-07 06:08:36 -05:00
}
2016-01-28 16:58:05 -05:00
/**
* @ brief Checks for item related notifications and sends them
*
2019-01-07 10:24:06 -05:00
* @ param int $itemid ID of the item for which the check should be done
* @ param int $uid User ID
2018-07-19 22:15:21 -04:00
* @ param string $defaulttype ( Optional ) Forces a notification with this type .
2019-01-07 10:24:06 -05:00
* @ return bool
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2016-01-28 16:58:05 -05:00
*/
2016-01-28 21:02:15 -05:00
function check_item_notification ( $itemid , $uid , $defaulttype = " " ) {
2018-01-15 08:05:12 -05:00
$notification_data = [ " uid " => $uid , " profiles " => []];
2018-12-26 01:06:24 -05:00
Hook :: callAll ( 'check_item_notification' , $notification_data );
2016-01-28 21:02:15 -05:00
$profiles = $notification_data [ " profiles " ];
2016-01-28 16:58:05 -05:00
2018-08-23 04:00:25 -04:00
$fields = [ 'nickname' ];
2018-07-20 08:19:26 -04:00
$user = DBA :: selectFirst ( 'user' , $fields , [ 'uid' => $uid ]);
2018-07-21 08:46:04 -04:00
if ( ! DBA :: isResult ( $user )) {
2016-01-28 16:58:05 -05:00
return false ;
2018-01-07 13:06:06 -05:00
}
2016-01-28 16:58:05 -05:00
2018-07-20 08:19:26 -04:00
$owner = DBA :: selectFirst ( 'contact' , [ 'url' ], [ 'self' => true , 'uid' => $uid ]);
2018-07-21 08:46:04 -04:00
if ( ! DBA :: isResult ( $owner )) {
2016-01-28 16:58:05 -05:00
return false ;
2018-01-07 13:06:06 -05:00
}
2016-01-28 16:58:05 -05:00
2016-05-21 07:19:30 -04:00
// This is our regular URL format
2018-01-07 13:06:06 -05:00
$profiles [] = $owner [ " url " ];
2016-01-28 16:58:05 -05:00
2016-05-21 07:19:30 -04:00
// Notifications from Diaspora are often with an URL in the Diaspora format
2018-01-07 13:06:06 -05:00
$profiles [] = System :: baseUrl () . " /u/ " . $user [ " nickname " ];
2016-05-21 07:19:30 -04:00
2018-01-15 08:05:12 -05:00
$profiles2 = [];
2016-01-28 21:02:15 -05:00
foreach ( $profiles AS $profile ) {
2016-05-21 07:19:30 -04:00
// Check for invalid profile urls. 13 should be the shortest possible profile length:
// http://a.bc/d
// Additionally check for invalid urls that would return the normalised value "http:"
2018-11-08 11:28:29 -05:00
if (( strlen ( $profile ) >= 13 ) && ( Strings :: normaliseLink ( $profile ) != " http: " )) {
2016-05-21 07:19:30 -04:00
if ( ! in_array ( $profile , $profiles2 ))
$profiles2 [] = $profile ;
2018-11-08 11:28:29 -05:00
$profile = Strings :: normaliseLink ( $profile );
2016-05-21 07:19:30 -04:00
if ( ! in_array ( $profile , $profiles2 ))
$profiles2 [] = $profile ;
$profile = str_replace ( " http:// " , " https:// " , $profile );
if ( ! in_array ( $profile , $profiles2 ))
$profiles2 [] = $profile ;
}
2016-01-28 21:02:15 -05:00
}
2016-01-28 19:18:18 -05:00
2016-01-28 21:02:15 -05:00
$profiles = $profiles2 ;
2018-07-20 08:19:26 -04:00
$ret = DBA :: select ( 'contact' , [ 'id' ], [ 'uid' => 0 , 'nurl' => $profiles ]);
2016-01-28 21:02:15 -05:00
2018-06-16 11:35:30 -04:00
$contacts = [];
2016-01-28 21:02:15 -05:00
2018-07-20 08:19:26 -04:00
while ( $contact = DBA :: fetch ( $ret )) {
2018-06-16 11:35:30 -04:00
$contacts [] = $contact [ 'id' ];
2016-01-28 21:02:15 -05:00
}
2018-07-20 08:19:26 -04:00
DBA :: close ( $ret );
2016-01-28 19:18:18 -05:00
2016-01-28 16:58:05 -05:00
// Only act if it is a "real" post
// We need the additional check for the "local_profile" because of mixed situations on connector networks
2018-06-30 09:54:01 -04: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 01:44:09 -04:00
$condition = [ 'id' => $itemid , 'gravity' => [ GRAVITY_PARENT , GRAVITY_COMMENT ], 'deleted' => false ];
2019-03-15 01:23:45 -04:00
$item = Item :: selectFirstForUser ( $uid , $fields , $condition );
2018-07-21 08:46:04 -04:00
if ( ! DBA :: isResult ( $item ) || in_array ( $item [ 'author-id' ], $contacts )) {
2019-01-21 11:36:01 -05:00
return false ;
2018-06-15 18:30:49 -04:00
}
2018-06-09 12:56:37 -04:00
2016-01-28 16:58:05 -05:00
// Generate the notification array
2018-01-15 08:05:12 -05:00
$params = [];
2016-01-28 16:58:05 -05:00
$params [ " uid " ] = $uid ;
2018-06-30 09:54:01 -04:00
$params [ " item " ] = $item ;
$params [ " parent " ] = $item [ " parent " ];
$params [ " link " ] = System :: baseUrl () . '/display/' . urlencode ( $item [ " guid " ]);
2016-01-28 16:58:05 -05:00
$params [ " otype " ] = 'item' ;
2018-06-30 09:54:01 -04:00
$params [ " source_name " ] = $item [ " author-name " ];
$params [ " source_link " ] = $item [ " author-link " ];
$params [ " source_photo " ] = $item [ " author-avatar " ];
2016-01-28 16:58:05 -05:00
2018-06-30 09:54:01 -04:00
if ( $item [ " parent-uri " ] === $item [ " uri " ]) {
2016-05-21 07:19:30 -04:00
// Send a notification for every new post?
2018-07-20 08:19:26 -04:00
$send_notification = DBA :: exists ( 'contact' , [ 'id' => $item [ 'contact-id' ], 'notify_new_posts' => true ]);
2016-05-21 07:19:30 -04:00
if ( ! $send_notification ) {
$tags = q ( " SELECT `url` FROM `term` WHERE `otype` = %d AND `oid` = %d AND `type` = %d AND `uid` = %d " ,
intval ( TERM_OBJ_POST ), intval ( $itemid ), intval ( TERM_MENTION ), intval ( $uid ));
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $tags )) {
2016-05-21 07:19:30 -04:00
foreach ( $tags AS $tag ) {
2018-11-08 11:28:29 -05:00
$condition = [ 'nurl' => Strings :: normaliseLink ( $tag [ " url " ]), 'uid' => $uid , 'notify_new_posts' => true ];
2018-07-20 08:19:26 -04:00
$r = DBA :: exists ( 'contact' , $condition );
2018-01-07 13:06:06 -05:00
if ( $r ) {
2016-05-21 07:19:30 -04:00
$send_notification = true ;
2018-01-07 13:06:06 -05:00
}
2016-05-21 07:19:30 -04:00
}
}
}
2016-01-28 16:58:05 -05:00
if ( $send_notification ) {
$params [ " type " ] = NOTIFY_SHARE ;
$params [ " verb " ] = ACTIVITY_TAG ;
}
}
// Is the user mentioned in this post?
2016-01-28 21:02:15 -05:00
$tagged = false ;
foreach ( $profiles AS $profile ) {
2018-06-30 09:54:01 -04:00
if ( strpos ( $item [ " tag " ], " = " . $profile . " ] " ) || strpos ( $item [ " body " ], " = " . $profile . " ] " ))
2016-01-28 21:02:15 -05:00
$tagged = true ;
}
2018-06-30 09:54:01 -04:00
if ( $item [ " mention " ] || $tagged || ( $defaulttype == NOTIFY_TAGSELF )) {
2016-01-28 16:58:05 -05:00
$params [ " type " ] = NOTIFY_TAGSELF ;
$params [ " verb " ] = ACTIVITY_TAG ;
}
2018-08-12 00:34:56 -04:00
// Is it a post that the user had started?
$fields = [ 'ignored' , 'mention' ];
2019-09-10 01:44:09 -04:00
$thread = Item :: selectFirstThreadForUser ( $params [ 'uid' ], $fields , [ 'iid' => $item [ " parent " ], 'deleted' => false ]);
2016-01-28 21:02:15 -05:00
2018-08-12 00:34:56 -04:00
if ( $thread [ 'mention' ] && ! $thread [ 'ignored' ] && ! isset ( $params [ " type " ])) {
2016-01-28 16:58:05 -05:00
$params [ " type " ] = NOTIFY_COMMENT ;
$params [ " verb " ] = ACTIVITY_POST ;
}
2018-08-12 00:34:56 -04:00
// And now we check for participation of one of our contacts in the thread
2019-09-10 01:44:09 -04:00
$condition = [ 'parent' => $item [ " parent " ], 'author-id' => $contacts , 'deleted' => false ];
2018-08-12 00:34:56 -04:00
if ( ! $thread [ 'ignored' ] && ! isset ( $params [ " type " ]) && Item :: exists ( $condition )) {
$params [ " type " ] = NOTIFY_COMMENT ;
$params [ " verb " ] = ACTIVITY_POST ;
}
if ( isset ( $params [ " type " ])) {
2016-01-28 16:58:05 -05:00
notification ( $params );
2018-08-12 00:34:56 -04:00
}
2016-01-28 16:58:05 -05:00
}
2016-10-28 06:28:16 -04:00
/**
* @ brief Formats a notification message with the notification author
*
* Replace the name with { 0 } but ensure to make that only once . The { 0 } is used
* later and prints the name in bold .
*
* @ param string $name
* @ param string $message
* @ return string Formatted message
*/
function format_notification_message ( $name , $message ) {
if ( $name != '' ) {
$pos = strpos ( $message , $name );
} else {
$pos = false ;
}
if ( $pos !== false ) {
$message = substr_replace ( $message , '{0}' , $pos , strlen ( $name ));
}
return $message ;
2016-11-03 09:00:20 -04:00
}