X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fostatus.php;h=2b52de73441774cbb102df3da1d0b1706f81e17c;hb=f96423feae227e5def8b90ced82ee3405b24f068;hp=7644eacc094ab434f72fd74c209a2958574b06b0;hpb=eb0a7015905a898bbdd0cbf865c29496a537d85c;p=friendica.git diff --git a/include/ostatus.php b/include/ostatus.php index 7644eacc09..2b52de7344 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -3,22 +3,24 @@ * @file include/ostatus.php */ -use \Friendica\Core\Config; - -require_once("include/Contact.php"); -require_once("include/threads.php"); -require_once("include/html2bbcode.php"); -require_once("include/bbcode.php"); -require_once("include/items.php"); -require_once("mod/share.php"); -require_once("include/enotify.php"); -require_once("include/socgraph.php"); -require_once("include/Photo.php"); -require_once("include/Scrape.php"); -require_once("include/follow.php"); -require_once("include/api.php"); -require_once("mod/proxy.php"); -require_once("include/xml.php"); +use Friendica\App; +use Friendica\Core\Config; +use Friendica\Network\Probe; + +require_once 'include/Contact.php'; +require_once 'include/threads.php'; +require_once 'include/html2bbcode.php'; +require_once 'include/bbcode.php'; +require_once 'include/items.php'; +require_once 'mod/share.php'; +require_once 'include/enotify.php'; +require_once 'include/socgraph.php'; +require_once 'include/Photo.php'; +require_once 'include/probe.php'; +require_once 'include/follow.php'; +require_once 'include/api.php'; +require_once 'mod/proxy.php'; +require_once 'include/xml.php'; /** * @brief This class contain functions for the OStatus protocol @@ -68,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"]; @@ -77,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"]; @@ -85,26 +89,30 @@ 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); - $author["author-avatar"] = Probe::fix_avatar(current($avatarlist), $author["author-link"]); + $author["author-avatar"] = Probe::fixAvatar(current($avatarlist), $author["author-link"]); } $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"]; @@ -444,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]"; @@ -639,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; } @@ -832,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 * @@ -902,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 @@ -913,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) { @@ -1144,6 +1169,7 @@ class ostatus { continue; } + /// @TODO One statment is okay (until if () ) $arr = array(); $arr["network"] = $details["network"]; $arr["uri"] = $single_conv->id; @@ -1160,7 +1186,7 @@ class ostatus { $arr["owner-name"] = $single_conv->actor->portablecontacts_net->displayName; $arr["owner-link"] = $actor; - $arr["owner-avatar"] = Probe::fix_avatar($single_conv->actor->image->url, $arr["owner-link"]); + $arr["owner-avatar"] = Probe::fixAvatar($single_conv->actor->image->url, $arr["owner-link"]); $arr["author-name"] = $arr["owner-name"]; $arr["author-link"] = $arr["owner-link"]; @@ -1196,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::fix_avatar($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"] == "") @@ -1242,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) @@ -2192,7 +2221,7 @@ class ostatus { /** * @brief Creates the XML feed for a given nickname * - * @param app $a The application class + * @param App $a The application class * @param string $owner_nick Nickname of the feed owner * @param string $last_update Date of the last update * @@ -2209,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'); @@ -2288,4 +2317,3 @@ class ostatus { return(trim($doc->saveXML())); } } -?>