2011-12-08 04:28:27 -05:00
< ? php
2017-11-20 15:37:30 -05:00
/**
2021-03-29 02:40:20 -04:00
* @ copyright Copyright ( C ) 2010 - 2021 , the Friendica project
2020-02-09 10:18:46 -05:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
2017-11-20 15:37:30 -05:00
*/
2018-01-24 21:08:45 -05:00
2018-02-14 21:33:55 -05:00
use Friendica\Content\Text\BBCode ;
2021-01-30 17:03:53 -05:00
use Friendica\Content\Text\Plaintext ;
2018-12-26 01:06:24 -05:00
use Friendica\Core\Hook ;
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 ;
2019-12-15 18:47:24 -05:00
use Friendica\DI ;
2020-11-25 14:56:39 -05:00
use Friendica\Model\Contact ;
2018-07-19 22:15:21 -04:00
use Friendica\Model\Item ;
2021-01-23 04:53:44 -05:00
use Friendica\Model\Notification ;
2021-01-15 23:11:28 -05:00
use Friendica\Model\Post ;
2019-01-21 11:38:01 -05:00
use Friendica\Model\User ;
2021-08-21 16:35:04 -04:00
use Friendica\Model\Verb ;
2019-10-23 18:25:43 -04:00
use Friendica\Protocol\Activity ;
2017-04-30 00:07:00 -04:00
2016-05-21 07:19:30 -04:00
/**
2020-01-19 01:05:23 -05:00
* Creates a notification entry and possibly sends a mail
2016-05-21 07:19:30 -04:00
*
* @ param array $params Array with the elements :
2020-11-25 14:56:39 -05:00
* type , event , otype , activity , verb , uid , cid , origin_cid , item , link ,
* source_name , source_mail , source_nick , source_link , source_photo ,
* show_in_notification_page
2021-05-09 07:54:34 -04:00
*
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 )
{
2020-02-04 16:30:34 -05:00
/** @var string the common prefix of a notification subject */
2020-02-05 16:22:12 -05:00
$subjectPrefix = DI :: l10n () -> t ( '[Friendica:Notify]' );
2020-02-04 16:30:34 -05: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
2020-11-25 14:56:39 -05:00
$fields = [ 'nickname' , 'page-flags' , 'notify-flags' , 'language' , 'username' , 'email' ];
2018-08-23 04:00:25 -04:00
$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
}
2020-11-25 14:56:39 -05:00
// There is no need to create notifications for forum accounts
if ( in_array ( $user [ 'page-flags' ], [ User :: PAGE_FLAGS_COMMUNITY , User :: PAGE_FLAGS_PRVGROUP ])) {
return false ;
}
$params [ 'notify_flags' ] = $user [ 'notify-flags' ];
$params [ 'language' ] = $user [ 'language' ];
$params [ 'to_name' ] = $user [ 'username' ];
$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
2020-01-18 14:54:15 -05:00
$l10n = DI :: l10n () -> withLang ( $params [ 'language' ]);
2012-03-26 04:43:26 -04:00
2020-11-25 14:56:39 -05:00
if ( ! empty ( $params [ 'cid' ])) {
$contact = Contact :: getById ( $params [ 'cid' ], [ 'url' , 'name' , 'photo' ]);
if ( DBA :: isResult ( $contact )) {
$params [ 'source_link' ] = $contact [ 'url' ];
$params [ 'source_name' ] = $contact [ 'name' ];
$params [ 'source_photo' ] = $contact [ 'photo' ];
}
}
if ( ! empty ( $params [ 'origin_cid' ])) {
$contact = Contact :: getById ( $params [ 'origin_cid' ], [ 'url' , 'name' , 'photo' ]);
if ( DBA :: isResult ( $contact )) {
$params [ 'origin_link' ] = $contact [ 'url' ];
$params [ 'origin_name' ] = $contact [ 'name' ];
$params [ 'origin_photo' ] = $contact [ 'photo' ];
}
}
2019-12-30 17:02:20 -05:00
$siteurl = DI :: baseUrl () -> get ( true );
2020-01-19 15:21:13 -05:00
$sitename = DI :: config () -> get ( 'config' , 'sitename' );
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
2020-11-25 14:56:39 -05:00
$title = $params [ 'item' ][ 'title' ] ? ? '' ;
$body = $params [ 'item' ][ 'body' ] ? ? '' ;
2015-04-14 00:54:41 -04:00
2020-11-25 14:56:39 -05:00
$parent_id = $params [ 'item' ][ 'parent' ] ? ? 0 ;
$parent_uri_id = $params [ 'item' ][ 'parent-uri-id' ] ? ? 0 ;
2020-05-02 09:12:11 -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
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: MAIL ) {
2020-11-25 14:56:39 -05:00
$itemlink = $params [ 'link' ];
2018-07-10 08:27:56 -04:00
2020-02-09 16:42:51 -05:00
$subject = $l10n -> t ( '%s New mail received at %s' , $subjectPrefix , $sitename );
2011-12-24 02:07:05 -05:00
2019-12-28 17:12:01 -05: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 02:07:05 -05:00
2019-12-28 17:12:01 -05:00
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to your private messages.' );
2020-11-25 14:56:39 -05:00
$tsitelink = sprintf ( $sitelink , $itemlink );
$hsitelink = sprintf ( $sitelink , '<a href="' . $itemlink . '">' . $sitename . '</a>' );
// Mail notifications aren't using the "notify" table entry
$show_in_notification_page = false ;
2011-12-26 17:16:25 -05:00
}
2021-08-21 16:35:04 -04:00
// Check to see if there was already a tag notify or comment notify for this post.
// If so don't create a second notification
if ( in_array ( $params [ 'type' ], [ Notification\Type :: TAG_SELF , Notification\Type :: COMMENT , Notification\Type :: SHARE ])) {
2021-01-23 04:53:44 -05:00
$condition = [ 'type' => [ Notification\Type :: TAG_SELF , Notification\Type :: COMMENT , Notification\Type :: SHARE ],
2018-08-19 08:46:11 -04:00
'link' => $params [ 'link' ], 'uid' => $params [ 'uid' ]];
if ( DBA :: exists ( 'notify' , $condition )) {
2019-01-21 11:36:01 -05:00
return false ;
2012-07-04 00:40:13 -04:00
}
2021-08-21 16:35:04 -04:00
}
if ( $params [ 'type' ] == Notification\Type :: COMMENT || $params [ 'type' ] == Notification\Type :: TAG_SELF ) {
if ( Post\ThreadUser :: getIgnored ( $parent_uri_id , $params [ 'uid' ])) {
Logger :: info ( 'Thread is ignored' , [ 'parent' => $parent_id , 'parent-uri-id' => $parent_uri_id ]);
return false ;
}
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 ;
2021-01-23 04:53:44 -05:00
if ( $params [ 'otype' ] === Notification\ObjectType :: ITEM && $parent_id ) {
2021-01-16 17:37:27 -05:00
$item = Post :: selectFirstForUser ( $params [ 'uid' ], Item :: ITEM_FIELDLIST , [ 'id' => $parent_id , 'deleted' => false ]);
2012-02-29 21:19:08 -05:00
}
2020-01-08 16:48:59 -05:00
if ( empty ( $item )) {
return false ;
}
2021-03-07 02:39:13 -05:00
$item_post_type = Item :: postType ( $item , $l10n );
2012-02-29 22:23:01 -05:00
2021-01-30 17:03:53 -05:00
$content = Plaintext :: getPost ( $item , 70 );
2020-01-08 16:48:59 -05:00
if ( ! empty ( $content [ 'text' ])) {
$title = '"' . trim ( str_replace ( " \n " , " " , $content [ 'text' ])) . '"' ;
2019-01-05 20:25:05 -05:00
} else {
2020-01-08 16:48:59 -05:00
$title = '' ;
2019-01-05 20:25:05 -05:00
}
2020-01-08 16:48:59 -05:00
// First go for the general message
2019-01-05 20:25:05 -05:00
// "George Bull's post"
2021-01-01 07:54:08 -05:00
if ( ! empty ( $params [ 'activity' ][ 'origin_comment' ])) {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s replied to you on %2$s\'s %3$s %4$s' );
2021-01-01 07:54:08 -05:00
} elseif ( ! empty ( $params [ 'activity' ][ 'explicit_tagged' ])) {
2020-03-22 03:43:06 -04:00
$message = $l10n -> t ( '%1$s tagged you on %2$s\'s %3$s %4$s' );
2020-01-08 16:48:59 -05:00
} else {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s commented on %2$s\'s %3$s %4$s' );
2018-01-03 21:12:19 -05:00
}
2014-01-05 10:10:02 -05:00
2020-03-21 07:48:20 -04:00
$dest_str = sprintf ( $message , $params [ 'source_name' ], $item [ 'author-name' ], $item_post_type , $title );
2020-01-08 16:48:59 -05:00
// Then look for the special cases
2012-02-29 22:23:01 -05:00
// "your post"
2021-01-01 07:54:08 -05:00
if ( ! empty ( $params [ 'activity' ][ 'origin_thread' ])) {
if ( ! empty ( $params [ 'activity' ][ 'origin_comment' ])) {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s replied to you on your %2$s %3$s' );
2021-01-01 07:54:08 -05:00
} elseif ( ! empty ( $params [ 'activity' ][ 'explicit_tagged' ])) {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s tagged you on your %2$s %3$s' );
2019-01-05 20:25:05 -05:00
} else {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s commented on your %2$s %3$s' );
2019-01-05 20:25:05 -05:00
}
2020-03-21 07:48:20 -04:00
$dest_str = sprintf ( $message , $params [ 'source_name' ], $item_post_type , $title );
2019-01-05 20:25:05 -05:00
// "their post"
2020-01-08 16:48:59 -05:00
} elseif ( $item [ 'author-link' ] == $params [ 'source_link' ]) {
2021-01-01 07:54:08 -05:00
if ( ! empty ( $params [ 'activity' ][ 'origin_comment' ])) {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s replied to you on their %2$s %3$s' );
2021-01-01 07:54:08 -05:00
} elseif ( ! empty ( $params [ 'activity' ][ 'explicit_tagged' ])) {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s tagged you on their %2$s %3$s' );
2019-01-05 20:25:05 -05:00
} else {
2020-03-21 07:48:20 -04:00
$message = $l10n -> t ( '%1$s commented on their %2$s %3$s' );
2019-01-05 20:25:05 -05:00
}
2020-01-08 16:48:59 -05:00
2020-03-21 07:48:20 -04:00
$dest_str = sprintf ( $message , $params [ 'source_name' ], $item_post_type , $title );
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.
2021-01-01 07:54:08 -05:00
if ( ! empty ( $params [ 'activity' ][ 'explicit_tagged' ])) {
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s %s tagged you' , $subjectPrefix , $params [ 'source_name' ]);
2012-02-27 20:18:19 -05:00
2019-12-28 17:12:01 -05:00
$preamble = $l10n -> t ( '%1$s tagged you at %2$s' , $params [ 'source_name' ], $sitename );
2019-01-05 20:25:05 -05:00
} else {
2020-02-09 16:42:51 -05:00
$subject = $l10n -> t ( '%1$s Comment to conversation #%2$d by %3$s' , $subjectPrefix , $parent_id , $params [ 'source_name' ]);
2019-01-05 20:25:05 -05:00
2019-12-28 17:12:01 -05:00
$preamble = $l10n -> t ( '%s commented on an item/conversation you have been following.' , $params [ 'source_name' ]);
2019-01-05 20:25:05 -05:00
}
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
2019-12-28 17:12:01 -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' ];
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: WALL ) {
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s %s posted to your profile wall' , $subjectPrefix , $params [ 'source_name' ]);
2014-01-05 10:10:02 -05:00
2019-12-28 17:12:01 -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]' ,
2018-01-23 21:59:16 -05:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2014-01-05 10:10:02 -05:00
2019-12-28 17:12:01 -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' ];
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: SHARE ) {
2020-08-31 14:51:59 -04:00
if ( $params [ 'origin_link' ] == $params [ 'source_link' ]) {
$subject = $l10n -> t ( '%s %s shared a new post' , $subjectPrefix , $params [ 'source_name' ]);
2016-05-21 07:19:30 -04:00
2020-08-31 14:51:59 -04: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' ]
);
} else {
$subject = $l10n -> t ( '%s %s shared a post from %s' , $subjectPrefix , $params [ 'source_name' ], $params [ 'origin_name' ]);
$preamble = $l10n -> t ( '%1$s shared a post from %2$s at %3$s' , $params [ 'source_name' ], $params [ 'origin_name' ], $sitename );
$epreamble = $l10n -> t ( '%1$s [url=%2$s]shared a post[/url] from %3$s.' ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ], '[url=' . $params [ 'origin_link' ] . ']' . $params [ 'origin_name' ] . '[/url]'
2021-05-09 07:54:34 -04:00
);
2020-08-31 14:51:59 -04:00
}
2012-02-09 17:06:17 -05:00
2019-12-28 17:12:01 -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' ];
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: POKE ) {
2020-02-09 16:42:51 -05:00
$subject = $l10n -> t ( '%1$s %2$s poked you' , $subjectPrefix , $params [ 'source_name' ]);
2012-07-19 23:13:40 -04:00
2019-12-28 17:12:01 -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].' ,
2018-01-23 21:59:16 -05:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$params [ 'link' ]
);
2012-07-19 23:13:40 -04:00
2019-12-28 17:12:01 -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
2019-12-28 17:12:01 -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' ];
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: TAG_SHARE ) {
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s %s tagged your post' , $subjectPrefix , $params [ 'source_name' ]);
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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]' ,
2018-01-23 21:59:16 -05:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$itemlink
);
2012-02-09 17:06:17 -05:00
2019-12-28 17:12:01 -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
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: INTRO ) {
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s Introduction received' , $subjectPrefix );
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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.' ,
2018-01-23 21:59:16 -05:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -05:00
$body = $l10n -> t ( 'You may visit their profile at %s' , $params [ 'source_link' ]);
2011-12-26 18:47:40 -05:00
2019-12-28 17:12:01 -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' ]) {
2019-10-23 18:25:43 -04:00
case Activity :: FRIEND :
2014-09-06 12:15:18 -04:00
// someone started to share with user (mostly OStatus)
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s A new person is sharing with you' , $subjectPrefix );
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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' ,
2018-01-23 21:59:16 -05:00
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]' ,
$sitename
);
2014-09-06 12:15:18 -04:00
break ;
2019-10-23 18:25:43 -04:00
case Activity :: FOLLOW :
2014-09-06 12:15:18 -04:00
// someone started to follow the user (mostly OStatus)
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s You have a new follower' , $subjectPrefix );
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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' ,
2018-01-23 21:59:16 -05:00
'[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
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: SUGGEST ) {
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s Friend suggestion received' , $subjectPrefix );
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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.' ,
2018-01-23 21:59:16 -05:00
$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
2019-12-28 17:12:01 -05:00
$body = $l10n -> t ( 'Name:' ) . ' ' . $params [ 'item' ][ 'name' ] . " \n " ;
$body .= $l10n -> t ( 'Photo:' ) . ' ' . $params [ 'item' ][ 'photo' ] . " \n " ;
$body .= $l10n -> t ( 'You may visit their profile at %s' , $params [ 'item' ][ 'url' ]);
2012-01-03 20:29:07 -05:00
2019-12-28 17:12:01 -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
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: CONFIRM ) {
2019-10-23 18:25:43 -04:00
if ( $params [ 'verb' ] == Activity :: FRIEND ) { // mutual connection
2018-07-10 08:27:56 -04:00
$itemlink = $params [ 'link' ];
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s Connection accepted' , $subjectPrefix );
2014-09-06 12:15:18 -04:00
2019-12-28 17:12:01 -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].' ,
2018-01-23 21:59:16 -05:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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
2019-12-28 17:12:01 -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' ];
2020-02-05 16:22:12 -05:00
$subject = $l10n -> t ( '%s Connection accepted' , $subjectPrefix );
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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].' ,
2018-01-23 21:59:16 -05:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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 " ;
2019-12-28 17:12:01 -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
2019-12-28 17:12:01 -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
}
2021-01-23 04:53:44 -05:00
if ( $params [ 'type' ] == Notification\Type :: 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' ];
2019-12-28 17:12:01 -05:00
$subject = $l10n -> t ( '[Friendica System Notify]' ) . ' ' . $l10n -> t ( 'registration request' );
2016-05-21 07:19:30 -04:00
2019-12-28 17:12:01 -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.' ,
2018-01-23 21:59:16 -05:00
$itemlink ,
'[url=' . $params [ 'source_link' ] . ']' . $params [ 'source_name' ] . '[/url]'
);
2019-12-28 17:12:01 -05: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
2019-12-28 17:12:01 -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
}
2021-08-21 16:35:04 -04:00
return notification_store_and_send ( $params , $sitelink , $tsitelink , $hsitelink , $title , $subject , $preamble , $epreamble , $body , $itemlink , $show_in_notification_page );
}
function notification_store_and_send ( $params , $sitelink , $tsitelink , $hsitelink , $title , $subject , $preamble , $epreamble , $body , $itemlink , $show_in_notification_page )
{
$item_id = $params [ 'item' ][ 'id' ] ? ? 0 ;
$uri_id = $params [ 'item' ][ 'uri-id' ] ? ? 0 ;
$parent_id = $params [ 'item' ][ 'parent' ] ? ? 0 ;
$parent_uri_id = $params [ 'item' ][ 'parent-uri-id' ] ? ? 0 ;
// Ensure that the important fields are set at any time
$fields = [ 'nickname' ];
$user = User :: getById ( $params [ 'uid' ], $fields );
$sitename = DI :: config () -> get ( 'config' , 'sitename' );
$nickname = $user [ 'nickname' ];
$hostname = DI :: baseUrl () -> getHostname ();
if ( strpos ( $hostname , ':' )) {
$hostname = substr ( $hostname , 0 , strpos ( $hostname , ':' ));
}
// Creates a new email builder for the notification email
$emailBuilder = DI :: emailer () -> newNotifyMail ();
$emailBuilder -> setHeader ( 'X-Friendica-Account' , '<' . $nickname . '@' . $hostname . '>' );
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 ) {
2020-11-19 01:26:30 -05:00
$fields = [
2020-05-02 09:12:11 -04:00
'name' => $params [ 'source_name' ] ? ? '' ,
2021-07-10 08:58:48 -04:00
'name_cache' => substr ( strip_tags ( BBCode :: convertForUriId ( $uri_id , $params [ 'source_name' ])), 0 , 255 ),
2020-05-02 09:12:11 -04:00
'url' => $params [ 'source_link' ] ? ? '' ,
'photo' => $params [ 'source_photo' ] ? ? '' ,
'link' => $itemlink ? ? '' ,
'uid' => $params [ 'uid' ] ? ? 0 ,
'type' => $params [ 'type' ] ? ? '' ,
'verb' => $params [ 'verb' ] ? ? '' ,
'otype' => $params [ 'otype' ] ? ? '' ,
2020-11-19 01:26:30 -05:00
];
if ( ! empty ( $item_id )) {
$fields [ 'iid' ] = $item_id ;
}
if ( ! empty ( $uri_id )) {
$fields [ 'uri-id' ] = $uri_id ;
}
2020-11-25 14:56:39 -05:00
if ( ! empty ( $parent_id )) {
2020-11-19 01:26:30 -05:00
$fields [ 'parent' ] = $parent_id ;
}
2020-11-25 14:56:39 -05:00
if ( ! empty ( $parent_uri_id )) {
2020-11-19 01:26:30 -05:00
$fields [ 'parent-uri-id' ] = $parent_uri_id ;
}
$notification = DI :: notify () -> insert ( $fields );
2013-02-08 02:43:55 -05:00
2020-06-29 18:58:17 -04:00
// Notification insertion can be intercepted by an addon registering the 'enotify_store' hook
if ( ! $notification ) {
return false ;
}
2020-01-27 19:12:11 -05:00
$notification -> msg = Renderer :: replaceMacros ( $epreamble , [ '$itemlink' => $notification -> link ]);
2013-02-08 02:43:55 -05:00
2020-01-26 14:30:24 -05:00
DI :: notify () -> update ( $notification );
2018-08-19 08:46:11 -04:00
2020-01-28 17:21:24 -05:00
$itemlink = DI :: baseUrl () . '/notification/' . $notification -> id ;
2020-01-24 20:01:49 -05:00
$notify_id = $notification -> id ;
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' ]))
2021-01-23 04:53:44 -05:00
|| $params [ 'type' ] == Notification\Type :: SYSTEM ) {
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 )) {
2021-01-15 23:11:28 -05:00
$parent = Post :: selectFirst ([ 'guid' ], [ 'id' => $params [ 'parent' ]]);
2020-09-06 13:47:25 -04:00
$message_id = " < " . $parent [ 'guid' ] . " @ " . gethostname () . " > " ;
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?
2021-02-16 03:00:23 -05:00
if ( ! DBA :: exists ( 'notify-threads' , [ 'master-parent-uri-id' => $parent_uri_id , 'receiver-uid' => $params [ 'uid' ]])) {
2020-01-25 19:04:54 -05: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
2021-02-16 03:00:23 -05:00
$fields = [ 'notify-id' => $notify_id , 'master-parent-uri-id' => $parent_uri_id ,
2020-05-02 09:12:11 -04:00
'receiver-uid' => $params [ 'uid' ], 'parent-item' => 0 ];
2018-08-19 08:46:11 -04:00
DBA :: insert ( 'notify-threads' , $fields );
2014-08-20 18:53:01 -04:00
2020-09-19 14:14:55 -04:00
$emailBuilder -> setHeader ( 'Message-ID' , $message_id );
2021-08-21 16:35:04 -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.
2020-09-19 14:14:55 -04:00
$emailBuilder -> setHeader ( 'References' , $message_id );
$emailBuilder -> setHeader ( 'In-Reply-To' , $message_id );
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
}
2020-02-02 18:07:22 -05:00
$datarray = [
'preamble' => $preamble ,
'type' => $params [ 'type' ],
'parent' => $parent_id ,
'source_name' => $params [ 'source_name' ] ? ? null ,
'source_link' => $params [ 'source_link' ] ? ? null ,
'source_photo' => $params [ 'source_photo' ] ? ? null ,
'uid' => $params [ 'uid' ],
'hsitelink' => $hsitelink ,
'tsitelink' => $tsitelink ,
'itemlink' => $itemlink ,
'title' => $title ,
'body' => $body ,
'subject' => $subject ,
2020-09-21 11:07:34 -04:00
'headers' => $emailBuilder -> getHeaders (),
2020-02-02 18:07:22 -05:00
];
2012-02-27 02:54:04 -05:00
2018-12-26 01:06:24 -05:00
Hook :: callAll ( 'enotify_mail' , $datarray );
2012-02-27 02:54:04 -05:00
2020-09-21 11:07:34 -04:00
$emailBuilder
-> withHeaders ( $datarray [ 'headers' ])
2020-02-02 18:07:22 -05:00
-> withRecipient ( $params [ 'to_email' ])
2020-02-04 15:26:03 -05:00
-> forUser ([
'uid' => $datarray [ 'uid' ],
'language' => $params [ 'language' ],
])
2020-02-02 18:07:22 -05:00
-> withNotification ( $datarray [ 'subject' ], $datarray [ 'preamble' ], $datarray [ 'title' ], $datarray [ 'body' ])
-> withSiteLink ( $datarray [ 'tsitelink' ], $datarray [ 'hsitelink' ])
-> withItemLink ( $datarray [ 'itemlink' ]);
// If a photo is present, add it to the email
if ( ! empty ( $datarray [ 'source_photo' ])) {
2020-09-19 14:14:55 -04:00
$emailBuilder -> withPhoto (
2020-02-02 18:07:22 -05:00
$datarray [ 'source_photo' ],
$datarray [ 'source_link' ] ? ? $sitelink ,
$datarray [ 'source_name' ] ? ? $sitename );
}
2011-12-24 02:07:05 -05:00
2020-09-19 14:14:55 -04:00
$email = $emailBuilder -> build ();
2020-01-26 14:23:58 -05:00
// use the Emailer class to send the message
return DI :: emailer () -> send ( $email );
2011-12-24 02:07:05 -05:00
}
2012-02-18 05:57:42 -05:00
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
2021-08-21 16:35:04 -04:00
function notification_from_array ( array $notification )
{
if ( $notification [ 'type' ] == Post\UserNotification :: NOTIF_NONE ) {
return false ;
}
$params = [];
$params [ 'verb' ] = Verb :: getByID ( $notification [ 'vid' ]);
$params [ 'uid' ] = $notification [ 'uid' ];
$params [ 'otype' ] = Notification\ObjectType :: ITEM ;
$user = User :: getById ( $notification [ 'uid' ]);
$params [ 'notify_flags' ] = $user [ 'notify-flags' ];
$params [ 'language' ] = $user [ 'language' ];
$params [ 'to_name' ] = $user [ 'username' ];
$params [ 'to_email' ] = $user [ 'email' ];
// from here on everything is in the recipients language
$l10n = DI :: l10n () -> withLang ( $user [ 'language' ]);
$contact = Contact :: getById ( $notification [ 'actor-id' ], [ 'url' , 'name' , 'photo' ]);
if ( DBA :: isResult ( $contact )) {
$params [ 'source_link' ] = $params [ 'origin_link' ] = $contact [ 'url' ];
$params [ 'source_name' ] = $params [ 'origin_name' ] = $contact [ 'name' ];
$params [ 'source_photo' ] = $params [ 'origin_photo' ] = $contact [ 'photo' ];
}
$item = Post :: selectFirstForUser ( $notification [ 'uid' ], Item :: ITEM_FIELDLIST ,
[ 'uid' => [ 0 , $notification [ 'uid' ]], 'uri-id' => $notification [ 'target-uri-id' ], 'deleted' => false ],
[ 'order' => [ 'uid' => true ]]);
if ( empty ( $item )) {
return false ;
}
$params [ 'item' ] = $item ;
$params [ 'parent' ] = $item [ 'parent' ];
$params [ 'link' ] = DI :: baseUrl () . '/display/' . urlencode ( $item [ 'guid' ]);
$subjectPrefix = $l10n -> t ( '[Friendica:Notify]' );
if ( Post\ThreadUser :: getIgnored ( $notification [ 'parent-uri-id' ], $notification [ 'uid' ])) {
Logger :: info ( 'Thread is ignored' , [ 'parent-uri-id' => $notification [ 'parent-uri-id' ]]);
return false ;
}
// Check to see if there was already a tag notify or comment notify for this post.
// If so don't create a second notification
$condition = [ 'type' => [ Notification\Type :: TAG_SELF , Notification\Type :: COMMENT , Notification\Type :: SHARE ],
'link' => $params [ 'link' ], 'uid' => $notification [ 'uid' ]];
if ( DBA :: exists ( 'notify' , $condition )) {
return false ;
}
$content = Plaintext :: getPost ( $item , 70 );
if ( ! empty ( $content [ 'text' ])) {
$title = '"' . trim ( str_replace ( " \n " , " " , $content [ 'text' ])) . '"' ;
} else {
$title = $item [ 'title' ];
}
// Some mail software relies on subject field for threading.
// So, we cannot have different subjects for notifications of the same thread.
// Before this we have the name of the replier on the subject rendering
// different subjects for messages on the same thread.
if ( $notification [ 'type' ] == Post\UserNotification :: NOTIF_EXPLICIT_TAGGED ) {
$params [ 'type' ] = Notification\Type :: TAG_SELF ;
$subject = $l10n -> t ( '%s %s tagged you' , $subjectPrefix , $contact [ 'name' ]);
} elseif ( $notification [ 'type' ] == Post\UserNotification :: NOTIF_SHARED ) {
$params [ 'type' ] = Notification\Type :: SHARE ;
$subject = $l10n -> t ( '%s %s shared a new post' , $subjectPrefix , $contact [ 'name' ]);
} else {
$params [ 'type' ] = Notification\Type :: COMMENT ;
$subject = $l10n -> t ( '%1$s Comment to conversation #%2$d by %3$s' , $subjectPrefix , $item [ 'parent' ], $contact [ 'name' ]);
}
$msg = Notification :: getMessage ( $notification );
if ( empty ( $msg )) {
return false ;
}
$preamble = $msg [ 'plain' ];
$epreamble = $msg [ 'rich' ];
$sitename = DI :: config () -> get ( 'config' , 'sitename' );
$siteurl = DI :: baseUrl () -> get ( true );
$sitelink = $l10n -> t ( 'Please visit %s to view and/or reply to the conversation.' );
$tsitelink = sprintf ( $sitelink , $siteurl );
$hsitelink = sprintf ( $sitelink , '<a href="' . $siteurl . '">' . $sitename . '</a>' );
$itemlink = $params [ 'link' ];
return notification_store_and_send ( $params , $sitelink , $tsitelink , $hsitelink , $title , $subject , $preamble , $epreamble , $item [ 'body' ], $itemlink , true );
}
2018-01-07 06:08:36 -05:00
/**
2020-01-19 01:05:23 -05:00
* Checks for users who should be notified
2018-01-07 06:08:36 -05:00
*
2021-02-02 00:45:57 -05:00
* @ param int $uri_id URI ID of the item for which the check should be done
* @ param int $uid User ID of the item
2019-01-07 10:24:06 -05:00
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2018-01-07 06:08:36 -05:00
*/
2021-02-02 00:45:57 -05:00
function check_user_notification ( int $uri_id , int $uid ) {
$condition = [ 'uri-id' => $uri_id ];
// fetch all users with notifications on public posts
if ( $uid != 0 ) {
$condition [ 'uid' ] = $uid ;
}
$usernotifications = DBA :: select ( 'post-user-notification' , [ 'uri-id' , 'uid' , 'notification-type' ], $condition );
while ( $usernotification = DBA :: fetch ( $usernotifications )) {
2021-03-14 11:40:14 -04:00
check_item_notification ( $usernotification [ 'uri-id' ], $usernotification [ 'uid' ], $usernotification [ 'notification-type' ], $uid );
2018-01-07 06:08:36 -05:00
}
2021-02-02 00:45:57 -05:00
DBA :: close ( $usernotifications );
2018-01-07 06:08:36 -05:00
}
2016-01-28 16:58:05 -05:00
/**
2020-01-19 01:05:23 -05:00
* Checks for item related notifications and sends them
2016-01-28 16:58:05 -05:00
*
2021-02-02 00:45:57 -05:00
* @ param int $uri_id URI ID of the item for which the check should be done
2020-01-05 19:59:18 -05:00
* @ param int $uid User ID
* @ param int $notification_type Notification bits
2019-01-07 10:24:06 -05:00
* @ return bool
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2016-01-28 16:58:05 -05:00
*/
2021-03-14 11:40:14 -04:00
function check_item_notification ( int $uri_id , int $uid , int $notification_type , $post_uid ) {
2020-08-31 14:51:59 -04:00
$fields = [ 'id' , 'uri-id' , 'mention' , 'parent' , 'parent-uri-id' , 'thr-parent-id' ,
'title' , 'body' , 'author-link' , 'author-name' , 'author-avatar' , 'author-id' ,
'gravity' , 'guid' , 'parent-uri' , 'uri' , 'contact-id' , 'network' ];
2021-03-14 11:40:14 -04:00
$condition = [ 'uri-id' => $uri_id , 'uid' => [ $uid , $post_uid ], 'deleted' => false ];
2021-01-16 17:37:27 -05:00
$item = Post :: selectFirstForUser ( $uid , $fields , $condition );
2020-01-05 19:59:18 -05:00
if ( ! DBA :: isResult ( $item )) {
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
2021-01-24 08:49:23 -05:00
if ( ! DI :: pConfig () -> get ( local_user (), 'system' , 'notify_ignored' , true ) && Contact\User :: isIgnored ( $item [ 'author-id' ], $uid )) {
2021-01-24 06:40:09 -05:00
Logger :: info ( 'Author is ignored, dropping notification' , [ 'cid' => $item [ 'author-id' ], 'uid' => $uid ]);
return false ;
}
2016-01-28 16:58:05 -05:00
// Generate the notification array
2018-01-15 08:05:12 -05:00
$params = [];
2021-01-23 04:53:44 -05:00
$params [ 'otype' ] = Notification\ObjectType :: ITEM ;
2020-01-05 19:59:18 -05:00
$params [ 'uid' ] = $uid ;
2020-11-25 14:56:39 -05:00
$params [ 'origin_cid' ] = $params [ 'cid' ] = $item [ 'author-id' ];
2020-01-05 19:59:18 -05:00
$params [ 'item' ] = $item ;
$params [ 'link' ] = DI :: baseUrl () . '/display/' . urlencode ( $item [ 'guid' ]);
2020-01-08 16:48:59 -05:00
// Set the activity flags
2021-02-02 00:45:57 -05:00
$params [ 'activity' ][ 'explicit_tagged' ] = ( $notification_type & Post\UserNotification :: NOTIF_EXPLICIT_TAGGED );
$params [ 'activity' ][ 'implicit_tagged' ] = ( $notification_type & Post\UserNotification :: NOTIF_IMPLICIT_TAGGED );
$params [ 'activity' ][ 'origin_comment' ] = ( $notification_type & Post\UserNotification :: NOTIF_DIRECT_COMMENT );
$params [ 'activity' ][ 'origin_thread' ] = ( $notification_type & Post\UserNotification :: NOTIF_THREAD_COMMENT );
$params [ 'activity' ][ 'thread_comment' ] = ( $notification_type & Post\UserNotification :: NOTIF_COMMENT_PARTICIPATION );
$params [ 'activity' ][ 'thread_activity' ] = ( $notification_type & Post\UserNotification :: NOTIF_ACTIVITY_PARTICIPATION );
2020-01-08 16:48:59 -05:00
2020-01-09 12:53:17 -05:00
// Tagging a user in a direct post (first comment level) means a direct comment
2021-02-02 00:45:57 -05:00
if ( $params [ 'activity' ][ 'explicit_tagged' ] && ( $notification_type & Post\UserNotification :: NOTIF_DIRECT_THREAD_COMMENT )) {
2020-01-09 12:53:17 -05:00
$params [ 'activity' ][ 'origin_comment' ] = true ;
}
2021-02-02 00:45:57 -05:00
if ( $notification_type & Post\UserNotification :: NOTIF_SHARED ) {
2021-01-23 04:53:44 -05:00
$params [ 'type' ] = Notification\Type :: SHARE ;
2020-01-08 16:48:59 -05:00
$params [ 'verb' ] = Activity :: POST ;
2020-08-31 14:51:59 -04:00
// Special treatment for posts that had been shared via "announce"
if ( $item [ 'gravity' ] == GRAVITY_ACTIVITY ) {
2021-01-15 23:11:28 -05:00
$parent_item = Post :: selectFirst ( $fields , [ 'uri-id' => $item [ 'thr-parent-id' ], 'uid' => [ $uid , 0 ]]);
2020-08-31 14:51:59 -04:00
if ( DBA :: isResult ( $parent_item )) {
2020-08-31 15:27:50 -04:00
// Don't notify on own entries
if ( User :: getIdForURL ( $parent_item [ 'author-link' ]) == $uid ) {
return false ;
}
2020-11-25 14:56:39 -05:00
$params [ 'origin_cid' ] = $parent_item [ 'author-id' ];
2020-08-31 14:51:59 -04:00
$params [ 'item' ] = $parent_item ;
}
}
2021-02-02 00:45:57 -05:00
} elseif ( $notification_type & Post\UserNotification :: NOTIF_EXPLICIT_TAGGED ) {
2021-01-23 04:53:44 -05:00
$params [ 'type' ] = Notification\Type :: TAG_SELF ;
2020-01-05 19:59:18 -05:00
$params [ 'verb' ] = Activity :: TAG ;
2021-02-02 00:45:57 -05:00
} elseif ( $notification_type & Post\UserNotification :: NOTIF_IMPLICIT_TAGGED ) {
2021-01-23 04:53:44 -05:00
$params [ 'type' ] = Notification\Type :: COMMENT ;
2020-01-08 16:48:59 -05:00
$params [ 'verb' ] = Activity :: POST ;
2021-02-02 00:45:57 -05:00
} elseif ( $notification_type & Post\UserNotification :: NOTIF_THREAD_COMMENT ) {
2021-01-23 04:53:44 -05:00
$params [ 'type' ] = Notification\Type :: COMMENT ;
2020-01-05 19:59:18 -05:00
$params [ 'verb' ] = Activity :: POST ;
2021-02-02 00:45:57 -05:00
} elseif ( $notification_type & Post\UserNotification :: NOTIF_DIRECT_COMMENT ) {
2021-01-23 04:53:44 -05:00
$params [ 'type' ] = Notification\Type :: COMMENT ;
2020-01-05 19:59:18 -05:00
$params [ 'verb' ] = Activity :: POST ;
2021-02-02 00:45:57 -05:00
} elseif ( $notification_type & Post\UserNotification :: NOTIF_COMMENT_PARTICIPATION ) {
2021-01-23 04:53:44 -05:00
$params [ 'type' ] = Notification\Type :: COMMENT ;
2020-01-05 19:59:18 -05:00
$params [ 'verb' ] = Activity :: POST ;
2021-02-02 00:45:57 -05:00
} elseif ( $notification_type & Post\UserNotification :: NOTIF_ACTIVITY_PARTICIPATION ) {
2021-01-23 04:53:44 -05:00
$params [ 'type' ] = Notification\Type :: COMMENT ;
2020-01-05 19:59:18 -05:00
$params [ 'verb' ] = Activity :: POST ;
} else {
return false ;
2018-08-12 00:34:56 -04:00
}
2020-01-05 19:59:18 -05:00
notification ( $params );
2016-01-28 16:58:05 -05:00
}