]> git.mxchange.org Git - friendica.git/commitdiff
Added notifications for follow requests
authorMichael <heluecht@pirati.ca>
Tue, 1 Jun 2021 21:13:16 +0000 (21:13 +0000)
committerMichael <heluecht@pirati.ca>
Tue, 1 Jun 2021 21:13:16 +0000 (21:13 +0000)
src/Factory/Api/Mastodon/Notification.php
src/Model/Contact.php
src/Model/Post/UserNotification.php
src/Module/Api/Mastodon/Notifications.php

index 11c0aee3aab01ff15407e65bdc529db9d7e075e2..ea7fa021f499f59b494e2a78c9d4b7e85cbd6444 100644 (file)
@@ -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)]) &&
index 916efe833051bf32008339bf1290358e435b7770..246a2967b2edc9f57dea379f38865a7fc89f0825 100644 (file)
@@ -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
index 38c2bdd8e81d93e417536dc4f63b24acd5b186d2..c8e31cdc03de541d6a9b1669ea8df77d61bdde10 100644 (file)
@@ -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);
        }
 
        /**
index 6a2a09959385aea2a4fe8a7d4a3d1b7eb07952d1..842b85352f770ab62831b13e812a66a9a054d50d 100644 (file)
@@ -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'])) {