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-01-17 19:42:40 +01:00
use Friendica\Core\Addon ;
2017-11-07 03:22:52 +01:00
use Friendica\Core\Config ;
2018-01-21 17:38:01 +01:00
use Friendica\Core\L10n ;
2018-10-29 22:20:46 +01:00
use Friendica\Core\Logger ;
2017-08-26 08:04:21 +02:00
use Friendica\Core\System ;
2018-07-20 14:19:26 +02:00
use Friendica\Database\DBA ;
2018-07-28 01:25:57 +02:00
use Friendica\Model\Contact ;
2018-07-20 04:15:21 +02:00
use Friendica\Model\Item ;
2018-01-27 03:38:34 +01:00
use Friendica\Util\DateTimeFormat ;
2017-11-20 21:37:30 +01:00
use Friendica\Util\Emailer ;
2017-04-30 06:07:00 +02:00
2016-05-21 13:19:30 +02:00
/**
* @ brief Creates a notification entry and possibly sends a mail
*
* @ param array $params Array with the elements :
2018-03-19 10:15:09 +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
2016-05-21 13:19:30 +02:00
*/
2018-01-04 03:12:19 +01:00
function notification ( $params )
{
2011-12-08 10:28:27 +01:00
$a = get_app ();
2012-03-26 10:43:26 +02:00
2018-08-02 07:21:01 +02:00
// Temporary logging for finding the origin
if ( ! isset ( $params [ 'language' ]) || ! isset ( $params [ 'uid' ])) {
2018-10-29 22:20:46 +01:00
Logger :: log ( 'Missing parameters.' . 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 )) {
2018-10-29 22:20:46 +01:00
Logger :: log ( 'Unknown user ' . $params [ 'uid' ]);
2018-08-23 10:00:25 +02:00
return ;
}
$params [ 'notify_flags' ] = defaults ( $params , 'notify_flags' , $user [ 'notify-flags' ]);
2018-10-16 05:13:00 +02:00
$params [ 'language' ] = defaults ( $params , 'language' , $user [ 'language' ]);
$params [ 'to_name' ] = defaults ( $params , 'to_name' , $user [ 'username' ]);
$params [ 'to_email' ] = defaults ( $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
2018-01-21 17:38:01 +01:00
L10n :: pushLang ( $params [ 'language' ]);
2012-03-26 10:43:26 +02:00
2018-01-21 19:33:59 +01:00
$banner = L10n :: t ( 'Friendica Notification' );
2014-09-06 18:15:18 +02:00
$product = FRIENDICA_PLATFORM ;
2017-08-26 09:32:10 +02:00
$siteurl = System :: baseUrl ( true );
2018-01-21 19:33:59 +01:00
$thanks = L10n :: t ( 'Thank You,' );
2018-07-07 23:46:30 +02: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-04 03:12:19 +01:00
} else {
2018-07-07 23:46:30 +02:00
$site_admin = L10n :: t ( '%s Administrator' , $sitename );
2018-01-04 03:12:19 +01:00
}
2014-09-06 18:15:18 +02:00
2015-01-31 18:44:30 +01:00
$sender_name = $sitename ;
2018-10-09 19:58:58 +02:00
$hostname = $a -> 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
2018-04-07 03:47:42 +02:00
$sender_email = $a -> getSenderEmailAddress ();
2014-09-06 18:15:18 +02:00
2017-09-08 17:14:33 +02:00
if ( $params [ 'type' ] != SYSTEM_EMAIL ) {
2018-07-20 14:19:26 +02:00
$user = DBA :: selectFirst ( 'user' , [ 'nickname' , 'page-flags' ],
2018-01-10 19:04:00 +01:00
[ 'uid' => $params [ 'uid' ]]);
2017-08-12 07:08:45 +02:00
2017-09-08 17:14:33 +02:00
// There is no need to create notifications for forum accounts
2018-07-28 01:25:57 +02:00
if ( ! DBA :: isResult ( $user ) || in_array ( $user [ " page-flags " ], [ Contact :: PAGE_COMMUNITY , Contact :: PAGE_PRVGROUP ])) {
2017-09-08 17:14:33 +02:00
return ;
}
2018-08-02 07:21:01 +02:00
$nickname = $user [ " nickname " ];
} else {
$nickname = '' ;
2017-08-12 07:08:45 +02:00
}
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
$additional_mail_header = " " ;
$additional_mail_header .= " Precedence: list \n " ;
$additional_mail_header .= " X-Friendica-Host: " . $hostname . " \n " ;
2014-12-23 00:55:36 +01:00
$additional_mail_header .= " X-Friendica-Account: < " . $nickname . " @ " . $hostname . " > \n " ;
2014-09-06 18:15:18 +02: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 09:32:10 +02:00
$additional_mail_header .= " List-Archive: < " . System :: baseUrl () . " /notifications/system> \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 = '' ;
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_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
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] New mail received at %s' , $sitename );
2011-12-24 08:07:05 +01:00
2018-01-24 03:59:16 +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
2018-01-21 19:33:59 +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
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_COMMENT ) {
2018-08-08 22:32:11 +02:00
$thread = Item :: selectFirstThreadForUser ( $params [ 'uid' ] ,[ 'ignored' ], [ 'iid' => $parent_id ]);
2018-07-21 14:46:04 +02:00
if ( DBA :: isResult ( $thread ) && $thread [ " ignored " ]) {
2018-10-30 14:58:45 +01:00
Logger :: log ( " Thread " . $parent_id . " will be ignored " , Logger :: DEBUG );
2018-10-20 15:02:10 +02:00
L10n :: popLang ();
2014-09-04 00:58:52 +02:00
return ;
}
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
2018-08-19 14:46:11 +02:00
$condition = [ 'type' => [ NOTIFY_TAGSELF , NOTIFY_COMMENT , NOTIFY_SHARE ],
'link' => $params [ 'link' ], 'uid' => $params [ 'uid' ]];
if ( DBA :: exists ( 'notify' , $condition )) {
2018-01-21 17:38:01 +01:00
L10n :: popLang ();
2012-07-04 06:40:13 +02:00
return ;
}
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 ;
2012-03-01 03:19:08 +01:00
2016-05-21 13:19:30 +02:00
if ( $params [ 'otype' ] === 'item' && $parent_id ) {
2018-07-10 14:27:56 +02:00
$item = Item :: selectFirstForUser ( $params [ 'uid' ], Item :: ITEM_FIELDLIST , [ 'id' => $parent_id ]);
2012-03-01 03:19:08 +01:00
}
2018-01-11 09:26:30 +01:00
$item_post_type = item_post_type ( $item );
2018-07-10 14:27:56 +02:00
$itemlink = $item [ 'plink' ];
2012-03-01 04:23:01 +01:00
// "a post"
2018-01-24 03:59:16 +01:00
$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
);
2012-03-01 04:23:01 +01:00
// "George Bull's post"
2018-01-11 09:26:30 +01:00
if ( $item ) {
2018-01-24 03:59:16 +01:00
$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-04 03:12:19 +01:00
}
2014-01-05 16:10:02 +01:00
2012-03-01 04:23:01 +01:00
// "your post"
2018-07-21 14:46:04 +02:00
if ( DBA :: isResult ( $item ) && $item [ 'owner-id' ] == $item [ 'author-id' ] && $item [ 'wall' ]) {
2018-01-24 03:59:16 +01:00
$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
);
2018-01-04 03:12:19 +01:00
}
2012-03-01 03:19:08 +01:00
2012-02-26 01:56:14 +01:00
// Some mail softwares relies on subject field for threading.
// 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
2012-02-26 01:56:14 +01:00
// differents subjects for messages on the same thread.
2012-02-28 02:18:19 +01:00
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] Comment to conversation #%1$d by %2$s' , $parent_id , $params [ 'source_name' ]);
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +01:00
$preamble = L10n :: t ( '%s commented on an item/conversation you have been following.' , $params [ 'source_name' ]);
2014-01-05 16:10:02 +01:00
$epreamble = $dest_str ;
2012-02-18 12:18:20 +01:00
2018-01-21 19:33:59 +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>' );
2011-12-26 23:16:25 +01:00
$itemlink = $params [ 'link' ];
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_WALL ) {
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] %s posted to your profile wall' , $params [ 'source_name' ]);
2014-01-05 16:10:02 +01:00
2018-01-24 03:59:16 +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]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2014-01-05 16:10:02 +01:00
2018-01-21 19:33:59 +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>' );
2011-12-26 23:16:25 +01:00
$itemlink = $params [ 'link' ];
2011-12-08 10:28:27 +01:00
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_TAGSELF ) {
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] %s tagged you' , $params [ 'source_name' ]);
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +01:00
$preamble = L10n :: t ( '%1$s tagged you at %2$s' , $params [ 'source_name' ], $sitename );
$epreamble = L10n :: t ( '%1$s [url=%2$s]tagged you[/url].' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2014-01-05 16:10:02 +01:00
2018-01-21 19:33:59 +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' ];
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_SHARE ) {
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] %s shared a new post' , $params [ 'source_name' ]);
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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].' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2012-02-09 23:06:17 +01:00
2018-01-21 19:33:59 +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' ];
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_POKE ) {
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] %1$s poked you' , $params [ 'source_name' ]);
2012-07-20 05:13:40 +02:00
2018-01-24 03:59:16 +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].' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2012-07-20 05:13:40 +02:00
2018-01-21 19:33:59 +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
2018-01-21 19:33:59 +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' ];
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_TAGSHARE ) {
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] %s tagged your post' , $params [ 'source_name' ]);
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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]' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink
);
2012-02-09 23:06:17 +01:00
2018-01-21 19:33:59 +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
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_INTRO ) {
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] Introduction received' );
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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.' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +01:00
$body = L10n :: t ( 'You may visit their profile at %s' , $params [ 'source_link' ]);
2011-12-27 00:47:40 +01:00
2018-01-21 19:33:59 +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' ]) {
case ACTIVITY_FRIEND :
// someone started to share with user (mostly OStatus)
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] A new person is sharing with you' );
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$sitename
);
2014-09-06 18:15:18 +02:00
break ;
case ACTIVITY_FOLLOW :
// someone started to follow the user (mostly OStatus)
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] You have a new follower' );
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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' ,
'[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
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_SUGGEST ) {
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] Friend suggestion received' );
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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.' ,
$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
2018-01-21 19:33:59 +01:00
$body = L10n :: t ( 'Name:' ) . ' ' . $params [ 'item' ][ 'name' ] . " \n " ;
$body .= L10n :: t ( 'Photo:' ) . ' ' . $params [ 'item' ][ 'photo' ] . " \n " ;
2018-01-24 03:59:16 +01:00
$body .= L10n :: t ( 'You may visit their profile at %s' , $params [ 'item' ][ 'url' ]);
2012-01-04 02:29:07 +01:00
2018-01-21 19:33:59 +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
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_CONFIRM ) {
if ( $params [ 'verb' ] == ACTIVITY_FRIEND ) { // mutual connection
2018-07-10 14:27:56 +02:00
$itemlink = $params [ 'link' ];
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] Connection accepted' );
2014-09-06 18:15:18 +02:00
2018-01-24 03:59:16 +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].' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 13:19:30 +02:00
2018-01-21 19:33:59 +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
2018-01-21 19:33:59 +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' ];
2018-01-24 03:59:16 +01:00
$subject = L10n :: t ( '[Friendica:Notify] Connection accepted' );
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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].' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 13:19:30 +02:00
2018-01-24 22:51:32 +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 " ;
2018-01-24 03:59:16 +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
2018-01-21 19:33:59 +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
}
2016-05-21 13:19:30 +02:00
if ( $params [ 'type' ] == NOTIFY_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' ];
2018-04-15 11:39:05 +02:00
$subject = L10n :: t ( '[Friendica System Notify]' ) . ' ' . L10n :: t ( 'registration request' );
2016-05-21 13:19:30 +02:00
2018-01-24 03:59:16 +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.' ,
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2018-06-15 05:42:08 +02: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
2018-01-21 19:33:59 +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
}
2017-09-08 17:14:33 +02:00
if ( $params [ 'type' ] == SYSTEM_EMAIL ) {
2014-09-07 10:27:39 +02: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)
2016-05-21 13:19:30 +02:00
$subject = $params [ 'subject' ];
$preamble = $params [ 'preamble' ];
$body = $params [ 'body' ];
$sitelink = " " ;
$tsitelink = " " ;
$hsitelink = " " ;
$itemlink = " " ;
$show_in_notification_page = false ;
2011-12-27 00:47:40 +01: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-01-17 19:42:40 +01:00
Addon :: callHooks ( '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
2014-09-07 10:27:39 +02:00
if ( $show_in_notification_page ) {
2018-10-30 14:58:45 +01:00
Logger :: log ( " adding notification entry " , Logger :: DEBUG );
2014-09-06 18:15:18 +02:00
do {
$dups = false ;
$hash = random_string ();
2018-08-19 14:46:11 +02:00
if ( DBA :: exists ( 'notify' , [ 'hash' => $hash ])) {
2014-09-06 18:15:18 +02:00
$dups = true ;
2017-04-04 19:47:32 +02:00
}
} while ( $dups == true );
2012-02-18 11:57:42 +01:00
2017-04-04 19:47:32 +02:00
/// @TODO One statement is enough
2018-01-15 14:05:12 +01:00
$datarray = [];
2014-09-06 18:15:18 +02:00
$datarray [ 'hash' ] = $hash ;
$datarray [ 'name' ] = $params [ 'source_name' ];
2018-02-15 03:33:55 +01:00
$datarray [ 'name_cache' ] = strip_tags ( BBCode :: convert ( $params [ 'source_name' ]));
2014-09-06 18:15:18 +02:00
$datarray [ 'url' ] = $params [ 'source_link' ];
$datarray [ 'photo' ] = $params [ 'source_photo' ];
2018-01-27 03:38:34 +01:00
$datarray [ 'date' ] = DateTimeFormat :: utcNow ();
2014-09-06 18:15:18 +02:00
$datarray [ 'uid' ] = $params [ 'uid' ];
$datarray [ 'link' ] = $itemlink ;
2015-04-16 07:18:06 +02:00
$datarray [ 'iid' ] = $item_id ;
2014-09-06 18:15:18 +02:00
$datarray [ 'parent' ] = $parent_id ;
$datarray [ 'type' ] = $params [ 'type' ];
$datarray [ 'verb' ] = $params [ 'verb' ];
$datarray [ 'otype' ] = $params [ 'otype' ];
$datarray [ 'abort' ] = false ;
2012-02-21 04:50:05 +01:00
2018-01-17 19:42:40 +01:00
Addon :: callHooks ( 'enotify_store' , $datarray );
2013-02-08 08:43:55 +01:00
2016-05-21 13:19:30 +02:00
if ( $datarray [ 'abort' ]) {
2018-01-21 17:38:01 +01:00
L10n :: popLang ();
2014-09-06 18:15:18 +02:00
return False ;
2013-02-08 08:43:55 +01:00
}
2014-09-06 18:15:18 +02:00
// create notification entry in DB
2018-08-19 14:46:11 +02: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 08:43:55 +01:00
2018-08-19 14:46:11 +02:00
$notify_id = DBA :: lastInsertId ();
2013-02-08 08:43:55 +01:00
2014-09-06 18:15:18 +02: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-05 00:12:28 +01:00
$p = q ( " SELECT `id` FROM `notify` WHERE `type` IN (%d, %d) AND `link` = '%s' AND `uid` = %d ORDER BY `id` " ,
2014-09-06 18:15:18 +02:00
intval ( NOTIFY_TAGSELF ),
intval ( NOTIFY_COMMENT ),
2018-07-21 15:10:13 +02:00
DBA :: escape ( $params [ 'link' ]),
2014-09-06 18:15:18 +02:00
intval ( $params [ 'uid' ])
);
2016-05-21 13:19:30 +02:00
if ( $p && ( count ( $p ) > 1 )) {
2014-09-06 18:15:18 +02:00
for ( $d = 1 ; $d < count ( $p ); $d ++ ) {
2018-07-20 14:19:26 +02:00
DBA :: delete ( 'notify' , [ 'id' => $p [ $d ][ 'id' ]]);
2014-09-06 18:15:18 +02:00
}
// only continue on if we stored the first one
2016-05-21 13:19:30 +02:00
if ( $notify_id != $p [ 0 ][ 'id' ]) {
2018-01-21 17:38:01 +01:00
L10n :: popLang ();
return false ;
2014-09-06 18:15:18 +02:00
}
}
2014-03-11 23:52:32 +01:00
2017-08-26 09:32:10 +02:00
$itemlink = System :: baseUrl () . '/notify/view/' . $notify_id ;
2018-01-15 14:05:12 +01:00
$msg = replace_macros ( $epreamble , [ '$itemlink' => $itemlink ]);
2018-02-15 03:33:55 +01:00
$msg_cache = format_notification_message ( $datarray [ 'name_cache' ], strip_tags ( BBCode :: convert ( $msg )));
2018-08-19 14:46:11 +02:00
$fields = [ 'msg' => $msg , 'msg_cache' => $msg_cache ];
$condition = [ 'id' => $notify_id , 'uid' => $params [ 'uid' ]];
DBA :: update ( 'notify' , $fields , $condition );
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' ]))
2014-09-07 10:27:39 +02:00
|| $params [ 'type' ] == NOTIFY_SYSTEM
2017-09-08 17:14:33 +02:00
|| $params [ 'type' ] == SYSTEM_EMAIL ) {
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 )) {
2014-08-21 00:53:01 +02: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' ]])) {
2018-10-30 14:58:45 +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
$fields = [ 'notify-id' => $notify_id , 'master-parent-item' => $params [ 'parent' ],
'receiver-uid' => $params [ 'uid' ], 'parent-item' => 0 ];
DBA :: insert ( 'notify-threads' , $fields );
2014-08-21 00:53:01 +02:00
$additional_mail_header .= " Message-ID: < ${ id_for_parent } > \n " ;
2016-05-21 13:19:30 +02: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
}
2018-06-15 05:42:08 +02:00
$textversion = BBCode :: toPlaintext ( $body );
$htmlversion = BBCode :: convert ( $body );
2014-09-07 10:27:39 +02:00
2018-01-15 14:05:12 +01:00
$datarray = [];
2012-02-27 08:54:04 +01:00
$datarray [ 'banner' ] = $banner ;
$datarray [ 'product' ] = $product ;
$datarray [ 'preamble' ] = $preamble ;
$datarray [ 'sitename' ] = $sitename ;
$datarray [ 'siteurl' ] = $siteurl ;
2012-02-28 02:18:19 +01:00
$datarray [ 'type' ] = $params [ 'type' ];
2018-07-10 14:27:56 +02:00
$datarray [ 'parent' ] = $parent_id ;
2018-08-02 07:21:01 +02:00
$datarray [ 'source_name' ] = defaults ( $params , 'source_name' , '' );
$datarray [ 'source_link' ] = defaults ( $params , 'source_link' , '' );
$datarray [ 'source_photo' ] = defaults ( $params , 'source_photo' , '' );
2012-02-28 02:18:19 +01:00
$datarray [ 'uid' ] = $params [ 'uid' ];
2018-08-02 07:21:01 +02:00
$datarray [ 'username' ] = defaults ( $params , 'to_name' , '' );
2012-02-27 08:54:04 +01:00
$datarray [ 'hsitelink' ] = $hsitelink ;
$datarray [ 'tsitelink' ] = $tsitelink ;
2016-05-21 13:19:30 +02:00
$datarray [ 'hitemlink' ] = '<a href="' . $itemlink . '">' . $itemlink . '</a>' ;
2012-02-27 08:54:04 +01: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-01-17 19:42:40 +01:00
Addon :: callHooks ( 'enotify_mail' , $datarray );
2012-02-27 08:54:04 +01:00
2013-02-23 17:31:34 +01:00
// check whether sending post content in email notifications is allowed
2017-09-08 17:14:33 +02:00
// always true for SYSTEM_EMAIL
2017-11-07 03:22:52 +01:00
$content_allowed = (( ! Config :: get ( 'system' , 'enotify_no_content' )) || ( $params [ 'type' ] == SYSTEM_EMAIL ));
2013-02-23 17:31:34 +01:00
2011-12-24 08:07:05 +01:00
// load the template for private message notifications
2011-12-26 08:00:19 +01:00
$tpl = get_markup_template ( 'email_notify_html.tpl' );
2018-01-15 14:05:12 +01:00
$email_html_body = replace_macros ( $tpl , [
2012-02-27 08:54:04 +01:00
'$banner' => $datarray [ 'banner' ],
'$product' => $datarray [ 'product' ],
2016-05-21 13:19:30 +02:00
'$preamble' => str_replace ( " \n " , " <br> \n " , $datarray [ 'preamble' ]),
2012-02-27 08:54:04 +01: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 14:27:56 +02:00
'$username' => $datarray [ 'username' ],
2012-02-27 08:54:04 +01:00
'$hsitelink' => $datarray [ 'hsitelink' ],
'$hitemlink' => $datarray [ 'hitemlink' ],
'$thanks' => $datarray [ 'thanks' ],
'$site_admin' => $datarray [ 'site_admin' ],
2016-05-21 13:19:30 +02:00
'$title' => $datarray [ 'title' ],
2013-02-23 17:31:34 +01:00
'$htmlversion' => $datarray [ 'htmlversion' ],
'$content_allowed' => $content_allowed ,
2018-01-15 14:05:12 +01:00
]);
2014-09-04 00:58:52 +02:00
2011-12-24 08:07:05 +01:00
// load the template for private message notifications
2011-12-26 08:00:19 +01:00
$tpl = get_markup_template ( 'email_notify_text.tpl' );
2018-01-15 14:05:12 +01:00
$email_text_body = replace_macros ( $tpl , [
2012-02-27 08:54:04 +01: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 14:27:56 +02:00
'$username' => $datarray [ 'username' ],
2012-02-27 08:54:04 +01:00
'$tsitelink' => $datarray [ 'tsitelink' ],
'$titemlink' => $datarray [ 'titemlink' ],
'$thanks' => $datarray [ 'thanks' ],
'$site_admin' => $datarray [ 'site_admin' ],
2016-05-21 13:19:30 +02:00
'$title' => $datarray [ 'title' ],
2014-09-04 00:58:52 +02:00
'$textversion' => $datarray [ 'textversion' ],
2013-02-23 17:31:34 +01:00
'$content_allowed' => $content_allowed ,
2018-01-15 14:05:12 +01:00
]);
2011-12-24 08:07:05 +01:00
2018-10-20 15:02:10 +02:00
L10n :: popLang ();
2014-09-06 15:52:53 +02:00
// use the Emailer class to send the message
2017-11-20 21:37:30 +01:00
return Emailer :: send (
2018-01-15 14:05:12 +01:00
[
2014-12-29 16:04:51 +01:00
'uid' => $params [ 'uid' ],
2011-12-26 08:00:19 +01:00
'fromName' => $sender_name ,
'fromEmail' => $sender_email ,
'replyTo' => $sender_email ,
'toEmail' => $params [ 'to_email' ],
2012-02-27 08:54:04 +01:00
'messageSubject' => $datarray [ 'subject' ],
2011-12-26 08:00:19 +01:00
'htmlVersion' => $email_html_body ,
2012-02-26 01:56:14 +01:00
'textVersion' => $email_text_body ,
2018-01-15 14:05:12 +01:00
'additionalMailHeader' => $datarray [ 'headers' ]]
2017-11-20 21:37:30 +01:00
);
2011-12-24 08:07:05 +01:00
}
2012-02-18 11:57:42 +01:00
2018-10-20 15:02:10 +02:00
L10n :: popLang ();
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
/**
* @ brief Checks for users who should be notified
*
* @ param int $itemid ID of the item for which the check should be done
*/
function check_user_notification ( $itemid ) {
// fetch all users in the thread
2018-07-20 14:19:26 +02:00
$users = DBA :: p ( " SELECT DISTINCT(`contact`.`uid`) FROM `item`
2018-01-07 13:10:31 +01: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 14:19:26 +02:00
while ( $user = DBA :: fetch ( $users )) {
2018-01-07 12:08:36 +01:00
check_item_notification ( $itemid , $user [ 'uid' ]);
}
2018-07-20 14:19:26 +02:00
DBA :: close ( $users );
2018-01-07 12:08:36 +01:00
}
2016-01-28 22:58:05 +01:00
/**
* @ brief Checks for item related notifications and sends them
*
* @ param int $itemid ID of the item for which the check should be done
* @ param int $uid User ID
2018-07-20 04:15:21 +02:00
* @ param string $defaulttype ( Optional ) Forces a notification with this type .
2016-01-28 22:58:05 +01:00
*/
2016-01-29 03:02:15 +01:00
function check_item_notification ( $itemid , $uid , $defaulttype = " " ) {
2018-01-15 14:05:12 +01:00
$notification_data = [ " uid " => $uid , " profiles " => []];
2018-01-17 19:42:40 +01:00
Addon :: callHooks ( 'check_item_notification' , $notification_data );
2016-01-29 03:02:15 +01:00
$profiles = $notification_data [ " profiles " ];
2016-01-28 22:58:05 +01:00
2018-08-23 10:00:25 +02:00
$fields = [ 'nickname' ];
2018-07-20 14:19:26 +02:00
$user = DBA :: selectFirst ( 'user' , $fields , [ 'uid' => $uid ]);
2018-07-21 14:46:04 +02:00
if ( ! DBA :: isResult ( $user )) {
2016-01-28 22:58:05 +01:00
return false ;
2018-01-07 19:06:06 +01:00
}
2016-01-28 22:58:05 +01:00
2018-07-20 14:19:26 +02:00
$owner = DBA :: selectFirst ( 'contact' , [ 'url' ], [ 'self' => true , 'uid' => $uid ]);
2018-07-21 14:46:04 +02:00
if ( ! DBA :: isResult ( $owner )) {
2016-01-28 22:58:05 +01:00
return false ;
2018-01-07 19:06:06 +01:00
}
2016-01-28 22:58:05 +01:00
2016-05-21 13:19:30 +02:00
// This is our regular URL format
2018-01-07 19:06:06 +01:00
$profiles [] = $owner [ " url " ];
2016-01-28 22:58:05 +01:00
2016-05-21 13:19:30 +02:00
// Notifications from Diaspora are often with an URL in the Diaspora format
2018-01-07 19:06:06 +01:00
$profiles [] = System :: baseUrl () . " /u/ " . $user [ " nickname " ];
2016-05-21 13:19:30 +02:00
2018-01-15 14:05:12 +01:00
$profiles2 = [];
2016-01-29 03:02:15 +01:00
foreach ( $profiles AS $profile ) {
2016-05-21 13:19:30 +02: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:"
2017-06-08 04:00:59 +02:00
if (( strlen ( $profile ) >= 13 ) && ( normalise_link ( $profile ) != " http: " )) {
2016-05-21 13:19:30 +02:00
if ( ! in_array ( $profile , $profiles2 ))
$profiles2 [] = $profile ;
$profile = normalise_link ( $profile );
if ( ! in_array ( $profile , $profiles2 ))
$profiles2 [] = $profile ;
$profile = str_replace ( " http:// " , " https:// " , $profile );
if ( ! in_array ( $profile , $profiles2 ))
$profiles2 [] = $profile ;
}
2016-01-29 03:02:15 +01:00
}
2016-01-29 01:18:18 +01:00
2016-01-29 03:02:15 +01:00
$profiles = $profiles2 ;
2018-07-20 14:19:26 +02:00
$ret = DBA :: select ( 'contact' , [ 'id' ], [ 'uid' => 0 , 'nurl' => $profiles ]);
2016-01-29 03:02:15 +01:00
2018-06-16 17:35:30 +02:00
$contacts = [];
2016-01-29 03:02:15 +01:00
2018-07-20 14:19:26 +02:00
while ( $contact = DBA :: fetch ( $ret )) {
2018-06-16 17:35:30 +02:00
$contacts [] = $contact [ 'id' ];
2016-01-29 03:02:15 +01:00
}
2018-07-20 14:19:26 +02:00
DBA :: close ( $ret );
2016-01-29 01:18:18 +01:00
2016-01-28 22:58:05 +01: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 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' ];
$condition = [ 'id' => $itemid , 'gravity' => [ GRAVITY_PARENT , GRAVITY_COMMENT ]];
$item = Item :: selectFirst ( $fields , $condition );
2018-07-21 14:46:04 +02:00
if ( ! DBA :: isResult ( $item ) || in_array ( $item [ 'author-id' ], $contacts )) {
2018-06-30 15:54:01 +02:00
return ;
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 = [];
2016-01-28 22:58:05 +01:00
$params [ " uid " ] = $uid ;
2018-06-30 15:54:01 +02:00
$params [ " item " ] = $item ;
$params [ " parent " ] = $item [ " parent " ];
$params [ " link " ] = System :: baseUrl () . '/display/' . urlencode ( $item [ " guid " ]);
2016-01-28 22:58:05 +01:00
$params [ " otype " ] = 'item' ;
2018-06-30 15:54:01 +02:00
$params [ " source_name " ] = $item [ " author-name " ];
$params [ " source_link " ] = $item [ " author-link " ];
$params [ " source_photo " ] = $item [ " author-avatar " ];
2016-01-28 22:58:05 +01:00
2018-06-30 15:54:01 +02:00
if ( $item [ " parent-uri " ] === $item [ " uri " ]) {
2016-05-21 13:19:30 +02:00
// Send a notification for every new post?
2018-07-20 14:19:26 +02:00
$send_notification = DBA :: exists ( 'contact' , [ 'id' => $item [ 'contact-id' ], 'notify_new_posts' => true ]);
2016-05-21 13:19:30 +02: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 14:46:04 +02:00
if ( DBA :: isResult ( $tags )) {
2016-05-21 13:19:30 +02:00
foreach ( $tags AS $tag ) {
2018-01-07 19:06:06 +01:00
$condition = [ 'nurl' => normalise_link ( $tag [ " url " ]), 'uid' => $uid , 'notify_new_posts' => true ];
2018-07-20 14:19:26 +02:00
$r = DBA :: exists ( 'contact' , $condition );
2018-01-07 19:06:06 +01:00
if ( $r ) {
2016-05-21 13:19:30 +02:00
$send_notification = true ;
2018-01-07 19:06:06 +01:00
}
2016-05-21 13:19:30 +02:00
}
}
}
2016-01-28 22:58:05 +01:00
if ( $send_notification ) {
$params [ " type " ] = NOTIFY_SHARE ;
$params [ " verb " ] = ACTIVITY_TAG ;
}
}
// Is the user mentioned in this post?
2016-01-29 03:02:15 +01:00
$tagged = false ;
foreach ( $profiles AS $profile ) {
2018-06-30 15:54:01 +02:00
if ( strpos ( $item [ " tag " ], " = " . $profile . " ] " ) || strpos ( $item [ " body " ], " = " . $profile . " ] " ))
2016-01-29 03:02:15 +01:00
$tagged = true ;
}
2018-06-30 15:54:01 +02:00
if ( $item [ " mention " ] || $tagged || ( $defaulttype == NOTIFY_TAGSELF )) {
2016-01-28 22:58:05 +01:00
$params [ " type " ] = NOTIFY_TAGSELF ;
$params [ " verb " ] = ACTIVITY_TAG ;
}
2018-08-12 06:34:56 +02:00
// Is it a post that the user had started?
$fields = [ 'ignored' , 'mention' ];
2018-08-08 22:32:11 +02:00
$thread = Item :: selectFirstThreadForUser ( $params [ 'uid' ], $fields , [ 'iid' => $item [ " parent " ]]);
2016-01-29 03:02:15 +01:00
2018-08-12 06:34:56 +02:00
if ( $thread [ 'mention' ] && ! $thread [ 'ignored' ] && ! isset ( $params [ " type " ])) {
2016-01-28 22:58:05 +01:00
$params [ " type " ] = NOTIFY_COMMENT ;
$params [ " verb " ] = ACTIVITY_POST ;
}
2018-08-12 06:34:56 +02:00
// And now we check for participation of one of our contacts in the thread
$condition = [ 'parent' => $item [ " parent " ], 'author-id' => $contacts ];
if ( ! $thread [ 'ignored' ] && ! isset ( $params [ " type " ]) && Item :: exists ( $condition )) {
$params [ " type " ] = NOTIFY_COMMENT ;
$params [ " verb " ] = ACTIVITY_POST ;
}
if ( isset ( $params [ " type " ])) {
2016-01-28 22:58:05 +01:00
notification ( $params );
2018-08-12 06:34:56 +02:00
}
2016-01-28 22:58:05 +01:00
}
2016-10-28 12:28:16 +02: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 14:00:20 +01:00
}