X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FNotification.php;h=880fa784a61ff1b2acde436be14cb815772fe870;hb=c0d187f2818bcdcb12bbde239f7ce213adaedd02;hp=cf2c754631c6760c0a8fcf72a9c88efe08ecf9a1;hpb=befc2af5043a3afde251721c0d27df695db1bb7e;p=friendica.git diff --git a/src/Model/Notification.php b/src/Model/Notification.php index cf2c754631..880fa784a6 100644 --- a/src/Model/Notification.php +++ b/src/Model/Notification.php @@ -23,8 +23,12 @@ namespace Friendica\Model; use Friendica\BaseModel; use Friendica\Content\Text\BBCode; +use Friendica\Content\Text\Plaintext; +use Friendica\Core\Logger; use Friendica\Database\Database; +use Friendica\DI; use Friendica\Network\HTTPException\InternalServerErrorException; +use Friendica\Protocol\Activity; use Psr\Log\LoggerInterface; /** @@ -123,4 +127,190 @@ class Notification extends BaseModel return $message; } + + /** + * Fetch the notification type for the given notification + * + * @param array $notification + * @return string + */ + public static function getType(array $notification): string + { + if (($notification['vid'] == Verb::getID(Activity::FOLLOW)) && ($notification['type'] == Post\UserNotification::NOTIF_NONE)) { + $contact = Contact::getById($notification['actor-id'], ['pending']); + $type = $contact['pending'] ? 'follow_request' : 'follow'; + } elseif (($notification['vid'] == Verb::getID(Activity::ANNOUNCE)) && + in_array($notification['type'], [Post\UserNotification::NOTIF_DIRECT_COMMENT, Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT])) { + $type = 'reblog'; + } elseif (in_array($notification['vid'], [Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE)]) && + in_array($notification['type'], [Post\UserNotification::NOTIF_DIRECT_COMMENT, Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT])) { + $type = 'favourite'; + } elseif ($notification['type'] == Post\UserNotification::NOTIF_SHARED) { + $type = 'status'; + } elseif (in_array($notification['type'], [Post\UserNotification::NOTIF_EXPLICIT_TAGGED, + Post\UserNotification::NOTIF_IMPLICIT_TAGGED, Post\UserNotification::NOTIF_DIRECT_COMMENT, + Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT, Post\UserNotification::NOTIF_THREAD_COMMENT])) { + $type = 'mention'; + } else { + return ''; + } + + return $type; + } + + /** + * Create a notification message for the given notification + * + * @param array $notification + * @return array with the elements "causer", "notification", "plain" and "rich" + */ + public static function getMessage(array $notification) + { + $message = []; + + if ($notification['type'] == Post\UserNotification::NOTIF_NONE) { + return $message; + } + + if (empty($notification['target-uri-id'])) { + return $message; + } + + $user = User::getById($notification['uid']); + if (empty($user)) { + Logger::info('User not found', ['application' => $notification['uid']]); + return $message; + } + + $contact = Contact::getById($notification['actor-id']); + if (empty($contact)) { + Logger::info('Contact not found', ['contact' => $notification['actor-id']]); + return $message; + } + + $like = Verb::getID(Activity::LIKE); + $dislike = Verb::getID(Activity::DISLIKE); + $announce = Verb::getID(Activity::ANNOUNCE); + $post = Verb::getID(Activity::POST); + + if (in_array($notification['type'], [Post\UserNotification::NOTIF_THREAD_COMMENT, Post\UserNotification::NOTIF_COMMENT_PARTICIPATION])) { + $item = Post::selectFirst([], ['uri-id' => $notification['parent-uri-id'], 'uid' => [0, $notification['uid']]]); + if (empty($item)) { + Logger::info('Parent post not found', ['uri-id' => $notification['parent-uri-id']]); + return $message; + } + } else { + $item = Post::selectFirst([], ['uri-id' => $notification['target-uri-id'], 'uid' => [0, $notification['uid']]]); + if (empty($item)) { + Logger::info('Post not found', ['uri-id' => $notification['target-uri-id']]); + return $message; + } + + if ($notification['vid'] == $post) { + $item = Post::selectFirst([], ['uri-id' => $item['thr-parent-id'], 'uid' => [0, $notification['uid']]]); + if (empty($item)) { + Logger::info('Thread parent post not found', ['uri-id' => $item['thr-parent-id']]); + return $message; + } + } + } + + $link = DI::baseUrl() . '/display/' . urlencode($item['guid']); + + $content = Plaintext::getPost($item, 70); + if (!empty($content['text'])) { + $title = '"' . trim(str_replace("\n", " ", $content['text'])) . '"'; + } else { + $title = ''; + } + + $l10n = DI::l10n()->withLang($user['language']); + + switch ($notification['vid']) { + case $like: + switch ($notification['type']) { + case Post\UserNotification::NOTIF_DIRECT_COMMENT: + $msg = $l10n->t('%1$s liked your comment %2$s'); + break; + case Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT: + $msg = $l10n->t('%1$s liked your post %2$s'); + break; + } + break; + case $dislike: + switch ($notification['type']) { + case Post\UserNotification::NOTIF_DIRECT_COMMENT: + $msg = $l10n->t('%1$s disliked your comment %2$s'); + break; + case Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT: + $msg = $l10n->t('%1$s disliked your post %2$s'); + break; + } + break; + case $announce: + switch ($notification['type']) { + case Post\UserNotification::NOTIF_DIRECT_COMMENT: + $msg = $l10n->t('%1$s shared your comment %2$s'); + break; + case Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT: + $msg = $l10n->t('%1$s shared your post %2$s'); + break; + } + break; + case $post: + switch ($notification['type']) { + case Post\UserNotification::NOTIF_EXPLICIT_TAGGED: + $msg = $l10n->t('%1$s tagged you on %2$s'); + break; + + case Post\UserNotification::NOTIF_IMPLICIT_TAGGED: + $msg = $l10n->t('%1$s replied to you on %2$s'); + break; + + case Post\UserNotification::NOTIF_THREAD_COMMENT: + $msg = $l10n->t('%1$s commented in your thread %2$s'); + break; + + case Post\UserNotification::NOTIF_DIRECT_COMMENT: + $msg = $l10n->t('%1$s commented on your comment %2$s'); + break; + + case Post\UserNotification::NOTIF_COMMENT_PARTICIPATION: + $msg = $l10n->t('%1$s commented in the thread %2$s'); + break; + + case Post\UserNotification::NOTIF_ACTIVITY_PARTICIPATION: + // Unhandled + break; + + case Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT: + $msg = $l10n->t('%1$s commented on your thread %2$s'); + break; + + case Post\UserNotification::NOTIF_SHARED: + if ($title != '') { + $msg = $l10n->t('%1$s shared the post %2$s'); + } else { + $msg = $l10n->t('%1$s shared a post'); + } + break; + } + break; + } + + if (!empty($msg)) { + // Name of the notification's causer + $message['causer'] = $contact['name']; + // Format for the "ping" mechanism + $message['notification'] = sprintf($msg, '{0}', $title); + // Plain text for the web push api + $message['plain'] = sprintf($msg, $contact['name'], $title); + // Rich text for other purposes + $message['rich'] = sprintf($msg, + '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]', + '[url=' . $link . ']' . $title . '[/url]'); + } + + return $message; + } }