+ /**
+ * @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);
+
+ $messages = q("SELECT `uid`, `parent`, `created`, `received`, `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid));
+ if (!$messages)
+ return;
+ $message = $messages[0];
+
+ // Store conversation url if not done before
+ $conversation = q("SELECT `url` FROM `term` WHERE `uid` = %d AND `oid` = %d AND `otype` = %d AND `type` = %d",
+ intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION));
+
+ if (!$conversation) {
+ $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`, `created`, `received`, `guid`) VALUES (%d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s')",
+ intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION),
+ dbesc($message["created"]), dbesc($conversation_url), dbesc($message["created"]), dbesc($message["received"]), dbesc($message["guid"]));
+ logger('Storing conversation url '.$conversation_url.' for id '.$itemid);
+ }
+ }
+
+ /**
+ * @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"]);
+
+ // Skip if it isn't a pure repeated messages
+ // Does it start with a share?
+ if (strpos($body, "[share") > 0)
+ return("");
+
+ // Does it end with a share?
+ if (strlen($body) > (strrpos($body, "[/share]") + 8))
+ return("");
+
+ $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body);
+ // Skip if there is no shared message in there
+ if ($body == $attributes)
+ return(false);
+
+ $guid = "";
+ preg_match("/guid='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $guid = $matches[1];
+
+ preg_match('/guid="(.*?)"/ism', $attributes, $matches);
+ if ($matches[1] != "")
+ $guid = $matches[1];
+
+ 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);
+
+ if (($siteinfo["type"] == "photo")) {
+ if (isset($siteinfo["preview"]))
+ $preview = $siteinfo["preview"];
+ else
+ $preview = $siteinfo["image"];
+
+ // Is it a remote picture? Then make a smaller preview here
+ $preview = proxy_url($preview, false, PROXY_SIZE_SMALL);
+
+ // Is it a local picture? Then make it smaller here
+ $preview = str_replace(array("-0.jpg", "-0.png"), array("-2.jpg", "-2.png"), $preview);
+ $preview = str_replace(array("-1.jpg", "-1.png"), array("-2.jpg", "-2.png"), $preview);
+
+ if (isset($siteinfo["url"]))
+ $url = $siteinfo["url"];
+ else
+ $url = $siteinfo["image"];
+
+ $body = trim($siteinfo["text"])." [url]".$url."[/url]\n[img]".$preview."[/img]";
+ }
+
+ 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();
+
+ $root = $doc->createElementNS(NAMESPACE_ATOM1, 'feed');
+ $doc->appendChild($root);
+
+ $root->setAttribute("xmlns:thr", NAMESPACE_THREAD);
+ $root->setAttribute("xmlns:georss", NAMESPACE_GEORSS);
+ $root->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY);
+ $root->setAttribute("xmlns:media", NAMESPACE_MEDIA);
+ $root->setAttribute("xmlns:poco", NAMESPACE_POCO);
+ $root->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS);
+ $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET);
+
+ $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION);
+ xml::add_element($doc, $root, "generator", FRIENDICA_PLATFORM, $attributes);
+ xml::add_element($doc, $root, "id", App::get_baseurl()."/profile/".$owner["nick"]);
+ xml::add_element($doc, $root, "title", sprintf("%s timeline", $owner["name"]));
+ xml::add_element($doc, $root, "subtitle", sprintf("Updates from %s on %s", $owner["name"], $a->config["sitename"]));
+ xml::add_element($doc, $root, "logo", $owner["photo"]);
+ xml::add_element($doc, $root, "updated", datetime_convert("UTC", "UTC", "now", ATOM_TIME));
+
+ $author = self::add_author($doc, $owner);
+ $root->appendChild($author);
+
+ $attributes = array("href" => $owner["url"], "rel" => "alternate", "type" => "text/html");
+ xml::add_element($doc, $root, "link", "", $attributes);
+
+ /// @TODO We have to find out what this is
+ /// $attributes = array("href" => App::get_baseurl()."/sup",
+ /// "rel" => "http://api.friendfeed.com/2008/03#sup",
+ /// "type" => "application/json");
+ /// xml::add_element($doc, $root, "link", "", $attributes);
+
+ self::hublinks($doc, $root);
+
+ $attributes = array("href" => App::get_baseurl()."/salmon/".$owner["nick"], "rel" => "salmon");
+ xml::add_element($doc, $root, "link", "", $attributes);
+
+ $attributes = array("href" => App::get_baseurl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-replies");
+ xml::add_element($doc, $root, "link", "", $attributes);
+
+ $attributes = array("href" => App::get_baseurl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention");
+ xml::add_element($doc, $root, "link", "", $attributes);
+
+ $attributes = array("href" => App::get_baseurl()."/api/statuses/user_timeline/".$owner["nick"].".atom",
+ "rel" => "self", "type" => "application/atom+xml");
+ xml::add_element($doc, $root, "link", "", $attributes);
+
+ 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');
+
+ $hubxml = '';
+ if(strlen($hub)) {
+ $hubs = explode(',', $hub);
+ if(count($hubs)) {
+ foreach($hubs as $h) {
+ $h = trim($h);
+ if(! strlen($h))
+ continue;
+ if ($h === '[internal]')
+ $h = App::get_baseurl() . '/pubsubhubbub';
+ xml::add_element($doc, $root, "link", "", array("href" => $h, "rel" => "hub"));
+ }
+ }
+ }
+ }