X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fostatus.php;h=bcd8fd671302bffd4527ab1160d277d7095602ef;hb=d49325d177cf03b97df250ca3cb081421c541049;hp=dcbd91f415305064f5e661e36743cc68b9ab4052;hpb=6ff5c23d50095e5407bf69f8a4ec2220c5d2d408;p=friendica.git diff --git a/include/ostatus.php b/include/ostatus.php index dcbd91f415..bcd8fd6713 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -28,15 +28,15 @@ class ostatus { const OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS = 14400; // given in minutes /** - * @brief + * @brief Fetches author data * - * @param $xpath - * @param $context - * @param $importer - * @param $contact - * @param $onlyfetch + * @param object $xpath The xpath object + * @param object $context The xml context of the author detals + * @param array $importer user record of the importing user + * @param array $contact Called by reference, will contain the fetched contact + * @param bool $onlyfetch Only fetch the header without updating the contact entries * - * @return + * @return array Array of author related entries for the item */ private function fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch) { @@ -44,8 +44,7 @@ class ostatus { $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; - // Preserve the value - $authorlink = $author["author-link"]; + $aliaslink = $author["author-link"]; $alternate = $xpath->query("atom:author/atom:link[@rel='alternate']", $context)->item(0)->attributes; if (is_object($alternate)) @@ -55,7 +54,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($authorlink)), dbesc(NETWORK_STATUSNET)); + dbesc(normalise_link($aliaslink)), dbesc(NETWORK_STATUSNET)); if ($r) { $contact = $r[0]; $author["contact-id"] = $r[0]["id"]; @@ -91,13 +90,20 @@ class ostatus { // Only update the contacts if it is an OStatus contact if ($r AND !$onlyfetch AND ($contact["network"] == NETWORK_OSTATUS)) { + // Update contact data - $value = $xpath->query("atom:link[@rel='salmon']", $context)->item(0)->nodeValue; - if ($value != "") - $contact["notify"] = $value; + // This query doesn't seem to work + // $value = $xpath->query("atom:link[@rel='salmon']", $context)->item(0)->nodeValue; + // if ($value != "") + // $contact["notify"] = $value; - $value = $xpath->evaluate('atom:author/uri/text()', $context)->item(0)->nodeValue; + // This query doesn't seem to work as well - I hate these queries + // $value = $xpath->query("atom:link[@rel='self' and @type='application/atom+xml']", $context)->item(0)->nodeValue; + // if ($value != "") + // $contact["poll"] = $value; + + $value = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; if ($value != "") $contact["alias"] = $value; @@ -117,12 +123,14 @@ class ostatus { if ($value != "") $contact["location"] = $value; - if (($contact["name"] != $r[0]["name"]) OR ($contact["nick"] != $r[0]["nick"]) OR ($contact["about"] != $r[0]["about"]) OR ($contact["location"] != $r[0]["location"])) { + if (($contact["name"] != $r[0]["name"]) OR ($contact["nick"] != $r[0]["nick"]) OR ($contact["about"] != $r[0]["about"]) OR + ($contact["alias"] != $r[0]["alias"]) OR ($contact["location"] != $r[0]["location"])) { logger("Update contact data for contact ".$contact["id"], LOGGER_DEBUG); - q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `about` = '%s', `location` = '%s', `name-date` = '%s' WHERE `id` = %d", - dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["about"]), dbesc($contact["location"]), + q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `alias` = '%s', `about` = '%s', `location` = '%s', `name-date` = '%s' WHERE `id` = %d", + dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["alias"]), + dbesc($contact["about"]), dbesc($contact["location"]), dbesc(datetime_convert()), intval($contact["id"])); poco_check($contact["url"], $contact["name"], $contact["network"], $author["author-avatar"], $contact["about"], $contact["location"], @@ -135,7 +143,25 @@ class ostatus { update_contact_avatar($author["author-avatar"], $importer["uid"], $contact["id"]); } + // Ensure that we are having this contact (with uid=0) + $cid = get_contact($author["author-link"], 0); + + if ($cid) { + // Update it with the current values + q("UPDATE `contact` SET `url` = '%s', `name` = '%s', `nick` = '%s', `alias` = '%s', + `about` = '%s', `location` = '%s', + `success_update` = '%s', `last-update` = '%s' + WHERE `id` = %d", + dbesc($author["author-link"]), dbesc($contact["name"]), dbesc($contact["nick"]), + dbesc($contact["alias"]), dbesc($contact["about"]), dbesc($contact["location"]), + dbesc(datetime_convert()), dbesc(datetime_convert()), intval($cid)); + + // Update the avatar + update_contact_avatar($author["author-avatar"], 0, $cid); + } + $contact["generation"] = 2; + $contact["hide"] = false; // OStatus contacts are never hidden $contact["photo"] = $author["author-avatar"]; update_gcontact($contact); } @@ -144,12 +170,12 @@ class ostatus { } /** - * @brief + * @brief Fetches author data from a given XML string * - * @param $xml - * @param $importer + * @param string $xml The XML + * @param array $importer user record of the importing user * - * @return + * @return array Array of author related entries for the item */ public static function salmon_author($xml, $importer) { @@ -179,16 +205,15 @@ class ostatus { } /** - * @brief + * @brief Imports an XML string containing OStatus elements * - * @param $xml - * @param $importer + * @param string $xml The XML + * @param array $importer user record of the importing user * @param $contact - * @param $hub - * - * @return + * @param array $hub Called by reference, returns the fetched hub data */ public static function import($xml,$importer,&$contact, &$hub) { + /// @todo this function is too long. It has to be split in many parts logger("Import OStatus message", LOGGER_DEBUG); @@ -468,6 +493,7 @@ class ostatus { $orig_body = $xpath->query('atom:content/text()', $activityobjects)->item(0)->nodeValue; $orig_created = $xpath->query('atom:published/text()', $activityobjects)->item(0)->nodeValue; + $orig_edited = $xpath->query('atom:updated/text()', $activityobjects)->item(0)->nodeValue; $orig_contact = $contact; $orig_author = self::fetchauthor($xpath, $activityobjects, $importer, $orig_contact, false); @@ -477,6 +503,7 @@ class ostatus { $item["author-avatar"] = $orig_author["author-avatar"]; $item["body"] = add_page_info_to_body(html2bbcode($orig_body)); $item["created"] = $orig_created; + $item["edited"] = $orig_edited; $item["uri"] = $orig_uri; $item["plink"] = $orig_link; @@ -530,11 +557,11 @@ class ostatus { } /** - * @brief + * @brief Create an url out of an uri * - * @param $href + * @param string $href URI in the format "parameter1:parameter1:..." * - * @return + * @return string URL in the format http(s)://.... */ public static function convert_href($href) { $elements = explode(":",$href); @@ -560,12 +587,10 @@ class ostatus { } /** - * @brief - * - * @param $mentions - * @param $override + * @brief Checks if there are entries in conversations that aren't present on our side * - * @return + * @param bool $mentions Fetch conversations where we are mentioned + * @param bool $override Override the interval setting */ public static function check_conversations($mentions = false, $override = false) { $last = get_config('system','ostatus_last_poll'); @@ -669,6 +694,7 @@ class ostatus { } } + $contact["hide"] = false; // OStatus contacts are never hidden update_gcontact($contact); } @@ -755,16 +781,17 @@ class ostatus { } /** - * @brief + * @brief Stores an item and completes the thread * - * @param $conversation_url - * @param $uid - * @param $item + * @param string $conversation_url The URI of the conversation + * @param integer $uid The user id + * @param array $item Data of the item that is to be posted * - * @return + * @return integer The item id of the posted item array */ private function completion($conversation_url, $uid, $item = array(), $self = "") { + /// @todo This function is totally ugly and has to be rewritten totally $item_stored = -1; @@ -779,11 +806,20 @@ class ostatus { } // Get the parent + $parents = q("SELECT `item`.`id`, `item`.`parent`, `item`.`uri`, `item`.`contact-id`, `item`.`type`, + `item`.`verb`, `item`.`visible` FROM `term` + STRAIGHT_JOIN `item` AS `thritem` ON `thritem`.`parent` = `term`.`oid` + 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) { @@ -1155,12 +1191,10 @@ class ostatus { } /** - * @brief - * - * @param $itemid - * @param $conversation_url + * @brief Stores conversation data into the database * - * @return + * @param integer $itemid The id of the item + * @param string $conversation_url The uri of the conversation */ private function store_conversation($itemid, $conversation_url) { @@ -1184,11 +1218,11 @@ class ostatus { } /** - * @brief + * @brief Checks if the current post is a reshare * - * @param $item + * @param array $item The item array of thw post * - * @return + * @return string The guid if the post is a reshare */ private function get_reshared_guid($item) { $body = trim($item["body"]); @@ -1220,11 +1254,11 @@ class ostatus { } /** - * @brief + * @brief Cleans the body of a post if it contains picture links * - * @param $body + * @param string $body The body * - * @return + * @return string The cleaned body */ private function format_picture_post($body) { $siteinfo = get_attached_data($body); @@ -1254,12 +1288,12 @@ class ostatus { } /** - * @brief + * @brief Adds the header elements to the XML document * - * @param $doc - * @param $owner + * @param object $doc XML document + * @param array $owner Contact data of the poster * - * @return + * @return object header root element */ private function add_header($doc, $owner) { @@ -1315,12 +1349,10 @@ class ostatus { } /** - * @brief - * - * @param $doc - * @param $root + * @brief Add the link to the push hubs to the XML document * - * @return + * @param object $doc XML document + * @param object $root XML root element where the hub links are added */ public static function hublinks($doc, $root) { $hub = get_config('system','huburl'); @@ -1342,13 +1374,11 @@ class ostatus { } /** - * @brief + * @brief Adds attachement data to the XML document * - * @param $doc - * @param $root - * @param $item - * - * @return + * @param object $doc XML document + * @param object $root XML root element where the hub links are added + * @param array $item Data of the item that is to be posted */ private function get_attachment($doc, $root, $item) { $o = ""; @@ -1414,12 +1444,12 @@ class ostatus { } /** - * @brief + * @brief Adds the author element to the XML document * - * @param $doc - * @param $owner + * @param object $doc XML document + * @param array $owner Contact data of the poster * - * @return + * @return object author element */ private function add_author($doc, $owner) { @@ -1488,11 +1518,11 @@ class ostatus { */ /** - * @brief + * @brief Returns the given activity if present - otherwise returns the "post" activity * - * @param $item + * @param array $item Data of the item that is to be posted * - * @return + * @return string activity */ function construct_verb($item) { if ($item['verb']) @@ -1501,11 +1531,11 @@ class ostatus { } /** - * @brief + * @brief Returns the given object type if present - otherwise returns the "note" object type * - * @param $item + * @param array $item Data of the item that is to be posted * - * @return + * @return string Object type */ function construct_objecttype($item) { if (in_array($item['object-type'], array(ACTIVITY_OBJ_NOTE, ACTIVITY_OBJ_COMMENT))) @@ -1514,14 +1544,14 @@ class ostatus { } /** - * @brief + * @brief Adds an entry element to the XML document * - * @param $doc - * @param $item - * @param $owner - * @param $toplevel + * @param object $doc XML document + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster + * @param bool $toplevel * - * @return + * @return object Entry element */ private function entry($doc, $item, $owner, $toplevel = false) { $repeated_guid = self::get_reshared_guid($item); @@ -1538,12 +1568,12 @@ class ostatus { } /** - * @brief + * @brief Adds a source entry to the XML document * - * @param $doc - * @param $contact + * @param object $doc XML document + * @param array $contact Array of the contact that is added * - * @return + * @return object Source element */ private function source_entry($doc, $contact) { $source = $doc->createElement("source"); @@ -1562,12 +1592,12 @@ class ostatus { } /** - * @brief + * @brief Fetches contact data from the contact or the gcontact table * - * @param $url - * @param $owner + * @param string $url URL of the contact + * @param array $owner Contact data of the poster * - * @return + * @return array Contact array */ private function contact_entry($url, $owner) { @@ -1593,8 +1623,10 @@ class ostatus { if (!isset($contact["poll"])) { $data = probe_url($url); - $contact["alias"] = $data["alias"]; $contact["poll"] = $data["poll"]; + + if (!$contact["alias"]) + $contact["alias"] = $data["alias"]; } if (!isset($contact["alias"])) @@ -1604,15 +1636,15 @@ class ostatus { } /** - * @brief + * @brief Adds an entry element with reshared content * - * @param $doc - * @param $item - * @param $owner + * @param object $doc XML document + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster * @param $repeated_guid - * @param $toplevel + * @param bool $toplevel Is it for en entry element (false) or a feed entry (true)? * - * @return + * @return object Entry element */ private function reshare_entry($doc, $item, $owner, $repeated_guid, $toplevel) { @@ -1671,14 +1703,14 @@ class ostatus { } /** - * @brief + * @brief Adds an entry element with a "like" * - * @param $doc - * @param $item - * @param $owner - * @param $toplevel + * @param object $doc XML document + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster + * @param bool $toplevel Is it for en entry element (false) or a feed entry (true)? * - * @return + * @return object Entry element with "like" */ private function like_entry($doc, $item, $owner, $toplevel) { @@ -1693,7 +1725,8 @@ class ostatus { $as_object = $doc->createElement("activity:object"); - $parent = q("SELECT * FROM `item` WHERE `id` = %d", intval($item["parent"])); + $parent = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d", + dbesc($item["thr-parent"]), intval($item["uid"])); $parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']); xml::add_element($doc, $as_object, "activity:object-type", self::construct_objecttype($parent[0])); @@ -1708,14 +1741,14 @@ class ostatus { } /** - * @brief + * @brief Adds a regular entry element * - * @param $doc - * @param $item - * @param $owner - * @param $toplevel + * @param object $doc XML document + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster + * @param bool $toplevel Is it for en entry element (false) or a feed entry (true)? * - * @return + * @return object Entry element */ private function note_entry($doc, $item, $owner, $toplevel) { @@ -1735,16 +1768,17 @@ class ostatus { } /** - * @brief + * @brief Adds a header element to the XML document * - * @param $doc - * @param $entry - * @param $owner - * @param $toplevel + * @param object $doc XML document + * @param object $entry The entry element where the elements are added + * @param array $owner Contact data of the poster + * @param bool $toplevel Is it for en entry element (false) or a feed entry (true)? * - * @return + * @return string The title for the element */ private function entry_header($doc, &$entry, $owner, $toplevel) { + /// @todo Check if this title stuff is really needed (I guess not) if (!$toplevel) { $entry = $doc->createElement("entry"); $title = sprintf("New note by %s", $owner["nick"]); @@ -1768,17 +1802,15 @@ class ostatus { } /** - * @brief + * @brief Adds elements to the XML document * - * @param $doc - * @param $entry - * @param $item - * @param $owner - * @param $title - * @param $verb - * @param $complete - * - * @return + * @param object $doc XML document + * @param object $entry Entry element where the content is added + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster + * @param string $title Title for the post + * @param string $verb The activity verb + * @param bool $complete Add the "status_net" element? */ private function entry_content($doc, $entry, $item, $owner, $title, $verb = "", $complete = true) { @@ -1810,15 +1842,13 @@ class ostatus { } /** - * @brief + * @brief Adds the elements at the foot of an entry to the XML document * - * @param $doc - * @param $entry - * @param $item - * @param $owner + * @param object $doc XML document + * @param object $entry The entry element where the elements are added + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster * @param $complete - * - * @return */ private function entry_footer($doc, $entry, $item, $owner, $complete = true) { @@ -1917,13 +1947,13 @@ class ostatus { } /** - * @brief + * @brief Creates the XML feed for a given nickname * - * @param $a - * @param $owner_nick - * @param $last_update + * @param app $a The application class + * @param string $owner_nick Nickname of the feed owner + * @param string $last_update Date of the last update * - * @return + * @return string XML feed */ public static function feed(&$a, $owner_nick, $last_update) { @@ -1940,9 +1970,23 @@ class ostatus { $last_update = 'now -30 days'; $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s'); - - $items = q("SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id` FROM `item` - INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent` + $authorid = get_contact($owner["url"], 0); + + $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` USE INDEX (`uid_contactid_created`) + STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` + WHERE `item`.`uid` = %d AND `item`.`contact-id` = %d AND + `item`.`author-id` = %d AND `item`.`created` > '%s' AND + NOT `item`.`deleted` AND NOT `item`.`private` AND + `thread`.`network` IN ('%s', '%s') + ORDER BY `item`.`created` DESC LIMIT 300", + intval($owner["uid"]), intval($owner["id"]), + intval($authorid), dbesc($check_date), + dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); + +/* 2016-10-23: The old query will be kept until we are sure that the query above is a good and fast replacement + + $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` + STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` LEFT JOIN `item` AS `thritem` ON `thritem`.`uri`=`item`.`thr-parent` AND `thritem`.`uid`=`item`.`uid` WHERE `item`.`uid` = %d AND `item`.`received` > '%s' AND NOT `item`.`private` AND NOT `item`.`deleted` AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' @@ -1950,7 +1994,7 @@ class ostatus { OR (`item`.`network` = '%s' AND ((`thread`.`network` IN ('%s', '%s')) OR (`thritem`.`network` IN ('%s', '%s')))) AND `thread`.`mention`) AND ((`item`.`owner-link` IN ('%s', '%s') AND (`item`.`parent` = `item`.`id`)) OR (`item`.`author-link` IN ('%s', '%s'))) - ORDER BY `item`.`received` DESC + ORDER BY `item`.`id` DESC LIMIT 0, 300", intval($owner["uid"]), dbesc($check_date), dbesc(NETWORK_DFRN), //dbesc(NETWORK_OSTATUS), dbesc(NETWORK_OSTATUS), @@ -1960,7 +2004,7 @@ class ostatus { dbesc($owner["nurl"]), dbesc(str_replace("http://", "https://", $owner["nurl"])), dbesc($owner["nurl"]), dbesc(str_replace("http://", "https://", $owner["nurl"])) ); - +*/ $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; @@ -1975,12 +2019,12 @@ class ostatus { } /** - * @brief + * @brief Creates the XML for a salmon message * - * @param $item - * @param $owner + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster * - * @return + * @return string XML for the salmon */ public static function salmon($item,$owner) {