From 3c85f3ce99ae42963366ec7880fd212f953137cd Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 21 Aug 2020 21:27:40 +0000 Subject: [PATCH] Fetch followers/followings locally --- src/Model/Contact/Relation.php | 56 ++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/src/Model/Contact/Relation.php b/src/Model/Contact/Relation.php index 80092e0388..24d663cbbf 100644 --- a/src/Model/Contact/Relation.php +++ b/src/Model/Contact/Relation.php @@ -28,6 +28,8 @@ use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\APContact; use Friendica\Model\Contact; +use Friendica\Model\Profile; +use Friendica\Model\User; use Friendica\Protocol\ActivityPub; use Friendica\Util\DateTimeFormat; use Friendica\Util\Strings; @@ -82,18 +84,25 @@ class Relation return; } - $apcontact = APContact::getByURL($url, false); - - if (!empty($apcontact['followers']) && is_string($apcontact['followers'])) { - $followers = ActivityPub::fetchItems($apcontact['followers']); + $uid = User::getIdForURL($url); + if (!empty($uid)) { + // Fetch the followers/followings locally + $followers = self::getContacts($uid, [Contact::FOLLOWER, Contact::FRIEND]); + $followings = self::getContacts($uid, [Contact::SHARING, Contact::FRIEND]); } else { - $followers = []; - } + $apcontact = APContact::getByURL($url, false); - if (!empty($apcontact['following']) && is_string($apcontact['following'])) { - $followings = ActivityPub::fetchItems($apcontact['following']); - } else { - $followings = []; + if (!empty($apcontact['followers']) && is_string($apcontact['followers'])) { + $followers = ActivityPub::fetchItems($apcontact['followers']); + } else { + $followers = []; + } + + if (!empty($apcontact['following']) && is_string($apcontact['following'])) { + $followings = ActivityPub::fetchItems($apcontact['following']); + } else { + $followings = []; + } } if (empty($followers) && empty($followings)) { @@ -150,6 +159,33 @@ class Relation return; } + /** + * Fetch contact list from the given local user + * + * @param integer $uid + * @param array $rel + * @return void + */ + private static function getContacts(int $uid, array $rel) + { + $list = []; + $profile = Profile::getByUID($uid); + if (!empty($profile['hide-friends'])) { + return $list; + } + + $condition = ['rel' => $rel, 'uid' => $uid, 'self' => false, 'deleted' => false, + 'hidden' => false, 'archive' => false, 'pending' => false]; + $condition = DBA::mergeConditions($condition, ["`url` IN (SELECT `url` FROM `apcontact`)"]); + $contacts = DBA::select('contact', ['url'], $condition); + while ($contact = DBA::fetch($contacts)) { + $list[] = $contact['url']; + } + DBA::close($contacts); + + return $list; + } + /** * Tests if a given contact url is discoverable *