use Friendica\Database\Database;
use Friendica\Database\DBA;
use Friendica\DI;
+use Friendica\Module\NoScrape;
use Friendica\Network\HTTPException;
use Friendica\Network\Probe;
use Friendica\Protocol\Activity;
public static function remove($id)
{
// We want just to make sure that we don't delete our "self" contact
- $contact = DBA::selectFirst('contact', ['uri-id', 'photo', 'thumb', 'micro'], ['id' => $id, 'self' => false]);
+ $contact = DBA::selectFirst('contact', ['uri-id', 'photo', 'thumb', 'micro', 'uid'], ['id' => $id, 'self' => false]);
if (!DBA::isResult($contact)) {
return;
}
+ self::clearFollowerFollowingEndpointCache($contact['uid']);
+
// Archive the contact
self::update(['archive' => true, 'network' => Protocol::PHANTOM, 'deleted' => true], ['id' => $id]);
self::remove($contact['id']);
}
+ private static function clearFollowerFollowingEndpointCache(int $uid)
+ {
+ if (empty($uid)) {
+ return;
+ }
+
+ DI::cache()->delete(ActivityPub\Transmitter::CACHEKEY_CONTACTS . 'followers:' . $uid);
+ DI::cache()->delete(ActivityPub\Transmitter::CACHEKEY_CONTACTS . 'following:' . $uid);
+ DI::cache()->delete(NoScrape::CACHEKEY . $uid);
+ }
/**
* Marks a contact for archival after a communication issue delay
return;
}
+ if (Network::isLocalLink($contact['url'])) {
+ return;
+ }
+
if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) || DI::config()->get('system', 'cache_contact_avatar')) {
if (!empty($contact['avatar']) && (empty($contact['photo']) || empty($contact['thumb']) || empty($contact['micro']))) {
Logger::info('Adding avatar cache', ['id' => $cid, 'contact' => $contact]);
return $contact;
}
- if (!empty($contact['id']) && !empty($contact['avatar'])) {
+ $local = !empty($contact['url']) && Network::isLocalLink($contact['url']);
+
+ if (!$local && !empty($contact['id']) && !empty($contact['avatar'])) {
self::updateAvatar($contact['id'], $contact['avatar'], true);
$new_contact = self::getById($contact['id'], $contact_fields);
// We only update the cache fields
$contact = array_merge($contact, $new_contact);
}
- }
-
- if (Network::isLocalLink($contact['url']) && !empty($contact['avatar'])) {
+ } elseif ($local && !empty($contact['avatar'])) {
return $contact;
}
break;
default:
/**
- * Use a random picture.
+ * Use a random picture.
* The service provides random pictures from Unsplash.
* @license https://unsplash.com/license
*/
if ($uid == 0) {
if ($ret['network'] == Protocol::ACTIVITYPUB) {
- ActivityPub\Processor::fetchFeaturedPosts($ret['url']);
+ $apcontact = APContact::getByURL($ret['url'], false);
+ if (!empty($apcontact['featured'])) {
+ Worker::add(PRIORITY_LOW, 'FetchFeaturedPosts', $ret['url']);
+ }
}
-
+
$ret['last-item'] = Probe::getLastUpdate($ret);
Logger::info('Fetched last item', ['id' => $id, 'probed_url' => $ret['url'], 'last-item' => $ret['last-item'], 'callstack' => System::callstack(20)]);
}
} else {
$probed = true;
$ret = Probe::uri($url, $network, $uid);
+
+ // Ensure that the public contact exists
+ self::getIdForURL($url);
}
if (($network != '') && ($ret['network'] != $network)) {
$contact = DBA::selectFirst('contact', [], ['id' => $cid]);
}
+ self::clearFollowerFollowingEndpointCache($importer['uid']);
+
if (!empty($contact)) {
if (!empty($contact['pending'])) {
Logger::info('Pending contact request already exists.', ['url' => $url, 'uid' => $importer['uid']]);
return;
}
+ self::clearFollowerFollowingEndpointCache($contact['uid']);
+
$cdata = self::getPublicAndUserContactID($contact['id'], $contact['uid']);
DI::notification()->deleteForUserByVerb($contact['uid'], Activity::FOLLOW, ['actor-id' => $cdata['public']]);
*/
public static function removeSharer(array $contact)
{
+ self::clearFollowerFollowingEndpointCache($contact['uid']);
+
if ($contact['rel'] == self::SHARING || in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) {
self::remove($contact['id']);
} else {