]> git.mxchange.org Git - friendica.git/blobdiff - include/ostatus.php
Issue 2122: Make sure to always return the correct number of entries
[friendica.git] / include / ostatus.php
index 2a252b947ca25beb5af3dd9d3b7ca074f49ca093..932fc1fa9a7ea142fe06518c14e50fab657e16e9 100644 (file)
@@ -9,6 +9,7 @@ require_once("include/socgraph.php");
 require_once("include/Photo.php");
 require_once("include/Scrape.php");
 require_once("include/follow.php");
+require_once("mod/proxy.php");
 
 define('OSTATUS_DEFAULT_POLL_INTERVAL', 30); // given in minutes
 define('OSTATUS_DEFAULT_POLL_TIMEFRAME', 1440); // given in minutes
@@ -146,9 +147,9 @@ function ostatus_fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch)
                        if ($value != "")
                                $contact["location"] = $value;
 
-                       q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `about` = '%s', `location` = '%s', `name-date` = '%s' WHERE `id` = %d",
+                       q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `about` = '%s', `location` = '%s', `name-date` = '%s' WHERE `id` = %d AND `network` = '%s'",
                                dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["about"]), dbesc($contact["location"]),
-                               dbesc(datetime_convert()), intval($contact["id"]));
+                               dbesc(datetime_convert()), intval($contact["id"]), dbesc(NETWORK_OSTATUS));
 
                        poco_check($contact["url"], $contact["name"], $contact["network"], $author["author-avatar"], $contact["about"], $contact["location"],
                                        "", "", "", datetime_convert(), 2, $contact["id"], $contact["uid"]);
@@ -161,9 +162,9 @@ function ostatus_fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch)
 
                        $photos = import_profile_photo($author["author-avatar"], $importer["uid"], $contact["id"]);
 
-                       q("UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d",
+                       q("UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d AND `network` = '%s'",
                                dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]),
-                               dbesc(datetime_convert()), intval($contact["id"]));
+                               dbesc(datetime_convert()), intval($contact["id"]), dbesc(NETWORK_OSTATUS));
                }
        }
 
@@ -1078,22 +1079,49 @@ function ostatus_store_conversation($itemid, $conversation_url) {
 }
 
 function xml_add_element($doc, $parent, $element, $value = "", $attributes = array()) {
-       $element = $doc->createElement($element, $value);
+       $element = $doc->createElement($element, xmlify($value));
 
        foreach ($attributes AS $key => $value) {
                $attribute = $doc->createAttribute($key);
-               $attribute->value = $value;
+               $attribute->value = xmlify($value);
                $element->appendChild($attribute);
        }
 
        $parent->appendChild($element);
 }
 
+function ostatus_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;
+}
+
 function ostatus_add_header($doc, $owner) {
        $a = get_app();
 
        $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default`",
-               intval($owner["user_uid"]));
+               intval($owner["uid"]));
        if (!$r)
                return;
 
@@ -1102,13 +1130,13 @@ function ostatus_add_header($doc, $owner) {
        $root = $doc->createElementNS(NS_ATOM, 'feed');
        $doc->appendChild($root);
 
-       $root->setAttributeNS(NS_ATOM, "xmlns:thr", NS_THR);
-       $root->setAttributeNS(NS_ATOM, "xmlns:georss", NS_GEORSS);
-       $root->setAttributeNS(NS_ATOM, "xmlns:activity", NS_ACTIVITY);
-       $root->setAttributeNS(NS_ATOM, "xmlns:media", NS_MEDIA);
-       $root->setAttributeNS(NS_ATOM, "xmlns:poco", NS_POCO);
-       $root->setAttributeNS(NS_ATOM, "xmlns:ostatus", NS_OSTATUS);
-       $root->setAttributeNS(NS_ATOM, "xmlns:statusnet", NS_STATUSNET);
+       $root->setAttribute("xmlns:thr", NS_THR);
+       $root->setAttribute("xmlns:georss", NS_GEORSS);
+       $root->setAttribute("xmlns:activity", NS_ACTIVITY);
+       $root->setAttribute("xmlns:media", NS_MEDIA);
+       $root->setAttribute("xmlns:poco", NS_POCO);
+       $root->setAttribute("xmlns:ostatus", NS_OSTATUS);
+       $root->setAttribute("xmlns:statusnet", NS_STATUSNET);
 
        $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION);
        xml_add_element($doc, $root, "generator", FRIENDICA_PLATFORM, $attributes);
@@ -1201,6 +1229,14 @@ function ostatus_get_attachment($doc, $root, $item) {
                        break;
        }
 
+       if (($siteinfo["type"] != "photo") AND isset($siteinfo["image"])) {
+               $photodata = get_photo_info($siteinfo["image"]);
+
+               $attributes = array("rel" => "preview", "href" => $siteinfo["image"], "media:width" => $photodata[0], "media:height" => $photodata[1]);
+               xml_add_element($doc, $root, "link", "", $attributes);
+       }
+
+
        $arr = explode('[/attach],',$item['attach']);
        if(count($arr)) {
                foreach($arr as $r) {
@@ -1229,7 +1265,7 @@ function ostatus_add_author($doc, $owner, $profile) {
        $author = $doc->createElement("author");
        xml_add_element($doc, $author, "activity:object-type", ACTIVITY_OBJ_PERSON);
        xml_add_element($doc, $author, "uri", $owner["url"]);
-       xml_add_element($doc, $author, "name", $owner["nick"]);
+       xml_add_element($doc, $author, "name", $profile["name"]);
 
        $attributes = array("rel" => "alternate", "type" => "text/html", "href" => $owner["url"]);
        xml_add_element($doc, $author, "link", "", $attributes);
@@ -1269,11 +1305,19 @@ function ostatus_add_author($doc, $owner, $profile) {
        }
 
        xml_add_element($doc, $author, "followers", "", array("url" => $a->get_baseurl()."/viewcontacts/".$owner["nick"]));
-       xml_add_element($doc, $author, "statusnet:profile_info", "", array("local_id" => $owner["user_uid"]));
+       xml_add_element($doc, $author, "statusnet:profile_info", "", array("local_id" => $owner["uid"]));
 
        return $author;
 }
 
+/*
+To-Do: Picture attachments should look like this:
+
+<a href="https://status.pirati.ca/attachment/572819" title="https://status.pirati.ca/file/heluecht-20151202T222602-rd3u49p.gif"
+class="attachment thumbnail" id="attachment-572819" rel="nofollow external">https://status.pirati.ca/attachment/572819</a>
+
+*/
+
 function ostatus_entry($doc, $item, $owner, $toplevel = false) {
        $a = get_app();
 
@@ -1283,16 +1327,16 @@ function ostatus_entry($doc, $item, $owner, $toplevel = false) {
        } else {
                $entry = $doc->createElementNS(NS_ATOM, "entry");
 
-               $entry->setAttributeNS(NS_ATOM, "xmlns:thr", NS_THR);
-               $entry->setAttributeNS(NS_ATOM, "xmlns:georss", NS_GEORSS);
-               $entry->setAttributeNS(NS_ATOM, "xmlns:activity", NS_ACTIVITY);
-               $entry->setAttributeNS(NS_ATOM, "xmlns:media", NS_MEDIA);
-               $entry->setAttributeNS(NS_ATOM, "xmlns:poco", NS_POCO);
-               $entry->setAttributeNS(NS_ATOM, "xmlns:ostatus", NS_OSTATUS);
-               $entry->setAttributeNS(NS_ATOM, "xmlns:statusnet", NS_STATUSNET);
+               $entry->setAttribute("xmlns:thr", NS_THR);
+               $entry->setAttribute("xmlns:georss", NS_GEORSS);
+               $entry->setAttribute("xmlns:activity", NS_ACTIVITY);
+               $entry->setAttribute("xmlns:media", NS_MEDIA);
+               $entry->setAttribute("xmlns:poco", NS_POCO);
+               $entry->setAttribute("xmlns:ostatus", NS_OSTATUS);
+               $entry->setAttribute("xmlns:statusnet", NS_STATUSNET);
 
                $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default`",
-                       intval($owner["user_uid"]));
+                       intval($owner["uid"]));
                if (!$r)
                        return;
 
@@ -1304,8 +1348,19 @@ function ostatus_entry($doc, $item, $owner, $toplevel = false) {
                $title = sprintf("New comment by %s", $owner["nick"]);
        }
 
-       xml_add_element($doc, $entry, "activity:object-type", $item["object-type"]);
-       xml_add_element($doc, $entry, "id", $item["uri"]); //<id>tag:fresh.federati.net,2015-11-22:noticeId=324796:objectType=note</id>
+       // To use the object-type "bookmark" we have to implement these elements:
+       //
+       // <activity:object-type>http://activitystrea.ms/schema/1.0/bookmark</activity:object-type>
+       // <title>Historic Rocket Landing</title>
+       // <summary>Nur ein Testbeitrag.</summary>
+       // <link rel="related" href="https://www.youtube.com/watch?v=9pillaOxGCo"/>
+       // <link rel="preview" href="https://pirati.cc/file/thumb-4526-450x338-b48c8055f0c2fed0c3f67adc234c4b99484a90c42ed3cac73dc1081a4d0a7bc1.jpg.jpg" media:width="450" media:height="338"/>
+       //
+       // But: it seems as if it doesn't federate well between the GS servers
+       // So we just set it to "note" to be sure that it reaches their target systems
+
+       xml_add_element($doc, $entry, "activity:object-type", ACTIVITY_OBJ_NOTE);
+       xml_add_element($doc, $entry, "id", $item["uri"]);
        xml_add_element($doc, $entry, "title", $title);
 
        if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
@@ -1313,10 +1368,14 @@ function ostatus_entry($doc, $item, $owner, $toplevel = false) {
        else
                $body = $item['body'];
 
+       $body = ostatus_format_picture_post($body);
+
        if ($item['title'] != "")
                $body = "[b]".$item['title']."[/b]\n\n".$body;
 
+       //$body = bb_remove_share_information($body);
        $body = bbcode($body, false, false, 7);
+
        xml_add_element($doc, $entry, "content", $body, array("type" => "html"));
 
        xml_add_element($doc, $entry, "link", "", array("rel" => "alternate", "type" => "text/html",
@@ -1370,13 +1429,13 @@ function ostatus_entry($doc, $item, $owner, $toplevel = false) {
 
        // To-Do:
        // The API call has yet to be implemented
-       $attributes = array("href" => $a->get_baseurl()."/api/statuses/show/".$item["id"].".atom",
-                       "rel" => "self", "type" => "application/atom+xml");
-       xml_add_element($doc, $entry, "link", "", $attributes);
+       //$attributes = array("href" => $a->get_baseurl()."/api/statuses/show/".$item["id"].".atom",
+       //              "rel" => "self", "type" => "application/atom+xml");
+       //xml_add_element($doc, $entry, "link", "", $attributes);
 
-       $attributes = array("href" => $a->get_baseurl()."/api/statuses/show/".$item["id"].".atom",
-                       "rel" => "edit", "type" => "application/atom+xml");
-       xml_add_element($doc, $entry, "link", "", $attributes);
+       //$attributes = array("href" => $a->get_baseurl()."/api/statuses/show/".$item["id"].".atom",
+       //              "rel" => "edit", "type" => "application/atom+xml");
+       //xml_add_element($doc, $entry, "link", "", $attributes);
 
        $app = $item["app"];
        if ($app == "")
@@ -1389,7 +1448,7 @@ function ostatus_entry($doc, $item, $owner, $toplevel = false) {
 
 function ostatus_feed(&$a, $owner_nick, $last_update) {
 
-       $r = q("SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
+       $r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
                        FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
                        WHERE `contact`.`self` AND `user`.`nickname` = '%s' LIMIT 1",
                        dbesc($owner_nick));
@@ -1413,7 +1472,7 @@ function ostatus_feed(&$a, $owner_nick, $last_update) {
                                AND (`item`.`owner-link` IN ('%s', '%s'))
                        ORDER BY `item`.`received` DESC
                        LIMIT 0, 300",
-                       intval($owner["user_uid"]), dbesc($check_date),
+                       intval($owner["uid"]), dbesc($check_date),
                        dbesc(NETWORK_DFRN), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_OSTATUS),
                        dbesc($owner["nurl"]), dbesc(str_replace("http://", "https://", $owner["nurl"]))
                );
@@ -1428,7 +1487,7 @@ function ostatus_feed(&$a, $owner_nick, $last_update) {
                $root->appendChild($entry);
        }
 
-       return($doc->saveXML());
+       return(trim($doc->saveXML()));
 }
 
 function ostatus_salmon($item,$owner) {
@@ -1440,6 +1499,6 @@ function ostatus_salmon($item,$owner) {
 
        $doc->appendChild($entry);
 
-       return($doc->saveXML());
+       return(trim($doc->saveXML()));
 }
 ?>