]> git.mxchange.org Git - friendica.git/blobdiff - include/ostatus.php
Merge remote-tracking branch 'upstream/3.5.2rc' into 1705-dbclean-advanced
[friendica.git] / include / ostatus.php
index 1e23e7bc32c2ff2723e7289bd0071a5b971e53b7..2b52de73441774cbb102df3da1d0b1706f81e17c 100644 (file)
@@ -70,6 +70,7 @@ class ostatus {
                        $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` IN ('%s', '%s') AND `network` != '%s'",
                                intval($importer["uid"]), dbesc(normalise_link($author["author-link"])),
                                dbesc(normalise_link($aliaslink)), dbesc(NETWORK_STATUSNET));
+
                        if (dbm::is_result($r)) {
                                $contact = $r[0];
                                $author["contact-id"] = $r[0]["id"];
@@ -79,6 +80,7 @@ class ostatus {
                        // Should not happen
                        $contact = dba::fetch_first("SELECT * FROM `contact` WHERE `uid` = ? AND `addr` = ? AND `network` != ?",
                                        $importer["uid"], $addr, NETWORK_STATUSNET);
+
                        if (dbm::is_result($contact)) {
                                $author["contact-id"] = $contact["id"];
                                $author["author-link"] = $contact["url"];
@@ -87,17 +89,20 @@ class ostatus {
 
                $avatarlist = array();
                $avatars = $xpath->query("atom:author/atom:link[@rel='avatar']", $context);
-               foreach($avatars AS $avatar) {
+               foreach ($avatars AS $avatar) {
                        $href = "";
                        $width = 0;
-                       foreach($avatar->attributes AS $attributes) {
-                               if ($attributes->name == "href")
+                       foreach ($avatar->attributes AS $attributes) {
+                               if ($attributes->name == "href") {
                                        $href = $attributes->textContent;
-                               if ($attributes->name == "width")
+                               }
+                               if ($attributes->name == "width") {
                                        $width = $attributes->textContent;
+                               }
                        }
-                       if (($width > 0) AND ($href != ""))
+                       if (($width > 0) AND ($href != "")) {
                                $avatarlist[$width] = $href;
+                       }
                }
                if (count($avatarlist) > 0) {
                        krsort($avatarlist);
@@ -105,8 +110,9 @@ class ostatus {
                }
 
                $displayname = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue;
-               if ($displayname != "")
+               if ($displayname != "") {
                        $author["author-name"] = $displayname;
+               }
 
                $author["owner-name"] = $author["author-name"];
                $author["owner-link"] = $author["author-link"];
@@ -446,7 +452,7 @@ class ostatus {
                                        foreach ($category->attributes AS $attributes) {
                                                if ($attributes->name == "term") {
                                                        $term = $attributes->textContent;
-                                                       if(strlen($item["tag"])) {
+                                                       if (strlen($item["tag"])) {
                                                                $item["tag"] .= ',';
                                                        }
                                                        $item["tag"] .= "#[url=".App::get_baseurl()."/search?tag=".$term."]".$term."[/url]";
@@ -641,6 +647,9 @@ class ostatus {
                        $item_id = self::completion($conversation, $importer["uid"], $item, $self);
 
                        if (!$item_id) {
+                               // Store the conversation data. This is normally done in "item_store"
+                               // but since something went wrong, we want to be sure to save the data.
+                               store_conversation($item);
                                logger("Error storing item", LOGGER_DEBUG);
                                continue;
                        }
@@ -834,6 +843,30 @@ class ostatus {
                return $base_url."/conversation/".$conversation_id;
        }
 
+       /**
+        * @brief Fetches a shared object from a given conversation object
+        *
+        * Sometimes GNU Social seems to fail when returning shared objects.
+        * Then they don't contains all needed data.
+        * We then try to find this object in the conversation
+        *
+        * @param string $id Message id
+        * @param object $conversation Conversation object
+        *
+        * @return object The shared object
+        */
+       private function shared_object($id, $conversation) {
+               if (!is_array($conversation->items)) {
+                       return false;
+               }
+               foreach ($conversation->items AS $single_conv) {
+                       if ($single_conv->id == $id) {
+                               return $single_conv;
+                       }
+               }
+               return false;
+       }
+
        /**
         * @brief Fetches actor details of a given actor and user id
         *
@@ -904,8 +937,6 @@ class ostatus {
                        ($item["verb"] == ACTIVITY_LIKE) OR ($conversation_url == "")) {
                        $item_stored = item_store($item, $all_threads);
                        return $item_stored;
-               } elseif (count($item) > 0) {
-                       $item = store_conversation($item);
                }
 
                // Get the parent
@@ -915,14 +946,6 @@ class ostatus {
                                STRAIGHT_JOIN `item` ON `item`.`parent` = `thritem`.`parent`
                                WHERE `term`.`uid` = %d AND `term`.`otype` = %d AND `term`.`type` = %d AND `term`.`url` = '%s'",
                                intval($uid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), dbesc($conversation_url));
-
-/*             2016-10-23: The old query will be kept until we are sure that the query above is a good and fast replacement
-
-               $parents = q("SELECT `id`, `parent`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `id` IN
-                               (SELECT `parent` FROM `item` WHERE `id` IN
-                                       (SELECT `oid` FROM `term` WHERE `uid` = %d AND `otype` = %d AND `type` = %d AND `url` = '%s'))",
-                               intval($uid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), dbesc($conversation_url));
-*/
                if ($parents)
                        $parent = $parents[0];
                elseif (count($item) > 0) {
@@ -1146,6 +1169,7 @@ class ostatus {
                                continue;
                        }
 
+                       /// @TODO One statment is okay (until if () )
                        $arr = array();
                        $arr["network"] = $details["network"];
                        $arr["uri"] = $single_conv->id;
@@ -1198,42 +1222,52 @@ class ostatus {
                                if (is_array($single_conv->object))
                                        $single_conv->object = $single_conv->object[0];
 
-                               logger("Found reshared item ".$single_conv->object->id);
+                               // Sometimes GNU Social doesn't returns a complete object
+                               if (!isset($single_conv->object->actor->url)) {
+                                       $object = self::shared_object($single_conv->object->id, $conversation);
+                                       if (is_object($object)) {
+                                               $single_conv->object = $object;
+                                       }
+                               }
 
-                               // $single_conv->object->context->conversation;
+                               if (isset($single_conv->object->actor->url)) {
+                                       logger("Found reshared item ".$single_conv->object->id);
 
-                               if (isset($single_conv->object->object->id))
-                                       $arr["uri"] = $single_conv->object->object->id;
-                               else
-                                       $arr["uri"] = $single_conv->object->id;
+                                       // $single_conv->object->context->conversation;
 
-                               if (isset($single_conv->object->object->url))
-                                       $plink = self::convert_href($single_conv->object->object->url);
-                               else
-                                       $plink = self::convert_href($single_conv->object->url);
+                                       if (isset($single_conv->object->object->id)) {
+                                               $arr["uri"] = $single_conv->object->object->id;
+                                       } else {
+                                               $arr["uri"] = $single_conv->object->id;
+                                       }
+                                       if (isset($single_conv->object->object->url)) {
+                                               $plink = self::convert_href($single_conv->object->object->url);
+                                       } else {
+                                               $plink = self::convert_href($single_conv->object->url);
+                                       }
+                                       if (isset($single_conv->object->object->content)) {
+                                               $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->object->content));
+                                       } else {
+                                               $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->content));
+                                       }
+                                       $arr["plink"] = $plink;
 
-                               if (isset($single_conv->object->object->content))
-                                       $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->object->content));
-                               else
-                                       $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->content));
+                                       $arr["created"] = $single_conv->object->published;
+                                       $arr["edited"] = $single_conv->object->published;
 
-                               $arr["plink"] = $plink;
+                                       $arr["author-name"] = $single_conv->object->actor->displayName;
+                                       if ($arr["owner-name"] == '') {
+                                               $arr["author-name"] = $single_conv->object->actor->contact->displayName;
+                                       }
+                                       $arr["author-link"] = $single_conv->object->actor->url;
+                                       $arr["author-avatar"] = Probe::fixAvatar($single_conv->object->actor->image->url, $arr["author-link"]);
 
-                               $arr["created"] = $single_conv->object->published;
-                               $arr["edited"] = $single_conv->object->published;
+                                       $arr["app"] = $single_conv->object->provider->displayName."#";
+                                       //$arr["verb"] = $single_conv->object->verb;
 
-                               $arr["author-name"] = $single_conv->object->actor->displayName;
-                               if ($arr["owner-name"] == '') {
-                                       $arr["author-name"] = $single_conv->object->actor->contact->displayName;
+                                       $arr["location"] = $single_conv->object->location->displayName;
+                                       $arr["coord"] = trim($single_conv->object->location->lat." ".$single_conv->object->location->lon);
                                }
-                               $arr["author-link"] = $single_conv->object->actor->url;
-                               $arr["author-avatar"] = Probe::fixAvatar($single_conv->object->actor->image->url, $arr["author-link"]);
-
-                               $arr["app"] = $single_conv->object->provider->displayName."#";
-                               //$arr["verb"] = $single_conv->object->verb;
-
-                               $arr["location"] = $single_conv->object->location->displayName;
-                               $arr["coord"] = trim($single_conv->object->location->lat." ".$single_conv->object->location->lon);
                        }
 
                        if ($arr["location"] == "")
@@ -1244,26 +1278,19 @@ class ostatus {
 
                        // Copy fields from given item array
                        if (isset($item["uri"]) AND (($item["uri"] == $arr["uri"]) OR ($item["uri"] ==  $single_conv->id))) {
-                               $copy_fields = array("owner-name", "owner-link", "owner-avatar", "author-name", "author-link", "author-avatar",
-                                                       "gravity", "body", "object-type", "object", "verb", "created", "edited", "coord", "tag",
-                                                       "title", "attach", "app", "type", "location", "contact-id", "uri");
-                               foreach ($copy_fields AS $field)
-                                       if (isset($item[$field]))
-                                               $arr[$field] = $item[$field];
-
+                               logger('Use stored item array for item with URI '.$item["uri"], LOGGER_DEBUG);
+                               $newitem = item_store($item);
+                               $item = array();
+                               $item_stored = $newitem;
+                       } else {
+                               $newitem = item_store($arr);
                        }
 
-                       $newitem = item_store($arr);
                        if (!$newitem) {
                                logger("Item wasn't stored ".print_r($arr, true), LOGGER_DEBUG);
                                continue;
                        }
 
-                       if (isset($item["uri"]) AND ($item["uri"] == $arr["uri"])) {
-                               $item = array();
-                               $item_stored = $newitem;
-                       }
-
                        logger('Stored new item '.$plink.' for parent '.$arr["parent-uri"].' under id '.$newitem, LOGGER_DEBUG);
 
                        // Add the conversation entry (but don't fetch the whole conversation)
@@ -2211,7 +2238,7 @@ class ostatus {
 
                $owner = $r[0];
 
-               if(!strlen($last_update))
+               if (!strlen($last_update))
                        $last_update = 'now -30 days';
 
                $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s');