]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Funkwhale context file moved
[friendica.git] / src / Model / Contact.php
index 59b14ad0feaa9254b8f2738428221925093fd715..a6bb882e8652c8ea0496656ba39a310ba8cbe087 100644 (file)
@@ -119,7 +119,7 @@ class Contact
         * @return array
         * @throws \Exception
         */
-       public static function selectToArray(array $fields = [], array $condition = [], array $params = [])
+       public static function selectToArray(array $fields = [], array $condition = [], array $params = []): array
        {
                return DBA::selectToArray('contact', $fields, $condition, $params);
        }
@@ -128,7 +128,7 @@ class Contact
         * @param array $fields    Array of selected fields, empty for all
         * @param array $condition Array of fields for condition
         * @param array $params    Array of several parameters
-        * @return array
+        * @return array|bool
         * @throws \Exception
         */
        public static function selectFirst(array $fields = [], array $condition = [], array $params = [])
@@ -148,7 +148,7 @@ class Contact
         * @return int  id of the created contact
         * @throws \Exception
         */
-       public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT)
+       public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT): int
        {
                if (!empty($fields['baseurl']) && empty($fields['gsid'])) {
                        $fields['gsid'] = GServer::getID($fields['baseurl'], true);
@@ -187,6 +187,7 @@ class Contact
         *
         * @return boolean was the update successfull?
         * @throws \Exception
+        * @todo Let's get rid of boolean type of $old_fields
         */
        public static function update(array $fields, array $condition, $old_fields = [])
        {
@@ -204,7 +205,7 @@ class Contact
         * @return array|boolean Contact record if it exists, false otherwise
         * @throws \Exception
         */
-       public static function getById($id, $fields = [])
+       public static function getById(int $id, array $fields = [])
        {
                return DBA::selectFirst('contact', $fields, ['id' => $id]);
        }
@@ -217,7 +218,7 @@ class Contact
         * @return array|boolean Contact record if it exists, false otherwise
         * @throws \Exception
         */
-       public static function getByUriId($uri_id, $fields = [])
+       public static function getByUriId(int $uri_id, array $fields = [])
        {
                return DBA::selectFirst('contact', $fields, ['uri-id' => $uri_id], ['order' => ['uid']]);
        }
@@ -231,7 +232,7 @@ class Contact
         * @param integer $uid    User ID of the contact
         * @return array contact array
         */
-       public static function getByURL(string $url, $update = null, array $fields = [], int $uid = 0)
+       public static function getByURL(string $url, $update = null, array $fields = [], int $uid = 0): array
        {
                if ($update || is_null($update)) {
                        $cid = self::getIdForURL($url, $uid, $update);
@@ -302,7 +303,7 @@ class Contact
         * @param array   $fields Field list
         * @return array contact array
         */
-       public static function getByURLForUser(string $url, int $uid = 0, $update = false, array $fields = [])
+       public static function getByURLForUser(string $url, int $uid = 0, $update = false, array $fields = []): array
        {
                if ($uid != 0) {
                        $contact = self::getByURL($url, $update, $fields, $uid);
@@ -333,7 +334,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isFollower($cid, $uid)
+       public static function isFollower(int $cid, int $uid): bool
        {
                if (Contact\User::isBlocked($cid, $uid)) {
                        return false;
@@ -358,7 +359,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isFollowerByURL($url, $uid)
+       public static function isFollowerByURL(string $url, int $uid): bool
        {
                $cid = self::getIdForURL($url, $uid);
 
@@ -370,16 +371,16 @@ class Contact
        }
 
        /**
-        * Tests if the given user follow the given contact
+        * Tests if the given user shares with the given contact
         *
         * @param int $cid Either public contact id or user's contact id
         * @param int $uid User ID
         *
-        * @return boolean is the contact url being followed?
+        * @return boolean is the contact sharing with given user?
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isSharing($cid, $uid)
+       public static function isSharing(int $cid, int $uid): bool
        {
                if (Contact\User::isBlocked($cid, $uid)) {
                        return false;
@@ -404,7 +405,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isSharingByURL($url, $uid)
+       public static function isSharingByURL(string $url, int $uid): bool
        {
                $cid = self::getIdForURL($url, $uid);
 
@@ -425,7 +426,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function getBasepath($url, $dont_update = false)
+       public static function getBasepath(string $url, bool $dont_update = false): string
        {
                $contact = DBA::selectFirst('contact', ['id', 'baseurl'], ['uid' => 0, 'nurl' => Strings::normaliseLink($url)]);
                if (!DBA::isResult($contact)) {
@@ -459,7 +460,7 @@ class Contact
         *
         * @return boolean Is it the same server?
         */
-       public static function isLocal($url)
+       public static function isLocal(string $url): bool
        {
                if (!parse_url($url, PHP_URL_SCHEME)) {
                        $addr_parts = explode('@', $url);
@@ -473,10 +474,9 @@ class Contact
         * Check if the given contact ID is on the same server
         *
         * @param string $url The contact link
-        *
         * @return boolean Is it the same server?
         */
-       public static function isLocalById(int $cid)
+       public static function isLocalById(int $cid): bool
        {
                $contact = DBA::selectFirst('contact', ['url', 'baseurl'], ['id' => $cid]);
                if (!DBA::isResult($contact)) {
@@ -500,7 +500,7 @@ class Contact
         * @return integer|boolean Public contact id for given user id
         * @throws \Exception
         */
-       public static function getPublicIdByUserId($uid)
+       public static function getPublicIdByUserId(int $uid)
        {
                $self = DBA::selectFirst('contact', ['url'], ['self' => true, 'uid' => $uid]);
                if (!DBA::isResult($self)) {
@@ -519,7 +519,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function getPublicAndUserContactID($cid, $uid)
+       public static function getPublicAndUserContactID(int $cid, int $uid): array
        {
                // We have to use the legacy function as long as the post update hasn't finished
                if (DI::config()->get('system', 'post_update_version') < 1427) {
@@ -555,12 +555,11 @@ class Contact
         *
         * @param int $cid Either public contact id or user's contact id
         * @param int $uid User ID
-        *
         * @return array with public and user's contact id
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       private static function legacyGetPublicAndUserContactID($cid, $uid)
+       private static function legacyGetPublicAndUserContactID(int $cid, int $uid): array
        {
                if (empty($uid) || empty($cid)) {
                        return [];
@@ -596,12 +595,11 @@ class Contact
         * @param int $cid A contact ID
         * @param int $uid The User ID
         * @param array $fields The selected fields for the contact
-        *
         * @return array The contact details
         *
         * @throws \Exception
         */
-       public static function getContactForUser($cid, $uid, array $fields = [])
+       public static function getContactForUser(int $cid, int $uid, array $fields = []): array
        {
                $contact = DBA::selectFirst('contact', $fields, ['id' => $cid, 'uid' => $uid]);
 
@@ -619,7 +617,7 @@ class Contact
         * @return bool Operation success
         * @throws HTTPException\InternalServerErrorException
         */
-       public static function createSelfFromUserId($uid)
+       public static function createSelfFromUserId(int $uid): bool
        {
                $user = DBA::selectFirst('user', ['uid', 'username', 'nickname', 'pubkey', 'prvkey'],
                        ['uid' => $uid, 'account_expired' => false]);
@@ -676,12 +674,12 @@ class Contact
        /**
         * Updates the self-contact for the provided user id
         *
-        * @param int     $uid
-        * @param boolean $update_avatar Force the avatar update
-        * @return bool   "true" if updated
+        * @param int   $uid
+        * @param bool  $update_avatar Force the avatar update
+        * @return bool "true" if updated
         * @throws HTTPException\InternalServerErrorException
         */
-       public static function updateSelfFromUserID($uid, $update_avatar = false)
+       public static function updateSelfFromUserID(int $uid, bool $update_avatar = false): bool
        {
                $fields = ['id', 'uri-id', 'name', 'nick', 'location', 'about', 'keywords', 'avatar', 'prvkey', 'pubkey', 'manually-approve',
                        'xmpp', 'matrix', 'contact-type', 'forum', 'prv', 'avatar-date', 'url', 'nurl', 'unsearchable',
@@ -794,9 +792,10 @@ class Contact
         * Marks a contact for removal
         *
         * @param int $id contact id
+        * @return void
         * @throws HTTPException\InternalServerErrorException
         */
-       public static function remove($id)
+       public static function remove(int $id)
        {
                // We want just to make sure that we don't delete our "self" contact
                $contact = DBA::selectFirst('contact', ['uri-id', 'photo', 'thumb', 'micro', 'uid'], ['id' => $id, 'self' => false]);
@@ -821,6 +820,7 @@ class Contact
         * Unfollow the remote contact
         *
         * @param array $contact Target user-specific contact (uid != 0) array
+        * @return void
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
@@ -850,6 +850,7 @@ class Contact
         * The local relationship is updated immediately, the eventual remote server is messaged in the background.
         *
         * @param array $contact User-specific contact array (uid != 0) to revoke the follow from
+        * @return void
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
@@ -877,6 +878,7 @@ class Contact
         * Completely severs a relationship with a contact
         *
         * @param array $contact User-specific contact (uid != 0) array
+        * @return void
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
@@ -924,7 +926,7 @@ class Contact
         * up or some other transient event and that there's a possibility we could recover from it.
         *
         * @param array $contact contact to mark for archival
-        * @return null
+        * @return void
         * @throws HTTPException\InternalServerErrorException
         */
        public static function markForArchival(array $contact)
@@ -977,7 +979,7 @@ class Contact
         * @see   Contact::markForArchival()
         *
         * @param array $contact contact to be unmarked for archival
-        * @return null
+        * @return void
         * @throws \Exception
         */
        public static function unmarkForArchival(array $contact)
@@ -1024,7 +1026,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function photoMenu(array $contact, $uid = 0)
+       public static function photoMenu(array $contact, int $uid = 0): array
        {
                $pm_url = '';
                $status_link = '';
@@ -1167,11 +1169,11 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function getIdForURL($url, $uid = 0, $update = null, $default = [])
+       public static function getIdForURL(string $url = null, int $uid = 0, $update = null, array $default = []): int
        {
                $contact_id = 0;
 
-               if ($url == '') {
+               if (empty($url)) {
                        Logger::notice('Empty url, quitting', ['url' => $url, 'user' => $uid, 'default' => $default]);
                        return 0;
                }
@@ -1179,7 +1181,7 @@ class Contact
                $contact = self::getByURL($url, false, ['id', 'network', 'uri-id'], $uid);
 
                if (!empty($contact)) {
-                       $contact_id = $contact["id"];
+                       $contact_id = $contact['id'];
 
                        if (empty($update) && (!empty($contact['uri-id']) || is_bool($update))) {
                                Logger::debug('Contact found', ['url' => $url, 'uid' => $uid, 'update' => $update, 'cid' => $contact_id]);
@@ -1196,10 +1198,10 @@ class Contact
                $data = [];
 
                if (empty($default['network']) || $update) {
-                       $data = Probe::uri($url, "", $uid);
+                       $data = Probe::uri($url, '', $uid);
 
                        // Take the default values when probing failed
-                       if (!empty($default) && !in_array($data["network"], array_merge(Protocol::NATIVE_SUPPORT, [Protocol::PUMPIO]))) {
+                       if (!empty($default) && !in_array($data['network'], array_merge(Protocol::NATIVE_SUPPORT, [Protocol::PUMPIO]))) {
                                $data = array_merge($data, $default);
                        }
                } elseif (!empty($default['network'])) {
@@ -1311,7 +1313,7 @@ class Contact
         * @return boolean Is the contact archived?
         * @throws HTTPException\InternalServerErrorException
         */
-       public static function isArchived(int $cid)
+       public static function isArchived(int $cid): bool
        {
                if ($cid == 0) {
                        return false;
@@ -1351,11 +1353,10 @@ class Contact
         * Checks if the contact is blocked
         *
         * @param int $cid contact id
-        *
         * @return boolean Is the contact blocked?
         * @throws HTTPException\InternalServerErrorException
         */
-       public static function isBlocked($cid)
+       public static function isBlocked(int $cid): bool
        {
                if ($cid == 0) {
                        return false;
@@ -1377,11 +1378,10 @@ class Contact
         * Checks if the contact is hidden
         *
         * @param int $cid contact id
-        *
         * @return boolean Is the contact hidden?
         * @throws \Exception
         */
-       public static function isHidden($cid)
+       public static function isHidden(int $cid): bool
        {
                if ($cid == 0) {
                        return false;
@@ -1405,7 +1405,7 @@ class Contact
         * @return string posts in HTML
         * @throws \Exception
         */
-       public static function getPostsFromUrl($contact_url, $thread_mode = false, $update = 0, $parent = 0, bool $only_media = false)
+       public static function getPostsFromUrl(string $contact_url, bool $thread_mode = false, int $update = 0, int $parent = 0, bool $only_media = false): string
        {
                return self::getPostsFromId(self::getIdForURL($contact_url), $thread_mode, $update, $parent, $only_media);
        }
@@ -1421,7 +1421,7 @@ class Contact
         * @return string posts in HTML
         * @throws \Exception
         */
-       public static function getPostsFromId($cid, $thread_mode = false, $update = 0, $parent = 0, bool $only_media = false)
+       public static function getPostsFromId(int $cid, bool $thread_mode = false, int $update = 0, int $parent = 0, bool $only_media = false): string
        {
                $contact = DBA::selectFirst('contact', ['contact-type', 'network'], ['id' => $cid]);
                if (!DBA::isResult($contact)) {
@@ -1526,7 +1526,7 @@ class Contact
         * @param int $type type of contact or account
         * @return string
         */
-       public static function getAccountType(int $type)
+       public static function getAccountType(int $type): string
        {
                switch ($type) {
                        case self::TYPE_ORGANISATION:
@@ -1552,11 +1552,11 @@ class Contact
        /**
         * Blocks a contact
         *
-        * @param int $cid
-        * @return bool
-        * @throws \Exception
+        * @param int $cid Contact id to block
+        * @param string $reason Block reason
+        * @return bool Whether it was successful
         */
-       public static function block($cid, $reason = null)
+       public static function block(int $cid, string $reason = null): bool
        {
                $return = self::update(['blocked' => true, 'block_reason' => $reason], ['id' => $cid]);
 
@@ -1566,11 +1566,10 @@ class Contact
        /**
         * Unblocks a contact
         *
-        * @param int $cid
-        * @return bool
-        * @throws \Exception
+        * @param int $cid Contact id to unblock
+        * @return bool Whether it was successfull
         */
-       public static function unblock($cid)
+       public static function unblock(int $cid): bool
        {
                $return = self::update(['blocked' => false, 'block_reason' => null], ['id' => $cid]);
 
@@ -1580,7 +1579,7 @@ class Contact
        /**
         * Ensure that cached avatar exist
         *
-        * @param integer $cid
+        * @param integer $cid Contact id
         */
        public static function checkAvatarCache(int $cid)
        {
@@ -1620,7 +1619,7 @@ class Contact
         * @param bool  $no_update Don't perfom an update if no cached avatar was found
         * @return string photo path
         */
-       private static function getAvatarPath(array $contact, string $size, $no_update = false)
+       private static function getAvatarPath(array $contact, string $size, bool $no_update = false): string
        {
                $contact = self::checkAvatarCacheByArray($contact, $no_update);
 
@@ -1654,7 +1653,7 @@ class Contact
         * @param bool   $no_update Don't perfom an update if no cached avatar was found
         * @return string photo path
         */
-       public static function getPhoto(array $contact, bool $no_update = false)
+       public static function getPhoto(array $contact, bool $no_update = false): string
        {
                return self::getAvatarPath($contact, Proxy::SIZE_SMALL, $no_update);
        }
@@ -1666,7 +1665,7 @@ class Contact
         * @param bool   $no_update Don't perfom an update if no cached avatar was found
         * @return string photo path
         */
-       public static function getThumb(array $contact, bool $no_update = false)
+       public static function getThumb(array $contact, bool $no_update = false): string
        {
                return self::getAvatarPath($contact, Proxy::SIZE_THUMB, $no_update);
        }
@@ -1678,7 +1677,7 @@ class Contact
         * @param bool   $no_update Don't perfom an update if no cached avatar was found
         * @return string photo path
         */
-       public static function getMicro(array $contact, bool $no_update = false)
+       public static function getMicro(array $contact, bool $no_update = false): string
        {
                return self::getAvatarPath($contact, Proxy::SIZE_MICRO, $no_update);
        }
@@ -1690,7 +1689,7 @@ class Contact
         * @param bool  $no_update Don't perfom an update if no cached avatar was found
         * @return array contact array with avatar cache fields
         */
-       private static function checkAvatarCacheByArray(array $contact, bool $no_update = false)
+       private static function checkAvatarCacheByArray(array $contact, bool $no_update = false): array
        {
                $update = false;
                $contact_fields = [];
@@ -1796,7 +1795,7 @@ class Contact
         * @param string $size    Size of the avatar picture
         * @return string avatar URL
         */
-       public static function getDefaultAvatar(array $contact, string $size)
+       public static function getDefaultAvatar(array $contact, string $size): string
        {
                switch ($size) {
                        case Proxy::SIZE_MICRO:
@@ -1817,6 +1816,114 @@ class Contact
                }
 
                if (!DI::config()->get('system', 'remote_avatar_lookup')) {
+                       $platform = '';
+                       $type     = Contact::TYPE_PERSON;
+
+                       if (!empty($contact['id'])) {
+                               $account = DBA::selectFirst('account-user-view', ['platform', 'contact-type'], ['id' => $contact['id']]);
+                               $platform = $account['platform'] ?? '';
+                               $type     = $account['contact-type'] ?? Contact::TYPE_PERSON;
+                       }
+
+                       if (empty($platform) && !empty($contact['uri-id'])) {
+                               $account = DBA::selectFirst('account-user-view', ['platform', 'contact-type'], ['uri-id' => $contact['uri-id']]);
+                               $platform = $account['platform'] ?? '';
+                               $type     = $account['contact-type'] ?? Contact::TYPE_PERSON;
+                       }
+
+                       switch ($platform) {
+                               case 'corgidon':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://github.com/msdos621/corgidon/blob/main/public/avatars/original/missing.png
+                                        */
+                                       $default = '/images/default/corgidon.png';
+                                       break;
+
+                               case 'diaspora':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://github.com/diaspora/diaspora/
+                                        */
+                                       $default = '/images/default/diaspora.png';
+                                       break;
+
+                               case 'gotosocial':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://github.com/superseriousbusiness/gotosocial/blob/main/web/assets/default_avatars/GoToSocial_icon1.svg
+                                        */
+                                       $default = '/images/default/gotosocial.svg';
+                                       break;
+
+                               case 'hometown':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://github.com/hometown-fork/hometown/blob/hometown-dev/public/avatars/original/missing.png
+                                        */
+                                       $default = '/images/default/hometown.png';
+                                       break;
+
+                               case 'koyuspace':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://github.com/koyuspace/mastodon/blob/main/public/avatars/original/missing.png
+                                        */
+                                       $default = '/images/default/koyuspace.png';
+                                       break;
+
+                               case 'ecko':
+                               case 'qoto':
+                               case 'mastodon':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://github.com/mastodon/mastodon/tree/main/public/avatars/original/missing.png
+                                        */
+                                       $default = '/images/default/mastodon.png';
+                                       break;
+
+                               case 'peertube':
+                                       if ($type == Contact::TYPE_COMMUNITY) {
+                                               /**
+                                                * Picture credits
+                                                * @license GNU Affero General Public License v3.0
+                                                * @link    https://github.com/Chocobozzz/PeerTube/blob/develop/client/src/assets/images/default-avatar-video-channel.png
+                                                */
+                                               $default = '/images/default/peertube-channel.png';
+                                       } else {
+                                               /**
+                                                * Picture credits
+                                                * @license GNU Affero General Public License v3.0
+                                                * @link    https://github.com/Chocobozzz/PeerTube/blob/develop/client/src/assets/images/default-avatar-account.png
+                                                */
+                                               $default = '/images/default/peertube-account.png';
+                                       }
+                                       break;
+
+                               case 'pleroma':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://git.pleroma.social/pleroma/pleroma/-/blob/develop/priv/static/images/avi.png
+                                        */
+                                       $default = '/images/default/pleroma.png';
+                                       break;
+
+                               case 'plume':
+                                       /**
+                                        * Picture credits
+                                        * @license GNU Affero General Public License v3.0
+                                        * @link    https://github.com/Plume-org/Plume/blob/main/assets/images/default-avatar.png
+                                        */
+                                       $default = '/images/default/plume.png';
+                                       break;
+                       }
                        return DI::baseUrl() . $default;
                }
 
@@ -1850,7 +1957,7 @@ class Contact
         * @param string  $updated Contact update date
         * @return string avatar link
         */
-       public static function getAvatarUrlForId(int $cid, string $size = '', string $updated = '', string $guid = ''):string
+       public static function getAvatarUrlForId(int $cid, string $size = '', string $updated = '', string $guid = ''): string
        {
                // We have to fetch the "updated" variable when it wasn't provided
                // The parameter can be provided to improve performance
@@ -1891,7 +1998,7 @@ class Contact
         * @param string  $size One of the Proxy::SIZE_* constants
         * @return string avatar link
         */
-       public static function getAvatarUrlForUrl(string $url, int $uid, string $size = ''):string
+       public static function getAvatarUrlForUrl(string $url, int $uid, string $size = ''): string
        {
                $condition = ["`nurl` = ? AND ((`uid` = ? AND `network` IN (?, ?)) OR `uid` = ?)",
                        Strings::normaliseLink($url), $uid, Protocol::FEED, Protocol::MAIL, 0];
@@ -1907,7 +2014,7 @@ class Contact
         * @param string  $updated Contact update date
         * @return string header link
         */
-       public static function getHeaderUrlForId(int $cid, string $size = '', string $updated = '', string $guid = ''):string
+       public static function getHeaderUrlForId(int $cid, string $size = '', string $updated = '', string $guid = ''): string
        {
                // We have to fetch the "updated" variable when it wasn't provided
                // The parameter can be provided to improve performance
@@ -2204,6 +2311,8 @@ class Contact
        }
 
        /**
+        * Updates contact record by provided id and optional network
+        *
         * @param integer $id      contact id
         * @param string  $network Optional network we are probing for
         * @return boolean
@@ -2227,13 +2336,15 @@ class Contact
        }
 
        /**
+        * Updates contact record by provided id and probed data
+        *
         * @param integer $id      contact id
         * @param array   $ret     Probed data
         * @return boolean
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       private static function updateFromProbeArray(int $id, array $ret)
+       private static function updateFromProbeArray(int $id, array $ret): bool
        {
                /*
                  Warning: Never ever fetch the public key via Probe::uri and write it into the contacts.
@@ -2444,12 +2555,14 @@ class Contact
        }
 
        /**
+        * Updates contact record by provided URL
+        *
         * @param integer $url contact url
         * @return integer Contact id
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function updateFromProbeByURL($url)
+       public static function updateFromProbeByURL(string $url): int
        {
                $id = self::getIdForURL($url);
 
@@ -2470,7 +2583,7 @@ class Contact
         * @param string $network Network of that contact
         * @return string with protocol
         */
-       public static function getProtocol($url, $network)
+       public static function getProtocol(string $url, string $network): string
        {
                if ($network != Protocol::DFRN) {
                        return $network;
@@ -2506,7 +2619,7 @@ class Contact
         * @throws HTTPException\NotFoundException
         * @throws \ImagickException
         */
-       public static function createFromProbeForUser(int $uid, $url, $network = '')
+       public static function createFromProbeForUser(int $uid, string $url, string $network = ''): array
        {
                $result = ['cid' => -1, 'success' => false, 'message' => ''];
 
@@ -2695,7 +2808,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function addRelationship(array $importer, array $contact, array $datarray, $sharing = false, $note = '')
+       public static function addRelationship(array $importer, array $contact, array $datarray, bool $sharing = false, string $note = '')
        {
                // Should always be set
                if (empty($datarray['author-id'])) {
@@ -2837,6 +2950,7 @@ class Contact
         * Update the local relationship when a local user loses a follower
         *
         * @param array $contact User-specific contact (uid != 0) array
+        * @return void
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
@@ -2922,7 +3036,7 @@ class Contact
         * @return array
         * @throws \Exception
         */
-       public static function pruneUnavailable(array $contact_ids)
+       public static function pruneUnavailable(array $contact_ids): array
        {
                if (empty($contact_ids)) {
                        return [];
@@ -2950,7 +3064,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function magicLink($contact_url, $url = '')
+       public static function magicLink(string $contact_url, string $url = ''): string
        {
                if (!Session::isAuthenticated()) {
                        return $url ?: $contact_url; // Equivalent to: ($url != '') ? $url : $contact_url;
@@ -2977,7 +3091,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function magicLinkById($cid, $url = '')
+       public static function magicLinkById(int $cid, string $url = ''): string
        {
                $contact = DBA::selectFirst('contact', ['id', 'network', 'url', 'uid'], ['id' => $cid]);
 
@@ -2994,7 +3108,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function magicLinkByContact($contact, $url = '')
+       public static function magicLinkByContact(array $contact, string $url = ''): string
        {
                $destination = $url ?: $contact['url']; // Equivalent to ($url != '') ? $url : $contact['url'];
 
@@ -3035,7 +3149,7 @@ class Contact
         *
         * @return boolean "true" if it is a forum
         */
-       public static function isForum($contactid)
+       public static function isForum(int $contactid): bool
        {
                $fields = ['contact-type'];
                $condition = ['id' => $contactid];
@@ -3054,7 +3168,7 @@ class Contact
         * @param array $contact
         * @return bool
         */
-       public static function canReceivePrivateMessages(array $contact)
+       public static function canReceivePrivateMessages(array $contact): bool
        {
                $protocol = $contact['network'] ?? $contact['protocol'] ?? Protocol::PHANTOM;
                $self = $contact['self'] ?? false;
@@ -3072,7 +3186,7 @@ class Contact
         * @return array with search results
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function searchByName(string $search, string $mode = '', int $uid = 0)
+       public static function searchByName(string $search, string $mode = '', int $uid = 0): array
        {
                if (empty($search)) {
                        return [];
@@ -3115,7 +3229,7 @@ class Contact
         * @param array $urls
         * @return array result "count", "added" and "updated"
         */
-       public static function addByUrls(array $urls)
+       public static function addByUrls(array $urls): array
        {
                $added = 0;
                $updated = 0;
@@ -3148,7 +3262,7 @@ class Contact
         * @return array The profile array
         * @throws Exception
         */
-       public static function getRandomContact()
+       public static function getRandomContact(): array
        {
                $contact = DBA::selectFirst('contact', ['id', 'network', 'url', 'uid'], [
                        "`uid` = ? AND `network` = ? AND NOT `failed` AND `last-item` > ?",