From 29494ea721b9ea2b2feee0f2950ecf7c1b8e4a69 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 19 Aug 2020 04:11:20 +0000 Subject: [PATCH 1/6] Avoid local network requests --- src/Model/Contact.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 4f7cd2598b..7772bad878 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -1576,6 +1576,19 @@ class Contact return; } + // Replace cached avatar pictures from the default avatar with the default avatars in different sizes + if (strpos($avatar, self::DEFAULT_AVATAR_PHOTO)) { + $fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(), + 'photo' => DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO, + 'thumb' => DI::baseUrl() . self::DEFAULT_AVATAR_THUMB, + 'micro' => DI::baseUrl() . self::DEFAULT_AVATAR_MICRO]; + if ($fields['photo'] . $fields['thumb'] . $fields['micro'] != $contact['photo'] . $contact['thumb'] . $contact['micro']) { + DBA::update('contact', $fields, ['id' => $cid]); + Photo::delete(['uid' => $uid, 'contact-id' => $cid, 'album' => Photo::CONTACT_PHOTOS]); + } + return; + } + $data = [ $contact['photo'] ?? '', $contact['thumb'] ?? '', @@ -1584,16 +1597,6 @@ class Contact $update = ($contact['avatar'] != $avatar) || $force; - if (strpos($avatar, self::DEFAULT_AVATAR_PHOTO)) { - $fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(), - 'photo' => DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO, - 'thumb' => DI::baseUrl() . self::DEFAULT_AVATAR_THUMB, - 'micro' => DI::baseUrl() . self::DEFAULT_AVATAR_MICRO]; - DBA::update('contact', $fields, ['id' => $cid]); - Photo::delete(['uid' => $uid, 'contact-id' => $cid, 'album' => Photo::CONTACT_PHOTOS]); - return; - } - if (!$update) { foreach ($data as $image_uri) { $image_rid = Photo::ridFromURI($image_uri); From eb95314aaa42bf097dbd54aac5b9f97fb4380b9c Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 19 Aug 2020 04:45:31 +0000 Subject: [PATCH 2/6] Avoid locally probing last item via network --- src/Model/User.php | 5 +++++ src/Network/Probe.php | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/Model/User.php b/src/Model/User.php index 38fe3b0ec4..990df65dbd 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -164,6 +164,11 @@ class User */ public static function getIdForURL(string $url) { + // Avoid any database requests when the hostname isn't even part of the url. + if (!strpos($url, DI::baseUrl()->getHostname())) { + return 0; + } + $self = Contact::selectFirst(['uid'], ['self' => true, 'nurl' => Strings::normaliseLink($url)]); if (!empty($self['uid'])) { return $self['uid']; diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 137f245755..99e62fb466 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -2012,6 +2012,14 @@ class Probe */ public static function getLastUpdate(array $data) { + $uid = User::getIdForURL($data['url']); + if (!empty($uid)) { + $contact = Contact::selectFirst(['url', 'last-item'], ['self' => true, 'uid' => $uid]); + if (!empty($contact['last-item'])) { + return $contact['last-item']; + } + } + if ($lastUpdate = self::updateFromNoScrape($data)) { return $lastUpdate; } From 3d1829ede577de8ca37bf29128f666827ffdf0f3 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 19 Aug 2020 05:18:19 +0000 Subject: [PATCH 3/6] Don't poll locally / user self data --- src/Model/Contact.php | 8 ++++++++ src/Worker/OnePoll.php | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 7772bad878..ed8bc7d55c 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -1576,12 +1576,20 @@ class Contact return; } + $local_uid = User::getIdForURL($contact['url']); + if (!empty($local_uid)) { + $fields = self::selectFirst(['avatar', 'avatar-date', 'photo', 'thumb', 'micro'], ['self' => true, 'uid' => $local_uid]); + } + // Replace cached avatar pictures from the default avatar with the default avatars in different sizes if (strpos($avatar, self::DEFAULT_AVATAR_PHOTO)) { $fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(), 'photo' => DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO, 'thumb' => DI::baseUrl() . self::DEFAULT_AVATAR_THUMB, 'micro' => DI::baseUrl() . self::DEFAULT_AVATAR_MICRO]; + } + + if (!empty($fields)) { if ($fields['photo'] . $fields['thumb'] . $fields['micro'] != $contact['photo'] . $contact['thumb'] . $contact['micro']) { DBA::update('contact', $fields, ['id' => $cid]); Photo::delete(['uid' => $uid, 'contact-id' => $cid, 'album' => Photo::CONTACT_PHOTOS]); diff --git a/src/Worker/OnePoll.php b/src/Worker/OnePoll.php index 4dfbf7cadb..867b11fd30 100644 --- a/src/Worker/OnePoll.php +++ b/src/Worker/OnePoll.php @@ -103,6 +103,15 @@ class OnePoll return; } + // Don't poll local contacts + if (Contact::isLocalById($contact['id'])) { + Logger::info('Local contacts are not polled', ['id' => $contact['id']]); + + // set the last-update so we don't keep polling + DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]); + return; + } + // We don't poll AP contacts by now if ($protocol === Protocol::ACTIVITYPUB) { Logger::log("Don't poll AP contact"); From 38ed5c943d0fe72f95a842ad35c89433c9e4b888 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 19 Aug 2020 05:24:53 +0000 Subject: [PATCH 4/6] Avoid probing non existing profiles --- src/Content/Text/BBCode.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index cae3e941a7..5b22746ce6 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -1973,8 +1973,7 @@ class BBCode */ private static function bbCodeMention2DiasporaCallback($match) { - $contact = Contact::getByURL($match[3], null, ['addr']); - + $contact = Contact::getByURL($match[3], false, ['addr']); if (empty($contact['addr'])) { return $match[0]; } From b82f22aa0e18d33811ae2644c9c599c8165a1d21 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 19 Aug 2020 08:20:31 +0000 Subject: [PATCH 5/6] Fix missing field --- src/Model/Contact.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index ed8bc7d55c..9b0f6829d1 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -1560,7 +1560,7 @@ class Contact */ public static function updateAvatar(int $cid, string $avatar, bool $force = false) { - $contact = DBA::selectFirst('contact', ['uid', 'avatar', 'photo', 'thumb', 'micro', 'nurl'], ['id' => $cid, 'self' => false]); + $contact = DBA::selectFirst('contact', ['uid', 'avatar', 'photo', 'thumb', 'micro', 'nurl', 'url'], ['id' => $cid, 'self' => false]); if (!DBA::isResult($contact)) { return; } From 52a933c4c93acea3686e40cb761e6eb5762688be Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 19 Aug 2020 12:47:14 +0000 Subject: [PATCH 6/6] Different check for being local --- src/Worker/OnePoll.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Worker/OnePoll.php b/src/Worker/OnePoll.php index 867b11fd30..7d69517319 100644 --- a/src/Worker/OnePoll.php +++ b/src/Worker/OnePoll.php @@ -104,7 +104,7 @@ class OnePoll } // Don't poll local contacts - if (Contact::isLocalById($contact['id'])) { + if (User::getIdForURL($contact['url'])) { Logger::info('Local contacts are not polled', ['id' => $contact['id']]); // set the last-update so we don't keep polling