From 842cbbaf098a6bbe41f505b219056468f2f3b14e Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 1 Jun 2021 21:13:16 +0000 Subject: [PATCH] Added notifications for follow requests --- src/Factory/Api/Mastodon/Notification.php | 6 ++- src/Model/Contact.php | 4 ++ src/Model/Post/UserNotification.php | 55 +++++++++++++++++------ src/Module/Api/Mastodon/Notifications.php | 10 ++++- 4 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/Factory/Api/Mastodon/Notification.php b/src/Factory/Api/Mastodon/Notification.php index 11c0aee3aa..ea7fa021f4 100644 --- a/src/Factory/Api/Mastodon/Notification.php +++ b/src/Factory/Api/Mastodon/Notification.php @@ -24,6 +24,7 @@ namespace Friendica\Factory\Api\Mastodon; use Friendica\BaseFactory; use Friendica\Database\DBA; use Friendica\DI; +use Friendica\Model\Contact; use Friendica\Model\Post; use Friendica\Model\Verb; use Friendica\Protocol\Activity; @@ -46,7 +47,10 @@ class Notification extends BaseFactory status = Someone you enabled notifications for has posted a status */ - if (($notification['vid'] == Verb::getID(Activity::ANNOUNCE)) && + if (($notification['vid'] == Verb::getID(Activity::FOLLOW)) && ($notification['type'] == Post\UserNotification::NOTIF_NONE)) { + $contact = Contact::getById($notification['actor-id'], ['pending']); + $type = $contact['pending'] ? $type = '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)]) && diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 916efe8330..246a2967b2 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -2536,6 +2536,8 @@ class Contact // Ensure to always have the correct network type, independent from the connection request method self::updateFromProbe($contact['id']); + Post\UserNotification::insertNotication($contact['id'], Verb::getID(Activity::FOLLOW), $importer['uid']); + return true; } else { // send email notification to owner? @@ -2567,6 +2569,8 @@ class Contact self::updateAvatar($contact_id, $photo, true); + Post\UserNotification::insertNotication($contact_id, Verb::getID(Activity::FOLLOW), $importer['uid']); + $contact_record = DBA::selectFirst('contact', ['id', 'network', 'name', 'url', 'photo'], ['id' => $contact_id]); /// @TODO Encapsulate this into a function/method diff --git a/src/Model/Post/UserNotification.php b/src/Model/Post/UserNotification.php index 38c2bdd8e8..c8e31cdc03 100644 --- a/src/Model/Post/UserNotification.php +++ b/src/Model/Post/UserNotification.php @@ -177,7 +177,7 @@ class UserNotification if (self::checkShared($item, $uid)) { $notification_type = $notification_type | self::NOTIF_SHARED; - self::insertNotication(self::NOTIF_SHARED, $uid, $item); + self::insertNoticationByItem(self::NOTIF_SHARED, $uid, $item); $notified = true; } else { $notified = false; @@ -201,7 +201,7 @@ class UserNotification if (self::checkExplicitMention($item, $profiles)) { $notification_type = $notification_type | self::NOTIF_EXPLICIT_TAGGED; if (!$notified) { - self::insertNotication( self::NOTIF_EXPLICIT_TAGGED, $uid, $item); + self::insertNoticationByItem( self::NOTIF_EXPLICIT_TAGGED, $uid, $item); $notified = true; } } @@ -209,7 +209,7 @@ class UserNotification if (self::checkImplicitMention($item, $profiles)) { $notification_type = $notification_type | self::NOTIF_IMPLICIT_TAGGED; if (!$notified) { - self::insertNotication(self::NOTIF_IMPLICIT_TAGGED, $uid, $item); + self::insertNoticationByItem(self::NOTIF_IMPLICIT_TAGGED, $uid, $item); $notified = true; } } @@ -217,7 +217,7 @@ class UserNotification if (self::checkDirectComment($item, $contacts)) { $notification_type = $notification_type | self::NOTIF_DIRECT_COMMENT; if (!$notified) { - self::insertNotication(self::NOTIF_DIRECT_COMMENT, $uid, $item); + self::insertNoticationByItem(self::NOTIF_DIRECT_COMMENT, $uid, $item); $notified = true; } } @@ -225,7 +225,7 @@ class UserNotification if (self::checkDirectCommentedThread($item, $contacts)) { $notification_type = $notification_type | self::NOTIF_DIRECT_THREAD_COMMENT; if (!$notified) { - self::insertNotication(self::NOTIF_DIRECT_THREAD_COMMENT, $uid, $item); + self::insertNoticationByItem(self::NOTIF_DIRECT_THREAD_COMMENT, $uid, $item); $notified = true; } } @@ -233,7 +233,7 @@ class UserNotification if (self::checkCommentedThread($item, $contacts)) { $notification_type = $notification_type | self::NOTIF_THREAD_COMMENT; if (!$notified) { - self::insertNotication(self::NOTIF_THREAD_COMMENT, $uid, $item); + self::insertNoticationByItem(self::NOTIF_THREAD_COMMENT, $uid, $item); $notified = true; } } @@ -241,7 +241,7 @@ class UserNotification if (self::checkCommentedParticipation($item, $contacts)) { $notification_type = $notification_type | self::NOTIF_COMMENT_PARTICIPATION; if (!$notified) { - self::insertNotication(self::NOTIF_COMMENT_PARTICIPATION, $uid, $item); + self::insertNoticationByItem(self::NOTIF_COMMENT_PARTICIPATION, $uid, $item); $notified = true; } } @@ -249,7 +249,7 @@ class UserNotification if (self::checkActivityParticipation($item, $contacts)) { $notification_type = $notification_type | self::NOTIF_ACTIVITY_PARTICIPATION; if (!$notified) { - self::insertNotication(self::NOTIF_ACTIVITY_PARTICIPATION, $uid, $item); + self::insertNoticationByItem(self::NOTIF_ACTIVITY_PARTICIPATION, $uid, $item); $notified = true; } } @@ -266,7 +266,15 @@ class UserNotification self::update($item['uri-id'], $uid, $fields, true); } - private static function insertNotication(int $type, int $uid, array $item) + /** + * Add a notification entry for a given item array + * + * @param int $type User notification type + * @param int $uid User ID + * @param array $item Item array + * @return boolean + */ + private static function insertNoticationByItem(int $type, int $uid, array $item) { if (($item['gravity'] == GRAVITY_ACTIVITY) && !in_array($type, [self::NOTIF_DIRECT_COMMENT, self::NOTIF_DIRECT_THREAD_COMMENT])) { @@ -275,10 +283,10 @@ class UserNotification } $fields = [ - 'uid' => $uid, - 'vid' => $item['vid'], + 'uid' => $uid, + 'vid' => $item['vid'], 'type' => $type, - 'actor-id' => $item['author-id'], + 'actor-id' => $item['author-id'], 'parent-uri-id' => $item['parent-uri-id'], 'created' => DateTimeFormat::utcNow(), ]; @@ -289,7 +297,28 @@ class UserNotification $fields['target-uri-id'] = $item['uri-id']; } - DBA::insert('notification', $fields); + return DBA::insert('notification', $fields); + } + + /** + * Add a notification entry + * + * @param int $actor Contact ID of the actor + * @param int $vid Verb ID + * @param int $uid User ID + * @return boolean + */ + public static function insertNotication(int $actor, int $vid, int $uid) + { + $fields = [ + 'uid' => $uid, + 'vid' => $vid, + 'type' => self::NOTIF_NONE, + 'actor-id' => $actor, + 'created' => DateTimeFormat::utcNow(), + ]; + + return DBA::insert('notification', $fields); } /** diff --git a/src/Module/Api/Mastodon/Notifications.php b/src/Module/Api/Mastodon/Notifications.php index 6a2a099593..842b85352f 100644 --- a/src/Module/Api/Mastodon/Notifications.php +++ b/src/Module/Api/Mastodon/Notifications.php @@ -75,7 +75,15 @@ class Notifications extends BaseApi } if (in_array('follow_request', $request['exclude_types'])) { - $condition = DBA::mergeConditions($condition, ["NOT `vid` IN (?)", Verb::getID(Activity::FOLLOW)]); + $condition = DBA::mergeConditions($condition, + ["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND `pending`))", + Verb::getID(Activity::FOLLOW), Post\UserNotification::NOTIF_NONE]); + } + + if (in_array('follow', $request['exclude_types'])) { + $condition = DBA::mergeConditions($condition, + ["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND NOT `pending`))", + Verb::getID(Activity::FOLLOW), Post\UserNotification::NOTIF_NONE]); } if (in_array('favourite', $request['exclude_types'])) {