X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fostatus.php;h=2b52de73441774cbb102df3da1d0b1706f81e17c;hb=8abdbb799a44795bf53a558f29b495147d88c04f;hp=40bcdcdcc57d2d7b50f4fa1fc9d422974aec3069;hpb=c0b5339691d63fcbae6caa7a032923d2826f9df0;p=friendica.git diff --git a/include/ostatus.php b/include/ostatus.php index 40bcdcdcc5..2b52de7344 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -3,20 +3,24 @@ * @file include/ostatus.php */ -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 @@ -27,42 +31,6 @@ class ostatus { const OSTATUS_DEFAULT_POLL_TIMEFRAME = 1440; // given in minutes const OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS = 14400; // given in minutes - /** - * @brief Mix two paths together to possibly fix missing parts - * - * @param string $avatar Path to the avatar - * @param string $base Another path that is hopefully complete - * - * @return string fixed avatar path - */ - public static function fix_avatar($avatar, $base) { - $base_parts = parse_url($base); - - // Remove all parts that could create a problem - unset($base_parts['path']); - unset($base_parts['query']); - unset($base_parts['fragment']); - - $avatar_parts = parse_url($avatar); - - // Now we mix them - $parts = array_merge($base_parts, $avatar_parts); - - // And put them together again - $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; - $host = isset($parts['host']) ? $parts['host'] : ''; - $port = isset($parts['port']) ? ':' . $parts['port'] : ''; - $path = isset($parts['path']) ? $parts['path'] : ''; - $query = isset($parts['query']) ? '?' . $parts['query'] : ''; - $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; - - $fixed = $scheme.$host.$port.$path.$query.$fragment; - - logger('Base: '.$base.' - Avatar: '.$avatar.' - Fixed: '.$fixed, LOGGER_DATA); - - return $fixed; - } - /** * @brief Fetches author data * @@ -79,46 +47,72 @@ class ostatus { $author = array(); $author["author-link"] = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; $author["author-name"] = $xpath->evaluate('atom:author/atom:name/text()', $context)->item(0)->nodeValue; + $addr = $xpath->evaluate('atom:author/atom:email/text()', $context)->item(0)->nodeValue; $aliaslink = $author["author-link"]; $alternate = $xpath->query("atom:author/atom:link[@rel='alternate']", $context)->item(0)->attributes; - if (is_object($alternate)) - foreach($alternate AS $attributes) - if ($attributes->name == "href") + if (is_object($alternate)) { + foreach ($alternate AS $attributes) { + if (($attributes->name == "href") AND ($attributes->textContent != "")) { $author["author-link"] = $attributes->textContent; + } + } + } - $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 ($r) { - $contact = $r[0]; - $author["contact-id"] = $r[0]["id"]; - } else - $author["contact-id"] = $contact["id"]; + $author["contact-id"] = $contact["id"]; + + if ($author["author-link"] != "") { + if ($aliaslink == "") { + $aliaslink = $author["author-link"]; + } + + $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"]; + $author["author-link"] = $r[0]["url"]; + } + } elseif ($addr != "") { + // 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"]; + } + } $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"] = self::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"]; @@ -458,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]"; @@ -653,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; } @@ -846,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 * @@ -916,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 @@ -927,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) { @@ -1158,6 +1169,7 @@ class ostatus { continue; } + /// @TODO One statment is okay (until if () ) $arr = array(); $arr["network"] = $details["network"]; $arr["uri"] = $single_conv->id; @@ -1174,7 +1186,7 @@ class ostatus { $arr["owner-name"] = $single_conv->actor->portablecontacts_net->displayName; $arr["owner-link"] = $actor; - $arr["owner-avatar"] = self::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"]; @@ -1210,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"] = self::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"] == "") @@ -1256,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) @@ -2206,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 * @@ -2223,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'); @@ -2268,6 +2283,9 @@ class ostatus { $root = self::add_header($doc, $owner); foreach ($items AS $item) { + if (Config::get('system', 'ostatus_debug')) { + $item['body'] .= '🍼'; + } $entry = self::entry($doc, $item, $owner); $root->appendChild($entry); } @@ -2288,6 +2306,10 @@ class ostatus { $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; + if (Config::get('system', 'ostatus_debug')) { + $item['body'] .= '🐟'; + } + $entry = self::entry($doc, $item, $owner, true); $doc->appendChild($entry); @@ -2295,4 +2317,3 @@ class ostatus { return(trim($doc->saveXML())); } } -?>