]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Merge pull request #10277 from very-ape/authenticate-hook
[friendica.git] / src / Model / Contact.php
index b0b5fcc91b0dd37bedfb3de5b4efe83d0906434a..89325e0939fedcd860b0d8d21c27e2849386f590 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2021, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -264,7 +264,7 @@ class Contact
                        $condition = ['`alias` IN (?, ?, ?) AND `uid` = ? AND NOT `deleted`', $url, Strings::normaliseLink($url), $ssl_url, $uid];
                        $contact = DBA::selectFirst('contact', $fields, $condition, $options);
                }
-               
+
                if (!DBA::isResult($contact)) {
                        return [];
                }
@@ -307,7 +307,7 @@ class Contact
                }
 
                $contact = self::getByURL($url, $update, $fields);
-               if (!empty($contact['id'])) {           
+               if (!empty($contact['id'])) {
                        $contact['cid'] = 0;
                        $contact['zid'] = $contact['id'];
                }
@@ -1274,7 +1274,7 @@ class Contact
         *
         * @param string $contact_url Contact URL
         * @param bool   $thread_mode
-        * @param int    $update      Update mode 
+        * @param int    $update      Update mode
         * @param int    $parent      Item parent ID for the update mode
         * @return string posts in HTML
         * @throws \Exception
@@ -1289,7 +1289,7 @@ class Contact
         *
         * @param int  $cid         Contact ID
         * @param bool $thread_mode
-        * @param int  $update      Update mode 
+        * @param int  $update      Update mode
         * @param int  $parent     Item parent ID for the update mode
         * @return string posts in HTML
         * @throws \Exception
@@ -1347,7 +1347,7 @@ class Contact
                        $o = '';
                }
 
-               if ($thread_mode) {             
+               if ($thread_mode) {
                        $items = Post::toArray(Post::selectForUser(local_user(), ['uri-id', 'gravity', 'parent-uri-id', 'thr-parent-id', 'author-id'], $condition, $params));
 
                        $o .= conversation($a, $items, 'contacts', $update, false, 'commented', local_user());
@@ -1607,12 +1607,12 @@ class Contact
                                $avatar['size'] = 48;
                                $default = self::DEFAULT_AVATAR_MICRO;
                                break;
-       
+
                        case Proxy::SIZE_THUMB:
                                $avatar['size'] = 80;
                                $default = self::DEFAULT_AVATAR_THUMB;
                                break;
-       
+
                        case Proxy::SIZE_SMALL:
                        default:
                                $avatar['size'] = 300;
@@ -1720,7 +1720,7 @@ class Contact
                                        $contact['thumb'] ?? '',
                                        $contact['micro'] ?? '',
                                ];
-               
+
                                foreach ($data as $image_uri) {
                                        $image_rid = Photo::ridFromURI($image_uri);
                                        if ($image_rid && !Photo::exists(['resource-id' => $image_rid, 'uid' => $uid])) {
@@ -2027,7 +2027,7 @@ class Contact
                        if (Contact\Relation::isDiscoverable($ret['url'])) {
                                Worker::add(PRIORITY_LOW, 'ContactDiscovery', $ret['url']);
                        }
-       
+
                        // Update the public contact
                        if ($uid != 0) {
                                $contact = self::getByURL($ret['url'], false, ['id']);
@@ -2409,6 +2409,50 @@ class Contact
                return $contact;
        }
 
+       /**
+        * Follow a contact
+        *
+        * @param int $cid Public contact id
+        * @param int $uid  User ID
+        *
+        * @return bool "true" if following had been successful
+        */
+       public static function follow(int $cid, int $uid)
+       {
+               $user = User::getById($uid);
+               if (empty($user)) {
+                       return false;
+               }
+
+               $contact = self::getById($cid, ['url']);
+
+               $result = self::createFromProbe($user, $contact['url'], false);
+
+               return $result['cid'];
+       }
+
+       /**
+        * Unfollow a contact
+        *
+        * @param int $cid Public contact id
+        * @param int $uid  User ID
+        *
+        * @return bool "true" if unfollowing had been successful
+        */
+       public static function unfollow(int $cid, int $uid)
+       {
+               $cdata = self::getPublicAndUserContacID($cid, $uid);
+               if (empty($cdata['user'])) {
+                       return false;
+               }
+
+               $contact = self::getById($cdata['user']);
+
+               self::removeSharer([], $contact);
+
+               return true;
+       }
+
        /**
         * @param array  $importer Owner (local user) data
         * @param array  $contact  Existing owner-specific contact data we want to expand the relationship with. Optional.
@@ -2554,7 +2598,7 @@ class Contact
                return null;
        }
 
-       public static function removeFollower($importer, $contact, array $datarray = [], $item = "")
+       public static function removeFollower($importer, $contact)
        {
                if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::SHARING)) {
                        DBA::update('contact', ['rel' => self::SHARING], ['id' => $contact['id']]);
@@ -2563,7 +2607,7 @@ class Contact
                }
        }
 
-       public static function removeSharer($importer, $contact, array $datarray = [], $item = "")
+       public static function removeSharer($importer, $contact)
        {
                if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::FOLLOWER)) {
                        DBA::update('contact', ['rel' => self::FOLLOWER], ['id' => $contact['id']]);
@@ -2763,11 +2807,12 @@ class Contact
         *
         * @param string $search Name or nick
         * @param string $mode   Search mode (e.g. "community")
+        * @param int    $uid    User ID
         *
         * @return array with search results
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function searchByName($search, $mode = '')
+       public static function searchByName(string $search, string $mode = '', int $uid = 0)
        {
                if (empty($search)) {
                        return [];
@@ -2800,7 +2845,7 @@ class Contact
                                NOT `failed` AND `uid` = ? AND
                                (`addr` LIKE ? OR `name` LIKE ? OR `nick` LIKE ?) $extra_sql
                                ORDER BY `nurl` DESC LIMIT 1000",
-                       Protocol::DFRN, Protocol::ACTIVITYPUB, $ostatus, $diaspora, 0, $search, $search, $search
+                       Protocol::DFRN, Protocol::ACTIVITYPUB, $ostatus, $diaspora, $uid, $search, $search, $search
                );
 
                $contacts = DBA::toArray($results);
@@ -2821,6 +2866,9 @@ class Contact
                $count = 0;
 
                foreach ($urls as $url) {
+                       if (empty($url) || !is_string($url)) {
+                               continue;
+                       }
                        $contact = self::getByURL($url, false, ['id', 'updated']);
                        if (empty($contact['id'])) {
                                Worker::add(PRIORITY_LOW, 'AddContact', 0, $url);