]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/OStatus.php
Changes:
[friendica.git] / src / Protocol / OStatus.php
index 1c857091de24e388dfc3efd2646fc3e4fe46ea58..fe8f060aa3fffdf68ca6da5205fd5b08516c5467 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -25,7 +25,7 @@ use DOMDocument;
 use DOMXPath;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
-use Friendica\Core\Cache\Duration;
+use Friendica\Core\Cache\Enum\Duration;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Database\DBA;
@@ -38,11 +38,11 @@ use Friendica\Model\ItemURI;
 use Friendica\Model\Post;
 use Friendica\Model\Tag;
 use Friendica\Model\User;
-use Friendica\Network\HTTPClientOptions;
+use Friendica\Network\HTTPClient\Client\HttpClientAccept;
 use Friendica\Network\Probe;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Images;
-use Friendica\Util\Proxy as ProxyUtils;
+use Friendica\Util\Proxy;
 use Friendica\Util\Strings;
 use Friendica\Util\XML;
 
@@ -209,10 +209,10 @@ class OStatus
 
                        $contact['name-date'] = DateTimeFormat::utcNow();
 
-                       DBA::update('contact', $contact, ['id' => $contact["id"]], $current);
+                       Contact::update($contact, ['id' => $contact["id"]], $current);
 
                        if (!empty($author["author-avatar"]) && ($author["author-avatar"] != $current['avatar'])) {
-                               Logger::log("Update profile picture for contact ".$contact["id"], Logger::DEBUG);
+                               Logger::info("Update profile picture for contact ".$contact["id"]);
                                Contact::updateAvatar($contact["id"], $author["author-avatar"]);
                        }
 
@@ -230,7 +230,7 @@ class OStatus
                                                'about' => $contact["about"], 'location' => $contact["location"],
                                                'success_update' => DateTimeFormat::utcNow(), 'last-update' => DateTimeFormat::utcNow()];
 
-                               DBA::update('contact', $fields, ['id' => $cid], $old_contact);
+                               Contact::update($fields, ['id' => $cid], $old_contact);
 
                                // Update the avatar
                                if (!empty($author["author-avatar"])) {
@@ -336,7 +336,7 @@ class OStatus
                        self::$conv_list = [];
                }
 
-               Logger::log('Import OStatus message for user ' . $importer['uid'], Logger::DEBUG);
+               Logger::info('Import OStatus message for user ' . $importer['uid']);
 
                if ($xml == "") {
                        return false;
@@ -362,7 +362,7 @@ class OStatus
                                foreach ($hub_attributes as $hub_attribute) {
                                        if ($hub_attribute->name == "href") {
                                                $hub = $hub_attribute->textContent;
-                                               Logger::log("Found hub ".$hub, Logger::DEBUG);
+                                               Logger::info("Found hub ".$hub);
                                        }
                                }
                        }
@@ -440,27 +440,27 @@ class OStatus
 
                        if (in_array($item["verb"], [Activity::O_UNFAVOURITE, Activity::UNFAVORITE])) {
                                // Ignore "Unfavorite" message
-                               Logger::log("Ignore unfavorite message ".print_r($item, true), Logger::DEBUG);
+                               Logger::info("Ignore unfavorite message ", ['item' => $item]);
                                continue;
                        }
 
                        // Deletions come with the same uri, so we check for duplicates after processing deletions
                        if (Post::exists(['uid' => $importer["uid"], 'uri' => $item["uri"]])) {
-                               Logger::log('Post with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.', Logger::DEBUG);
+                               Logger::info('Post with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.');
                                continue;
                        } else {
-                               Logger::log('Processing post with URI '.$item["uri"].' for user '.$importer["uid"].'.', Logger::DEBUG);
+                               Logger::info('Processing post with URI '.$item["uri"].' for user '.$importer["uid"].'.');
                        }
 
                        if ($item["verb"] == Activity::JOIN) {
                                // ignore "Join" messages
-                               Logger::log("Ignore join message ".print_r($item, true), Logger::DEBUG);
+                               Logger::info("Ignore join message ", ['item' => $item]);
                                continue;
                        }
 
                        if ($item["verb"] == "http://mastodon.social/schema/1.0/block") {
                                // ignore mastodon "block" messages
-                               Logger::log("Ignore block message ".print_r($item, true), Logger::DEBUG);
+                               Logger::info("Ignore block message ", ['item' => $item]);
                                continue;
                        }
 
@@ -471,13 +471,13 @@ class OStatus
 
                        if ($item["verb"] == Activity::O_UNFOLLOW) {
                                $dummy = null;
-                               Contact::removeFollower($importer, $contact, $item, $dummy);
+                               Contact::removeFollower($contact);
                                continue;
                        }
 
                        if ($item["verb"] == Activity::FAVORITE) {
                                $orig_uri = $xpath->query("activity:object/atom:id", $entry)->item(0)->nodeValue;
-                               Logger::log("Favorite ".$orig_uri." ".print_r($item, true));
+                               Logger::notice("Favorite", ['uri' => $orig_uri, 'item' => $item]);
 
                                $item["verb"] = Activity::LIKE;
                                $item["thr-parent"] = $orig_uri;
@@ -487,26 +487,29 @@ class OStatus
 
                        // http://activitystrea.ms/schema/1.0/rsvp-yes
                        if (!in_array($item["verb"], [Activity::POST, Activity::LIKE, Activity::SHARE])) {
-                               Logger::log("Unhandled verb ".$item["verb"]." ".print_r($item, true), Logger::DEBUG);
+                               Logger::info("Unhandled verb", ['verb' => $item["verb"], 'item' => $item]);
                        }
 
                        self::processPost($xpath, $entry, $item, $importer);
 
                        if ($initialize && (count(self::$itemlist) > 0)) {
                                if (self::$itemlist[0]['uri'] == self::$itemlist[0]['thr-parent']) {
+                                       $uid = self::$itemlist[0]['uid'];
                                        // We will import it everytime, when it is started by our contacts
-                                       $valid = Contact::isSharingByURL(self::$itemlist[0]['author-link'], self::$itemlist[0]['uid']);
+                                       $valid = Contact::isSharingByURL(self::$itemlist[0]['author-link'], $uid);
 
                                        if (!$valid) {
                                                // If not, then it depends on this setting
-                                               $valid = ((self::$itemlist[0]['uid'] == 0) || !DI::pConfig()->get(self::$itemlist[0]['uid'], 'system', 'accept_only_sharer', false));
+                                               $valid = !$uid || DI::pConfig()->get($uid, 'system', 'accept_only_sharer') != Item::COMPLETION_NONE;
+
                                                if ($valid) {
-                                                       Logger::log("Item with uri ".self::$itemlist[0]['uri']." will be imported due to the system settings.", Logger::DEBUG);
+                                                       Logger::info("Item with uri ".self::$itemlist[0]['uri']." will be imported due to the system settings.");
                                                }
                                        } else {
-                                               Logger::log("Item with uri ".self::$itemlist[0]['uri']." belongs to a contact (".self::$itemlist[0]['contact-id']."). It will be imported.", Logger::DEBUG);
+                                               Logger::info("Item with uri ".self::$itemlist[0]['uri']." belongs to a contact (".self::$itemlist[0]['contact-id']."). It will be imported.");
                                        }
-                                       if ($valid) {
+
+                                       if ($valid && DI::pConfig()->get($uid, 'system', 'accept_only_sharer') != Item::COMPLETION_LIKE) {
                                                // Never post a thread when the only interaction by our contact was a like
                                                $valid = false;
                                                $verbs = [Activity::POST, Activity::SHARE];
@@ -516,7 +519,7 @@ class OStatus
                                                        }
                                                }
                                                if ($valid) {
-                                                       Logger::log("Item with uri ".self::$itemlist[0]['uri']." will be imported since the thread contains posts or shares.", Logger::DEBUG);
+                                                       Logger::info("Item with uri ".self::$itemlist[0]['uri']." will be imported since the thread contains posts or shares.");
                                                }
                                        }
                                } else {
@@ -535,18 +538,18 @@ class OStatus
                                        foreach (self::$itemlist as $item) {
                                                $found = Post::exists(['uid' => $importer["uid"], 'uri' => $item["uri"]]);
                                                if ($found) {
-                                                       Logger::log("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already exists.", Logger::DEBUG);
+                                                       Logger::notice("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already exists.");
                                                } elseif ($item['contact-id'] < 0) {
-                                                       Logger::log("Item with uri ".$item["uri"]." is from a blocked contact.", Logger::DEBUG);
+                                                       Logger::notice("Item with uri ".$item["uri"]." is from a blocked contact.");
                                                } else {
                                                        $ret = Item::insert($item);
-                                                       Logger::log("Item with uri ".$item["uri"]." for user ".$importer["uid"].' stored. Return value: '.$ret);
+                                                       Logger::info("Item with uri ".$item["uri"]." for user ".$importer["uid"].' stored. Return value: '.$ret);
                                                }
                                        }
                                }
                                self::$itemlist = [];
                        }
-                       Logger::log('Processing done for post with URI '.$item["uri"].' for user '.$importer["uid"].'.', Logger::DEBUG);
+                       Logger::info('Processing done for post with URI '.$item["uri"].' for user '.$importer["uid"].'.');
                }
                return true;
        }
@@ -562,13 +565,13 @@ class OStatus
        {
                $condition = ['uid' => $item['uid'], 'author-id' => $item['author-id'], 'uri' => $item['uri']];
                if (!Post::exists($condition)) {
-                       Logger::log('Item from '.$item['author-link'].' with uri '.$item['uri'].' for user '.$item['uid']." wasn't found. We don't delete it.");
+                       Logger::notice('Item from '.$item['author-link'].' with uri '.$item['uri'].' for user '.$item['uid']." wasn't found. We don't delete it.");
                        return;
                }
 
                Item::markForDeletion($condition);
 
-               Logger::log('Deleted item with uri '.$item['uri'].' for user '.$item['uid']);
+               Logger::notice('Deleted item with uri '.$item['uri'].' for user '.$item['uid']);
        }
 
        /**
@@ -697,7 +700,7 @@ class OStatus
                                        self::fetchRelated($related, $item["thr-parent"], $importer);
                                }
                        } else {
-                               Logger::log('Reply with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.', Logger::DEBUG);
+                               Logger::info('Reply with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.');
                        }
                } else {
                        $item["thr-parent"] = $item["uri"];
@@ -728,7 +731,7 @@ class OStatus
 
                self::$conv_list[$conversation] = true;
 
-               $curlResult = DI::httpClient()->get($conversation, [HTTPClientOptions::ACCEPT_CONTENT => ['application/atom+xml', 'text/html']]);
+               $curlResult = DI::httpClient()->get($conversation, HttpClientAccept::ATOM_XML);
 
                if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
                        return;
@@ -758,7 +761,7 @@ class OStatus
                                        }
                                }
                                if ($file != '') {
-                                       $conversation_atom = DI::httpClient()->get($attribute['href']);
+                                       $conversation_atom = DI::httpClient()->get($attribute['href'], HttpClientAccept::ATOM_XML);
 
                                        if ($conversation_atom->isSuccess()) {
                                                $xml = $conversation_atom->getBody();
@@ -845,7 +848,7 @@ class OStatus
 
                        $conv_data['source'] = $doc2->saveXML();
 
-                       Logger::log('Store conversation data for uri '.$conv_data['uri'], Logger::DEBUG);
+                       Logger::info('Store conversation data for uri '.$conv_data['uri']);
                        Conversation::insert($conv_data);
                }
        }
@@ -865,14 +868,14 @@ class OStatus
        private static function fetchSelf($self, array &$item)
        {
                $condition = ['item-uri' => $self, 'protocol' => [Conversation::PARCEL_DFRN,
-                       Conversation::PARCEL_DIASPORA_DFRN, Conversation::PARCEL_LEGACY_DFRN,
-                       Conversation::PARCEL_LOCAL_DFRN, Conversation::PARCEL_DIRECT, Conversation::PARCEL_SALMON]];
+                       Conversation::PARCEL_DIASPORA_DFRN, Conversation::PARCEL_LOCAL_DFRN,
+                       Conversation::PARCEL_DIRECT, Conversation::PARCEL_SALMON]];
                if (DBA::exists('conversation', $condition)) {
-                       Logger::log('Conversation '.$item['uri'].' is already stored.', Logger::DEBUG);
+                       Logger::info('Conversation '.$item['uri'].' is already stored.');
                        return;
                }
 
-               $curlResult = DI::httpClient()->get($self);
+               $curlResult = DI::httpClient()->get($self, HttpClientAccept::ATOM_XML);
 
                if (!$curlResult->isSuccess()) {
                        return;
@@ -889,7 +892,7 @@ class OStatus
                $item["source"] = $xml;
                $item["direction"] = Conversation::PULL;
 
-               Logger::log('Conversation '.$item['uri'].' is now fetched.', Logger::DEBUG);
+               Logger::info('Conversation '.$item['uri'].' is now fetched.');
        }
 
        /**
@@ -905,24 +908,24 @@ class OStatus
        private static function fetchRelated($related, $related_uri, $importer)
        {
                $condition = ['item-uri' => $related_uri, 'protocol' => [Conversation::PARCEL_DFRN,
-                       Conversation::PARCEL_DIASPORA_DFRN, Conversation::PARCEL_LEGACY_DFRN,
-                       Conversation::PARCEL_LOCAL_DFRN, Conversation::PARCEL_DIRECT, Conversation::PARCEL_SALMON]];
+                       Conversation::PARCEL_DIASPORA_DFRN, Conversation::PARCEL_LOCAL_DFRN,
+                       Conversation::PARCEL_DIRECT, Conversation::PARCEL_SALMON]];
                $conversation = DBA::selectFirst('conversation', ['source', 'protocol'], $condition);
                if (DBA::isResult($conversation)) {
                        $stored = true;
                        $xml = $conversation['source'];
                        if (self::process($xml, $importer, $contact, $hub, $stored, false, Conversation::PULL)) {
-                               Logger::log('Got valid cached XML for URI '.$related_uri, Logger::DEBUG);
+                               Logger::info('Got valid cached XML for URI '.$related_uri);
                                return;
                        }
                        if ($conversation['protocol'] == Conversation::PARCEL_SALMON) {
-                               Logger::log('Delete invalid cached XML for URI '.$related_uri, Logger::DEBUG);
+                               Logger::info('Delete invalid cached XML for URI '.$related_uri);
                                DBA::delete('conversation', ['item-uri' => $related_uri]);
                        }
                }
 
                $stored = false;
-               $curlResult = DI::httpClient()->get($related, [HTTPClientOptions::ACCEPT_CONTENT => ['application/atom+xml', 'text/html']]);
+               $curlResult = DI::httpClient()->get($related, HttpClientAccept::ATOM_XML);
 
                if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
                        return;
@@ -932,7 +935,7 @@ class OStatus
 
                if ($curlResult->inHeader('Content-Type') &&
                        in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) {
-                       Logger::log('Directly fetched XML for URI ' . $related_uri, Logger::DEBUG);
+                       Logger::info('Directly fetched XML for URI ' . $related_uri);
                        $xml = $curlResult->getBody();
                }
 
@@ -954,10 +957,10 @@ class OStatus
                                        }
                                }
                                if ($atom_file != '') {
-                                       $curlResult = DI::httpClient()->get($atom_file);
+                                       $curlResult = DI::httpClient()->get($atom_file, HttpClientAccept::ATOM_XML);
 
                                        if ($curlResult->isSuccess()) {
-                                               Logger::log('Fetched XML for URI ' . $related_uri, Logger::DEBUG);
+                                               Logger::info('Fetched XML for URI ' . $related_uri);
                                                $xml = $curlResult->getBody();
                                        }
                                }
@@ -966,10 +969,10 @@ class OStatus
 
                // Workaround for older GNU Social servers
                if (($xml == '') && strstr($related, '/notice/')) {
-                       $curlResult = DI::httpClient()->get(str_replace('/notice/', '/api/statuses/show/', $related) . '.atom');
+                       $curlResult = DI::httpClient()->get(str_replace('/notice/', '/api/statuses/show/', $related) . '.atom', HttpClientAccept::ATOM_XML);
 
                        if ($curlResult->isSuccess()) {
-                               Logger::log('GNU Social workaround to fetch XML for URI ' . $related_uri, Logger::DEBUG);
+                               Logger::info('GNU Social workaround to fetch XML for URI ' . $related_uri);
                                $xml = $curlResult->getBody();
                        }
                }
@@ -977,10 +980,10 @@ class OStatus
                // Even more worse workaround for GNU Social ;-)
                if ($xml == '') {
                        $related_guess = self::convertHref($related_uri);
-                       $curlResult = DI::httpClient()->get(str_replace('/notice/', '/api/statuses/show/', $related_guess) . '.atom');
+                       $curlResult = DI::httpClient()->get(str_replace('/notice/', '/api/statuses/show/', $related_guess) . '.atom', HttpClientAccept::ATOM_XML);
 
                        if ($curlResult->isSuccess()) {
-                               Logger::log('GNU Social workaround 2 to fetch XML for URI ' . $related_uri, Logger::DEBUG);
+                               Logger::info('GNU Social workaround 2 to fetch XML for URI ' . $related_uri);
                                $xml = $curlResult->getBody();
                        }
                }
@@ -991,7 +994,7 @@ class OStatus
                        $conversation = DBA::selectFirst('conversation', ['source'], $condition);
                        if (DBA::isResult($conversation)) {
                                $stored = true;
-                               Logger::log('Got cached XML from conversation for URI '.$related_uri, Logger::DEBUG);
+                               Logger::info('Got cached XML from conversation for URI '.$related_uri);
                                $xml = $conversation['source'];
                        }
                }
@@ -999,7 +1002,7 @@ class OStatus
                if ($xml != '') {
                        self::process($xml, $importer, $contact, $hub, $stored, false, Conversation::PULL);
                } else {
-                       Logger::log("XML couldn't be fetched for URI: ".$related_uri." - href: ".$related, Logger::DEBUG);
+                       Logger::info("XML couldn't be fetched for URI: ".$related_uri." - href: ".$related);
                }
                return;
        }
@@ -1173,23 +1176,6 @@ class OStatus
                }
        }
 
-       /**
-        * Checks if the current post is a reshare
-        *
-        * @param array $item The item array of thw post
-        *
-        * @return string The guid if the post is a reshare
-        */
-       public static function getResharedGuid(array $item)
-       {
-               $reshared = Item::getShareArray($item);
-               if (empty($reshared['guid']) || !empty($reshared['comment'])) {
-                       return '';
-               }
-
-               return $reshared['guid'];
-       }
-
        /**
         * Cleans the body of a post if it contains picture links
         *
@@ -1210,7 +1196,7 @@ class OStatus
                        }
 
                        // Is it a remote picture? Then make a smaller preview here
-                       $preview = Post\Link::getByLink($uriid, $preview, ProxyUtils::SIZE_SMALL);
+                       $preview = Post\Link::getByLink($uriid, $preview, Proxy::SIZE_SMALL);
 
                        // Is it a local picture? Then make it smaller here
                        $preview = str_replace(["-0.jpg", "-0.png"], ["-2.jpg", "-2.png"], $preview);
@@ -1275,7 +1261,7 @@ class OStatus
                XML::addElement($doc, $root, "id", DI::baseUrl() . "/profile/" . $owner["nick"]);
                XML::addElement($doc, $root, "title", $title);
                XML::addElement($doc, $root, "subtitle", sprintf("Updates from %s on %s", $owner["name"], DI::config()->get('config', 'sitename')));
-               XML::addElement($doc, $root, "logo", User::getAvatarUrlForId($owner['uid'], ProxyUtils::SIZE_SMALL));
+               XML::addElement($doc, $root, "logo", User::getAvatarUrl($owner, Proxy::SIZE_SMALL));
                XML::addElement($doc, $root, "updated", DateTimeFormat::utcNow(DateTimeFormat::ATOM));
 
                $author = self::addAuthor($doc, $owner, true);
@@ -1430,18 +1416,18 @@ class OStatus
                $attributes = [
                                "rel" => "avatar",
                                "type" => "image/jpeg", // To-Do?
-                               "media:width" => ProxyUtils::PIXEL_SMALL,
-                               "media:height" => ProxyUtils::PIXEL_SMALL,
-                               "href" => User::getAvatarUrlForId($owner['uid'], ProxyUtils::SIZE_SMALL)];
+                               "media:width" => Proxy::PIXEL_SMALL,
+                               "media:height" => Proxy::PIXEL_SMALL,
+                               "href" => User::getAvatarUrl($owner, Proxy::SIZE_SMALL)];
                XML::addElement($doc, $author, "link", "", $attributes);
 
                if (isset($owner["thumb"])) {
                        $attributes = [
                                        "rel" => "avatar",
                                        "type" => "image/jpeg", // To-Do?
-                                       "media:width" => ProxyUtils::PIXEL_THUMB,
-                                       "media:height" => ProxyUtils::PIXEL_THUMB,
-                                       "href" => User::getAvatarUrlForId($owner['uid'], ProxyUtils::SIZE_THUMB)];
+                                       "media:width" => Proxy::PIXEL_THUMB,
+                                       "media:height" => Proxy::PIXEL_THUMB,
+                                       "href" => User::getAvatarUrl($owner, Proxy::SIZE_THUMB)];
                        XML::addElement($doc, $author, "link", "", $attributes);
                }
 
@@ -1529,17 +1515,6 @@ class OStatus
         */
        private static function entry(DOMDocument $doc, array $item, array $owner, $toplevel = false)
        {
-               $xml = null;
-
-               $repeated_guid = self::getResharedGuid($item);
-               if ($repeated_guid != "") {
-                       $xml = self::reshareEntry($doc, $item, $owner, $repeated_guid, $toplevel);
-               }
-
-               if ($xml) {
-                       return $xml;
-               }
-
                if ($item["verb"] == Activity::LIKE) {
                        return self::likeEntry($doc, $item, $owner, $toplevel);
                } elseif (in_array($item["verb"], [Activity::FOLLOW, Activity::O_UNFOLLOW])) {
@@ -1549,94 +1524,6 @@ class OStatus
                }
        }
 
-       /**
-        * Adds a source entry to the XML document
-        *
-        * @param DOMDocument $doc     XML document
-        * @param array       $contact Array of the contact that is added
-        *
-        * @return \DOMElement Source element
-        * @throws \Exception
-        */
-       private static function sourceEntry(DOMDocument $doc, array $contact)
-       {
-               $source = $doc->createElement("source");
-               XML::addElement($doc, $source, "id", $contact["poll"]);
-               XML::addElement($doc, $source, "title", $contact["name"]);
-               XML::addElement($doc, $source, "link", "", ["rel" => "alternate", "type" => "text/html", "href" => $contact["alias"]]);
-               XML::addElement($doc, $source, "link", "", ["rel" => "self", "type" => "application/atom+xml", "href" => $contact["poll"]]);
-               XML::addElement($doc, $source, "icon", $contact["photo"]);
-               XML::addElement($doc, $source, "updated", DateTimeFormat::utc($contact["success_update"]."+00:00", DateTimeFormat::ATOM));
-
-               return $source;
-       }
-
-       /**
-        * Adds an entry element with reshared content
-        *
-        * @param DOMDocument $doc           XML document
-        * @param array       $item          Data of the item that is to be posted
-        * @param array       $owner         Contact data of the poster
-        * @param string      $repeated_guid guid
-        * @param bool        $toplevel      Is it for en entry element (false) or a feed entry (true)?
-        *
-        * @return bool Entry element
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        * @throws \ImagickException
-        */
-       private static function reshareEntry(DOMDocument $doc, array $item, array $owner, $repeated_guid, $toplevel)
-       {
-               if (($item['gravity'] != GRAVITY_PARENT) && (Strings::normaliseLink($item["author-link"]) != Strings::normaliseLink($owner["url"]))) {
-                       Logger::log("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", Logger::DEBUG);
-               }
-
-               $entry = self::entryHeader($doc, $owner, $item, $toplevel);
-
-               $condition = ['uid' => $owner["uid"], 'guid' => $repeated_guid, 'private' => [Item::PUBLIC, Item::UNLISTED],
-                       'network' => [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]];
-               $repeated_item = Post::selectFirst([], $condition);
-               if (!DBA::isResult($repeated_item)) {
-                       return false;
-               }
-
-               $contact = Contact::getByURL($repeated_item['author-link']) ?: $owner;
-
-               $title = $owner["nick"]." repeated a notice by ".$contact["nick"];
-
-               self::entryContent($doc, $entry, $item, $owner, $title, Activity::SHARE, false);
-
-               $as_object = $doc->createElement("activity:object");
-
-               XML::addElement($doc, $as_object, "activity:object-type", ActivityNamespace::ACTIVITY_SCHEMA . "activity");
-
-               self::entryContent($doc, $as_object, $repeated_item, $owner, "", "", false);
-
-               $author = self::addAuthor($doc, $contact, false);
-               $as_object->appendChild($author);
-
-               $as_object2 = $doc->createElement("activity:object");
-
-               XML::addElement($doc, $as_object2, "activity:object-type", self::constructObjecttype($repeated_item));
-
-               $title = sprintf("New comment by %s", $contact["nick"]);
-
-               self::entryContent($doc, $as_object2, $repeated_item, $owner, $title);
-
-               $as_object->appendChild($as_object2);
-
-               self::entryFooter($doc, $as_object, $item, $owner, false);
-
-               $source = self::sourceEntry($doc, $contact);
-
-               $as_object->appendChild($source);
-
-               $entry->appendChild($as_object);
-
-               self::entryFooter($doc, $entry, $item, $owner, true);
-
-               return $entry;
-       }
-
        /**
         * Adds an entry element with a "like"
         *
@@ -1652,7 +1539,7 @@ class OStatus
        private static function likeEntry(DOMDocument $doc, array $item, array $owner, $toplevel)
        {
                if (($item['gravity'] != GRAVITY_PARENT) && (Strings::normaliseLink($item["author-link"]) != Strings::normaliseLink($owner["url"]))) {
-                       Logger::log("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", Logger::DEBUG);
+                       Logger::info("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.");
                }
 
                $entry = self::entryHeader($doc, $owner, $item, $toplevel);
@@ -1801,7 +1688,7 @@ class OStatus
        private static function noteEntry(DOMDocument $doc, array $item, array $owner, $toplevel)
        {
                if (($item['gravity'] != GRAVITY_PARENT) && (Strings::normaliseLink($item["author-link"]) != Strings::normaliseLink($owner["url"]))) {
-                       Logger::log("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", Logger::DEBUG);
+                       Logger::info("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.");
                }
 
                if (!$toplevel) {
@@ -1844,6 +1731,7 @@ class OStatus
 
                        if ($owner['contact-type'] == Contact::TYPE_COMMUNITY) {
                                $contact = Contact::getByURL($item['author-link']) ?: $owner;
+                               $contact['nickname'] = $contact['nickname'] ?? $contact['nick']; 
                                $author = self::addAuthor($doc, $contact, false);
                                $entry->appendChild($author);
                        }
@@ -1931,27 +1819,31 @@ class OStatus
                if ($item['gravity'] != GRAVITY_PARENT) {
                        $parent = Post::selectFirst(['guid', 'author-link', 'owner-link'], ['id' => $item['parent']]);
 
-                       $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner["uid"], 'uri' => $item['thr-parent']]);
+                       $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner['uid'], 'uri' => $item['thr-parent']]);
 
                        if (DBA::isResult($thrparent)) {
-                               $mentioned[$thrparent["author-link"]] = $thrparent["author-link"];
-                               $mentioned[$thrparent["owner-link"]] = $thrparent["owner-link"];
-                               $parent_plink = $thrparent["plink"];
+                               $mentioned[$thrparent['author-link']] = $thrparent['author-link'];
+                               $mentioned[$thrparent['owner-link']]  = $thrparent['owner-link'];
+                               $parent_plink                         = $thrparent['plink'];
+                       } elseif (DBA::isResult($parent)) {
+                               $mentioned[$parent['author-link']] = $parent['author-link'];
+                               $mentioned[$parent['owner-link']]  = $parent['owner-link'];
+                               $parent_plink                      = DI::baseUrl() . '/display/' . $parent['guid'];
                        } else {
-                               $mentioned[$parent["author-link"]] = $parent["author-link"];
-                               $mentioned[$parent["owner-link"]] = $parent["owner-link"];
-                               $parent_plink = DI::baseUrl()."/display/".$parent["guid"];
+                               DI::logger()->notice('Missing parent and thr-parent for child item', ['item' => $item]);
                        }
 
-                       $attributes = [
-                                       "ref" => $item['thr-parent'],
-                                       "href" => $parent_plink];
-                       XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes);
+                       if (isset($parent_plink)) {
+                               $attributes = [
+                                       'ref'  => $item['thr-parent'],
+                                       'href' => $parent_plink];
+                               XML::addElement($doc, $entry, 'thr:in-reply-to', '', $attributes);
 
-                       $attributes = [
-                                       "rel" => "related",
-                                       "href" => $parent_plink];
-                       XML::addElement($doc, $entry, "link", "", $attributes);
+                               $attributes = [
+                                       'rel'  => 'related',
+                                       'href' => $parent_plink];
+                               XML::addElement($doc, $entry, 'link', '', $attributes);
+                       }
                }
 
                if (intval($item['parent']) > 0) {
@@ -2095,7 +1987,7 @@ class OStatus
                if ((time() - strtotime($owner['last-item'])) < 15*60) {
                        $result = DI::cache()->get($cachekey);
                        if (!$nocache && !is_null($result)) {
-                               Logger::log('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created . ' (cached)', Logger::DEBUG);
+                               Logger::info('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created . ' (cached)');
                                $last_update = $result['last_update'];
                                return $result['feed'];
                        }
@@ -2160,7 +2052,7 @@ class OStatus
                $msg = ['feed' => $feeddata, 'last_update' => $last_update];
                DI::cache()->set($cachekey, $msg, Duration::QUARTER_HOUR);
 
-               Logger::log('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created, Logger::DEBUG);
+               Logger::info('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created);
 
                return $feeddata;
        }