diff --git a/src/Model/Item.php b/src/Model/Item.php index f6d08047b2..bd8d03359e 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -2563,7 +2563,8 @@ class Item Contact::unmarkForArchival($contact); } - $update = (($arr['private'] != self::PRIVATE) && ((($arr['author-link'] ?? '') === ($arr['owner-link'] ?? '')) || ($arr["parent-uri"] === $arr["uri"]))); + /// @todo On private posts we could obfuscate the date + $update = ($arr['private'] != self::PRIVATE); // Is it a forum? Then we don't care about the rules from above if (!$update && in_array($arr["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN]) && ($arr["parent-uri"] === $arr["uri"])) { @@ -2573,8 +2574,15 @@ class Item } if ($update) { - DBA::update('contact', ['success_update' => $arr['received'], 'last-item' => $arr['received']], - ['id' => $arr['contact-id']]); + // The "self" contact id is used (for example in the connectors) when the contact is unknown + // So we have to ensure to only update the last item when it had been our own post, + // or it had been done by a "regular" contact. + if (!empty($arr['wall'])) { + $condition = ['id' => $arr['contact-id']]; + } else { + $condition = ['id' => $arr['contact-id'], 'self' => false]; + } + DBA::update('contact', ['success_update' => $arr['received'], 'last-item' => $arr['received']], $condition); } // Now do the same for the system wide contacts with uid=0 if ($arr['private'] != self::PRIVATE) { diff --git a/src/Model/Profile.php b/src/Model/Profile.php index ec862947ba..4c877a9064 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -398,18 +398,15 @@ class Profile $contact_block = ''; $updated = ''; $contact_count = 0; + + if (!empty($profile['last-item'])) { + $updated = date('c', strtotime($profile['last-item'])); + } + if (!$block) { $contact_block = ContactBlock::getHTML($a->profile); if (is_array($a->profile) && !$a->profile['hide-friends']) { - $r = q( - "SELECT `gcontact`.`updated` FROM `contact` INNER JOIN `gcontact` WHERE `gcontact`.`nurl` = `contact`.`nurl` AND `self` AND `uid` = %d LIMIT 1", - intval($a->profile['uid']) - ); - if (DBA::isResult($r)) { - $updated = date('c', strtotime($r[0]['updated'])); - } - $contact_count = DBA::count('contact', [ 'uid' => $profile['uid'], 'self' => false, diff --git a/src/Module/NoScrape.php b/src/Module/NoScrape.php index a03770d0d4..13a683d974 100644 --- a/src/Module/NoScrape.php +++ b/src/Module/NoScrape.php @@ -85,22 +85,11 @@ class NoScrape extends BaseModule $json_info['tags'] = $keywords; $json_info['language'] = $a->profile['language']; - if (!($a->profile['hide-friends'] ?? false)) { - $stmt = DBA::p( - "SELECT `gcontact`.`updated` - FROM `contact` - INNER JOIN `gcontact` - WHERE `gcontact`.`nurl` = `contact`.`nurl` - AND `self` - AND `uid` = ? - LIMIT 1", - intval($a->profile['uid']) - ); - if ($gcontact = DBA::fetch($stmt)) { - $json_info["updated"] = date("c", strtotime($gcontact['updated'])); - } - DBA::close($stmt); + if (!empty($a->profile['last-item'])) { + $json_info['updated'] = date("c", strtotime($a->profile['last-item'])); + } + if (!($a->profile['hide-friends'] ?? false)) { $json_info['contacts'] = DBA::count('contact', [ 'uid' => $a->profile['uid'],