X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fostatus.php;h=7ac26846d246ab575259e89e5c6fa9a8fde632e7;hb=18cbe9f6ff275cbb363fd9a0a5014bc8fe3d9f7b;hp=ba5b80cd5d4fe264a93358912fdb4efce1014bc0;hpb=2c5b5c1cd471c890b7e06e28dc979c2a0e8736b0;p=friendica.git diff --git a/include/ostatus.php b/include/ostatus.php index ba5b80cd5d..7ac26846d2 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -1,4 +1,8 @@ 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)) @@ -36,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"]; @@ -72,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; @@ -98,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"], @@ -116,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); } @@ -124,6 +169,14 @@ class ostatus { return($author); } + /** + * @brief Fetches author data from a given XML string + * + * @param string $xml The XML + * @param array $importer user record of the importing user + * + * @return array Array of author related entries for the item + */ public static function salmon_author($xml, $importer) { if ($xml == "") @@ -151,7 +204,16 @@ class ostatus { } } + /** + * @brief Imports an XML string containing OStatus elements + * + * @param string $xml The XML + * @param array $importer user record of the importing user + * @param $contact + * @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); @@ -431,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); @@ -440,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; @@ -492,6 +556,13 @@ class ostatus { } } + /** + * @brief Create an url out of an uri + * + * @param string $href URI in the format "parameter1:parameter1:..." + * + * @return string URL in the format http(s)://.... + */ public static function convert_href($href) { $elements = explode(":",$href); @@ -515,6 +586,12 @@ class ostatus { return $href; } + /** + * @brief Checks if there are entries in conversations that aren't present on our side + * + * @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'); @@ -617,6 +694,7 @@ class ostatus { } } + $contact["hide"] = false; // OStatus contacts are never hidden update_gcontact($contact); } @@ -702,8 +780,18 @@ class ostatus { return $details; } + /** + * @brief Stores an item and completes the thread + * + * @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 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; @@ -1093,6 +1181,12 @@ class ostatus { return($item_stored); } + /** + * @brief Stores conversation data into the database + * + * @param integer $itemid The id of the item + * @param string $conversation_url The uri of the conversation + */ private function store_conversation($itemid, $conversation_url) { $conversation_url = self::convert_href($conversation_url); @@ -1114,6 +1208,13 @@ class ostatus { } } + /** + * @brief Checks if the current post is a reshare + * + * @param array $item The item array of thw post + * + * @return string The guid if the post is a reshare + */ private function get_reshared_guid($item) { $body = trim($item["body"]); @@ -1143,6 +1244,13 @@ class ostatus { return $guid; } + /** + * @brief Cleans the body of a post if it contains picture links + * + * @param string $body The body + * + * @return string The cleaned body + */ private function format_picture_post($body) { $siteinfo = get_attached_data($body); @@ -1170,6 +1278,14 @@ class ostatus { return $body; } + /** + * @brief Adds the header elements to the XML document + * + * @param object $doc XML document + * @param array $owner Contact data of the poster + * + * @return object header root element + */ private function add_header($doc, $owner) { $a = get_app(); @@ -1223,6 +1339,12 @@ class ostatus { return $root; } + /** + * @brief Add the link to the push hubs to the XML document + * + * @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'); @@ -1242,6 +1364,13 @@ class ostatus { } } + /** + * @brief Adds attachement data to the XML document + * + * @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 = ""; $siteinfo = get_attached_data($item["body"]); @@ -1305,6 +1434,14 @@ class ostatus { } } + /** + * @brief Adds the author element to the XML document + * + * @param object $doc XML document + * @param array $owner Contact data of the poster + * + * @return object author element + */ private function add_author($doc, $owner) { $r = q("SELECT `homepage` FROM `profile` WHERE `uid` = %d AND `is-default` LIMIT 1", intval($owner["uid"])); @@ -1371,18 +1508,42 @@ class ostatus { * */ + /** + * @brief Returns the given activity if present - otherwise returns the "post" activity + * + * @param array $item Data of the item that is to be posted + * + * @return string activity + */ function construct_verb($item) { if ($item['verb']) return $item['verb']; return ACTIVITY_POST; } + /** + * @brief Returns the given object type if present - otherwise returns the "note" object type + * + * @param array $item Data of the item that is to be posted + * + * @return string Object type + */ function construct_objecttype($item) { if (in_array($item['object-type'], array(ACTIVITY_OBJ_NOTE, ACTIVITY_OBJ_COMMENT))) return $item['object-type']; return ACTIVITY_OBJ_NOTE; } + /** + * @brief Adds an entry element to the XML document + * + * @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 object Entry element + */ private function entry($doc, $item, $owner, $toplevel = false) { $repeated_guid = self::get_reshared_guid($item); if ($repeated_guid != "") @@ -1397,6 +1558,14 @@ class ostatus { return self::note_entry($doc, $item, $owner, $toplevel); } + /** + * @brief Adds a source entry to the XML document + * + * @param object $doc XML document + * @param array $contact Array of the contact that is added + * + * @return object Source element + */ private function source_entry($doc, $contact) { $source = $doc->createElement("source"); xml::add_element($doc, $source, "id", $contact["poll"]); @@ -1413,6 +1582,14 @@ class ostatus { return $source; } + /** + * @brief Fetches contact data from the contact or the gcontact table + * + * @param string $url URL of the contact + * @param array $owner Contact data of the poster + * + * @return array Contact array + */ private function contact_entry($url, $owner) { $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` IN (0, %d) ORDER BY `uid` DESC LIMIT 1", @@ -1437,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"])) @@ -1447,6 +1626,17 @@ class ostatus { return $contact; } + /** + * @brief Adds an entry element with reshared content + * + * @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 bool $toplevel Is it for en entry element (false) or a feed entry (true)? + * + * @return object Entry element + */ private function reshare_entry($doc, $item, $owner, $repeated_guid, $toplevel) { if (($item["id"] != $item["parent"]) AND (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) { @@ -1473,8 +1663,6 @@ class ostatus { $as_object = $doc->createElement("activity:object"); -// ostatusWaEeYs -// ostatusogu9zg - besser xml::add_element($doc, $as_object, "activity:object-type", NAMESPACE_ACTIVITY_SCHEMA."activity"); self::entry_content($doc, $as_object, $repeated_item, $owner, "", "", false); @@ -1505,6 +1693,16 @@ class ostatus { return $entry; } + /** + * @brief Adds an entry element with a "like" + * + * @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 object Entry element with "like" + */ private function like_entry($doc, $item, $owner, $toplevel) { if (($item["id"] != $item["parent"]) AND (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) { @@ -1518,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])); @@ -1532,6 +1731,16 @@ class ostatus { return $entry; } + /** + * @brief Adds a regular entry element + * + * @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 object Entry element + */ private function note_entry($doc, $item, $owner, $toplevel) { if (($item["id"] != $item["parent"]) AND (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) { @@ -1549,7 +1758,18 @@ class ostatus { return $entry; } + /** + * @brief Adds a header element to the XML document + * + * @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 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"]); @@ -1572,6 +1792,17 @@ class ostatus { return $title; } + /** + * @brief Adds elements to the XML document + * + * @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) { if ($verb == "") @@ -1601,6 +1832,15 @@ class ostatus { xml::add_element($doc, $entry, "updated", datetime_convert("UTC","UTC",$item["edited"]."+00:00",ATOM_TIME)); } + /** + * @brief Adds the elements at the foot of an entry to the XML document + * + * @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 + */ private function entry_footer($doc, $entry, $item, $owner, $complete = true) { $mentioned = array(); @@ -1697,6 +1937,15 @@ class ostatus { } } + /** + * @brief Creates the XML feed for a given nickname + * + * @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 string XML feed + */ public static function feed(&$a, $owner_nick, $last_update) { $r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags` @@ -1746,6 +1995,14 @@ class ostatus { return(trim($doc->saveXML())); } + /** + * @brief Creates the XML for a salmon message + * + * @param array $item Data of the item that is to be posted + * @param array $owner Contact data of the poster + * + * @return string XML for the salmon + */ public static function salmon($item,$owner) { $doc = new DOMDocument('1.0', 'utf-8');