X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fostatus.php;h=ec53141dc7d06c386c8d070baddbfc1748e08c6a;hb=5efab810f5ac961995940e8ca4051123334111c2;hp=dcbd91f415305064f5e661e36743cc68b9ab4052;hpb=6ff5c23d50095e5407bf69f8a4ec2220c5d2d408;p=friendica.git diff --git a/include/ostatus.php b/include/ostatus.php index dcbd91f415..ec53141dc7 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; + + // 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/uri/text()', $context)->item(0)->nodeValue; + $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; @@ -1155,12 +1182,10 @@ class ostatus { } /** - * @brief + * @brief Stores conversation data into the database * - * @param $itemid - * @param $conversation_url - * - * @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 +1209,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 +1245,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 +1279,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 +1340,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 +1365,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 +1435,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 +1509,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 +1522,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 +1535,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 +1559,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 +1583,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 +1614,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 +1627,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 +1694,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 +1716,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 +1732,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 +1759,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 +1793,15 @@ class ostatus { } /** - * @brief - * - * @param $doc - * @param $entry - * @param $item - * @param $owner - * @param $title - * @param $verb - * @param $complete + * @brief Adds elements to the XML document * - * @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 +1833,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 +1938,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) { @@ -1950,7 +1971,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), @@ -1975,12 +1996,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) {