]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Possibly fix a fatal error
[friendica.git] / src / Model / Contact.php
index 1cf8c742374bbca4e3b85f02f3bdea99e6176833..855f90431c3fd3a88919ba48986d1e3c5b7906b9 100644 (file)
@@ -43,6 +43,7 @@ use Friendica\Protocol\Salmon;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Images;
 use Friendica\Util\Network;
+use Friendica\Util\Proxy;
 use Friendica\Util\Strings;
 
 /**
@@ -206,7 +207,12 @@ class Contact
                        if (empty($cid)) {
                                return [];
                        }
-                       return self::getById($cid, $fields);
+
+                       $contact = self::getById($cid, $fields);
+                       if (empty($contact)) {
+                               return [];
+                       }
+                       return $contact;
                }
 
                // Add internal fields
@@ -237,6 +243,10 @@ class Contact
                        $contact = DBA::selectFirst('contact', $fields, $condition, $options);
                }
                
+               if (!DBA::isResult($contact)) {
+                       return [];
+               }
+
                // Update the contact in the background if needed
                if ((($contact['updated'] < DateTimeFormat::utc('now -7 days')) || empty($contact['avatar'])) &&
                        in_array($contact['network'], Protocol::FEDERATED)) {
@@ -1787,6 +1797,120 @@ class Contact
                self::updateAvatar($cid, $contact['avatar'], true);
        }
 
+       /**
+        * Return the photo path for a given contact array in the given size
+        *
+        * @param array $contact  contact array
+        * @param string $field   Fieldname of the photo in the contact array
+        * @param string $default Default path when no picture had been found
+        * @param string $size    Size of the avatar picture
+        * @param string $avatar  Avatar path that is displayed when no photo had been found
+        * @return string photo path
+        */
+       private static function getAvatarPath(array $contact, string $field, string $default, string $size, string $avatar)
+       {
+               if (!empty($contact)) {
+                       $contact = self::checkAvatarCacheByArray($contact);
+                       if (!empty($contact[$field])) {
+                               $avatar = $contact[$field];
+                       }
+               }
+
+               if (empty($avatar)) {
+                       return $default;
+               }
+
+               if (Proxy::isLocalImage($avatar)) {
+                       return $avatar;
+               } else {
+                       return Proxy::proxifyUrl($avatar, false, $size);
+               }
+       }
+
+       /**
+        * Return the photo path for a given contact array
+        *
+        * @param array $contact Contact array
+        * @param string $avatar  Avatar path that is displayed when no photo had been found
+        * @return string photo path
+        */
+       public static function getPhoto(array $contact, string $avatar = '')
+       {
+               return self::getAvatarPath($contact, 'photo', DI::baseUrl() . '/images/person-300.jpg', Proxy::SIZE_SMALL, $avatar);
+       }
+
+       /**
+        * Return the photo path (thumb size) for a given contact array
+        *
+        * @param array $contact Contact array
+        * @param string $avatar  Avatar path that is displayed when no photo had been found
+        * @return string photo path
+        */
+       public static function getThumb(array $contact, string $avatar = '')
+       {
+               return self::getAvatarPath($contact, 'thumb', DI::baseUrl() . '/images/person-80.jpg', Proxy::SIZE_THUMB, $avatar);
+       }
+
+       /**
+        * Return the photo path (micro size) for a given contact array
+        *
+        * @param array $contact Contact array
+        * @param string $avatar  Avatar path that is displayed when no photo had been found
+        * @return string photo path
+        */
+       public static function getMicro(array $contact, string $avatar = '')
+       {
+               return self::getAvatarPath($contact, 'micro', DI::baseUrl() . '/images/person-48.jpg', Proxy::SIZE_MICRO, $avatar);
+       }
+
+       /**
+        * Check the given contact array for avatar cache fields
+        *
+        * @param array $contact
+        * @return array contact array with avatar cache fields
+        */
+       private static function checkAvatarCacheByArray(array $contact)
+       {
+               $update = false;
+               $contact_fields = [];
+               $fields = ['photo', 'thumb', 'micro'];
+               foreach ($fields as $field) {
+                       if (isset($contact[$field])) {
+                               $contact_fields[] = $field;
+                       }
+                       if (isset($contact[$field]) && empty($contact[$field])) {
+                               $update = true;
+                       }
+               }
+
+               if (!$update) {
+                       return $contact;
+               }
+
+               if (!empty($contact['id']) && !empty($contact['avatar'])) {
+                       self::updateAvatar($contact['id'], $contact['avatar'], true);
+
+                       $new_contact = self::getById($contact['id'], $contact_fields);
+                       if (DBA::isResult($new_contact)) {
+                               // We only update the cache fields
+                               $contact = array_merge($contact, $new_contact);
+                       }
+               }
+
+               /// add the default avatars if the fields aren't filled
+               if (isset($contact['photo']) && empty($contact['photo'])) {
+                       $contact['photo'] = DI::baseUrl() . '/images/person-300.jpg';
+               }
+               if (isset($contact['thumb']) && empty($contact['thumb'])) {
+                       $contact['thumb'] = DI::baseUrl() . '/images/person-80.jpg';
+               }
+               if (isset($contact['micro']) && empty($contact['micro'])) {
+                       $contact['micro'] = DI::baseUrl() . '/images/person-48.jpg';
+               }
+
+               return $contact;
+       }
+
        /**
         * Updates the avatar links in a contact only if needed
         *
@@ -1960,7 +2084,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function updateFromProbe($id, $network = '', $force = false)
+       public static function updateFromProbe(int $id, string $network = '', bool $force = false)
        {
                /*
                  Warning: Never ever fetch the public key via Probe::uri and write it into the contacts.
@@ -2008,6 +2132,10 @@ class Contact
                        return false;
                }
 
+               if (ContactRelation::isDiscoverable($ret['url'])) {
+                       Worker::add(PRIORITY_LOW, 'ContactDiscovery', $ret['url']);
+               }
+
                if (isset($ret['hide']) && is_bool($ret['hide'])) {
                        $ret['unsearchable'] = $ret['hide'];
                }
@@ -2032,8 +2160,6 @@ class Contact
                        GContact::updateFromPublicContactID($id);
                }
 
-               ContactRelation::discoverByUrl($ret['url']);
-
                $update = false;
 
                // make sure to not overwrite existing values with blank entries except some technical fields