]> git.mxchange.org Git - friendica.git/blobdiff - include/items.php
Better check for Diaspora accounts so you can connect them from the /suggest page.
[friendica.git] / include / items.php
index 8cbcc3e6e93f35427277dcee246a73248fe944ba..c1352cebbea41260dfbac3897be4f453e3e2f12f 100644 (file)
@@ -11,6 +11,7 @@ require_once('include/text.php');
 require_once('include/email.php');
 require_once('include/ostatus_conversation.php');
 require_once('include/threads.php');
+require_once('include/socgraph.php');
 
 function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
 
@@ -872,9 +873,18 @@ function get_atom_elements($feed, $item, $contact = array()) {
        }
 
        if (isset($contact["network"]) AND ($contact["network"] == NETWORK_FEED) AND $contact['fetch_further_information']) {
-               $res["body"] = $res["title"].add_page_info($res['plink']);
+               $preview = "";
+
+               // Handle enclosures and treat them as preview picture
+               if (isset($attach))
+                       foreach ($attach AS $attachment)
+                               if ($attachment->type == "image/jpeg")
+                                       $preview = $attachment->link;
+
+               $res["body"] = $res["title"].add_page_info($res['plink'], false, $preview, ($contact['fetch_further_information'] == 2), $contact['ffi_keyword_blacklist']);
                $res["title"] = "";
                $res["object-type"] = ACTIVITY_OBJ_BOOKMARK;
+               unset($res["attach"]);
        } elseif (isset($contact["network"]) AND ($contact["network"] == NETWORK_OSTATUS))
                $res["body"] = add_page_info_to_body($res["body"]);
        elseif (isset($contact["network"]) AND ($contact["network"] == NETWORK_FEED) AND strstr($res['plink'], ".app.net/")) {
@@ -888,12 +898,8 @@ function get_atom_elements($feed, $item, $contact = array()) {
        return $res;
 }
 
-function add_page_info($url, $no_photos = false, $photo = "") {
-       require_once("mod/parse_url.php");
-
-       $data = parseurl_getsiteinfo($url, true);
-
-       logger('add_page_info: fetch page info for '.$url.' '.print_r($data, true), LOGGER_DEBUG);
+function add_page_info_data($data) {
+       call_hooks('page_info_data', $data);
 
        // It maybe is a rich content, but if it does have everything that a link has,
        // then treat it that way
@@ -907,8 +913,14 @@ function add_page_info($url, $no_photos = false, $photo = "") {
        if ($no_photos AND ($data["type"] == "photo"))
                return("");
 
+       // If the link contains BBCode stuff, make a short link out of this to avoid parsing problems
+       if (strpos($data["url"], '[') OR strpos($data["url"], ']')) {
+               require_once("include/network.php");
+               $data["url"] = short_link($data["url"]);
+       }
+
        if (($data["type"] != "photo") AND is_string($data["title"]))
-               $text .= "[bookmark=".$url."]".trim($data["title"])."[/bookmark]";
+               $text .= "[bookmark=".$data["url"]."]".trim($data["title"])."[/bookmark]";
 
        if (($data["type"] != "video") AND ($photo != ""))
                $text .= '[img]'.$photo.'[/img]';
@@ -920,7 +932,51 @@ function add_page_info($url, $no_photos = false, $photo = "") {
        if (($data["type"] != "photo") AND is_string($data["text"]))
                $text .= "[quote]".$data["text"]."[/quote]";
 
-       return("\n[class=type-".$data["type"]."]".$text."[/class]");
+       $hashtags = "";
+       if (isset($data["keywords"]) AND count($data["keywords"])) {
+               $a = get_app();
+               $hashtags = "\n";
+               foreach ($data["keywords"] AS $keyword) {
+                       $hashtag = str_replace(array(" ", "+", "/", ".", "#", "'"),
+                                               array("","", "", "", "", ""), $keyword);
+                       $hashtags .= "#[url=".$a->get_baseurl()."/search?tag=".rawurlencode($hashtag)."]".$hashtag."[/url] ";
+               }
+       }
+
+       return("\n[class=type-".$data["type"]."]".$text."[/class]".$hashtags);
+}
+
+function add_page_info($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") {
+       require_once("mod/parse_url.php");
+
+       $data = Cache::get("parse_url:".$url);
+       if (is_null($data)){
+               $data = parseurl_getsiteinfo($url, true);
+               Cache::set("parse_url:".$url,serialize($data));
+       } else
+               $data = unserialize($data);
+
+       if ($photo != "")
+               $data["images"][0]["src"] = $photo;
+
+       logger('add_page_info: fetch page info for '.$url.' '.print_r($data, true), LOGGER_DEBUG);
+
+       if (!$keywords AND isset($data["keywords"]))
+               unset($data["keywords"]);
+
+       if (($keyword_blacklist != "") AND isset($data["keywords"])) {
+               $list = explode(",", $keyword_blacklist);
+               foreach ($list AS $keyword) {
+                       $keyword = trim($keyword);
+                       $index = array_search($keyword, $data["keywords"]);
+                       if ($index !== false)
+                               unset($data["keywords"][$index]);
+               }
+       }
+
+       $text = add_page_info_data($data);
+
+       return($text);
 }
 
 function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
@@ -989,7 +1045,7 @@ function encode_rel_links($links) {
 
 
 
-function item_store($arr,$force_parent = false, $notify = false) {
+function item_store($arr,$force_parent = false, $notify = false, $dontcache = false) {
 
        // If it is a posting where users should get notifications, then define it as wall posting
        if ($notify) {
@@ -1129,6 +1185,11 @@ function item_store($arr,$force_parent = false, $notify = false) {
        $arr['origin']        = ((x($arr,'origin'))        ? intval($arr['origin'])              : 0 );
        $arr['guid']          = ((x($arr,'guid'))          ? notags(trim($arr['guid']))          : get_guid(30));
        $arr['network']       = ((x($arr,'network'))       ? trim($arr['network'])               : '');
+       $arr['postopts']      = ((x($arr,'postopts'))      ? trim($arr['postopts'])              : '');
+       $arr['resource-id']   = ((x($arr,'resource-id'))   ? trim($arr['resource-id'])           : '');
+       $arr['event-id']      = ((x($arr,'event-id'))      ? intval($arr['event-id'])            : 0 );
+       $arr['inform']        = ((x($arr,'inform'))        ? trim($arr['inform'])                : '');
+       $arr['file']          = ((x($arr,'file'))          ? trim($arr['file'])                  : '');
 
        if ($arr['plink'] == "") {
                $a = get_app();
@@ -1283,6 +1344,22 @@ function item_store($arr,$force_parent = false, $notify = false) {
                $current_post = $r[0]['id'];
                logger('item_store: created item ' . $current_post);
 
+               // Add every contact to the global contact table
+               // Contacts from the statusnet connector are also added since you could add them in OStatus as well.
+               if (!$arr['private'] AND in_array($arr["network"],
+                       array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_STATUSNET, "")))
+                       poco_check($arr["author-link"], $arr["author-name"], $arr["author-avatar"], "", $arr["received"], $arr['contact-id'], $arr['uid']);
+
+               // Set "success_update" to the date of the last time we heard from this contact
+               // This can be used to filter for inactive contacts and poco.
+               // Only do this for public postings to avoid privacy problems, since poco data is public.
+               // Don't set this value if it isn't from the owner (could be an author that we don't know)
+               if (!$arr['private'] AND (($arr["author-link"] === $arr["owner-link"]) OR ($arr["parent-uri"] === $arr["uri"])))
+                       q("UPDATE `contact` SET `success_update` = '%s' WHERE `id` = %d",
+                               dbesc($arr['received']),
+                               intval($arr['contact-id'])
+                       );
+
                // Only check for notifications on start posts
                if ($arr['parent-uri'] === $arr['uri']) {
                        add_thread($r[0]['id']);
@@ -1409,7 +1486,7 @@ function item_store($arr,$force_parent = false, $notify = false) {
 
        // current post can be deleted if is for a communuty page and no mention are
        // in it.
-       if (!$deleted) {
+       if (!$deleted AND !$dontcache) {
 
                // Store the fresh generated item into the cache
                $cachefile = get_cachefile(urlencode($arr["guid"])."-".hash("md5", $arr['body']));
@@ -1431,7 +1508,7 @@ function item_store($arr,$force_parent = false, $notify = false) {
                }
        }
 
-       create_tags_from_item($current_post);
+       create_tags_from_item($current_post, $dontcache);
        create_files_from_item($current_post);
 
        if ($notify)
@@ -2577,45 +2654,80 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
 
                                // This is my contact on another system, but it's really me.
                                // Turn this into a wall post.
+                               $notify = item_is_remote_self($contact, $datarray);
 
-                               if($contact['remote_self']) {
-                                       if ($contact['remote_self'] == 2) {
-                                               $r = q("SELECT `id`,`url`,`name`,`photo`,`network` FROM `contact` WHERE `uid` = %d AND `self`", intval($importer['uid']));
-                                               if (count($r)) {
-                                                       $datarray['contact-id'] = $r[0]["id"];
+                               $r = item_store($datarray, false, $notify);
+                               logger('Stored - Contact '.$contact['url'].' Notify '.$notify.' return '.$r.' Item '.print_r($datarray, true), LOGGER_DEBUG);
+                               continue;
 
-                                                       $datarray['owner-name'] = $r[0]["name"];
-                                                       $datarray['owner-link'] = $r[0]["url"];
-                                                       $datarray['owner-avatar'] = $r[0]["photo"];
+                       }
+               }
+       }
+}
 
-                                                       $datarray['author-name']   = $datarray['owner-name'];
-                                                       $datarray['author-link']   = $datarray['owner-link'];
-                                                       $datarray['author-avatar'] = $datarray['owner-avatar'];
-                                               }
-                                       }
+function item_is_remote_self($contact, &$datarray) {
+       $a = get_app();
 
-                                       if (!isset($datarray["app"]) OR ($datarray["app"] == ""))
-                                               $datarray["app"] = network_to_name($contact['network']);
+       if (!$contact['remote_self'])
+               return false;
 
-                                       $notify = true;
-                                       if($contact['network'] === NETWORK_FEED) {
-                                               $datarray['private'] = 0;
-                                       }
-                               } else
-                                       $notify = false;
+       // Prevent the forwarding of posts that are forwarded
+       if ($datarray["extid"] == NETWORK_DFRN)
+               return false;
 
-                               $r = item_store($datarray, false, $notify);
-                               continue;
+       // Prevent to forward already forwarded posts
+       if ($datarray["app"] == $a->get_hostname())
+               return false;
 
-                       }
+       if (($contact['network'] != NETWORK_FEED) AND $datarray['private'])
+               return false;
+
+       $datarray2 = $datarray;
+       logger('remote-self start - Contact '.$contact['url'].' - '.$contact['remote_self'].' Item '.print_r($datarray, true), LOGGER_DEBUG);
+       if ($contact['remote_self'] == 2) {
+               $r = q("SELECT `id`,`url`,`name`,`thumb` FROM `contact` WHERE `uid` = %d AND `self`",
+                       intval($contact['uid']));
+               if (count($r)) {
+                       $datarray['contact-id'] = $r[0]["id"];
+
+                       $datarray['owner-name'] = $r[0]["name"];
+                       $datarray['owner-link'] = $r[0]["url"];
+                       $datarray['owner-avatar'] = $r[0]["thumb"];
+
+                       $datarray['author-name']   = $datarray['owner-name'];
+                       $datarray['author-link']   = $datarray['owner-link'];
+                       $datarray['author-avatar'] = $datarray['owner-avatar'];
                }
+
+               if ($contact['network'] != NETWORK_FEED) {
+                       $datarray["guid"] = get_guid(32);
+                       unset($datarray["plink"]);
+                       $datarray["uri"] = item_new_uri($a->get_hostname(),$contact['uid']);
+                       $datarray["parent-uri"] = $datarray["uri"];
+                       $datarray["extid"] = $contact['network'];
+                       $urlpart = parse_url($datarray2['author-link']);
+                       $datarray["app"] = $urlpart["host"];
+               } else
+                       $datarray['private'] = 0;
        }
+
+       //if (!isset($datarray["app"]) OR ($datarray["app"] == ""))
+       //      $datarray["app"] = network_to_name($contact['network']);
+
+       if ($contact['network'] != NETWORK_FEED) {
+               // Store the original post
+               $r = item_store($datarray2, false, false);
+               logger('remote-self post original item - Contact '.$contact['url'].' return '.$r.' Item '.print_r($datarray2, true), LOGGER_DEBUG);
+       } else
+               $datarray["app"] = "Feed";
+
+       return true;
 }
 
 function local_delivery($importer,$data) {
        $a = get_app();
 
-    logger(__function__, LOGGER_TRACE);
+       logger(__function__, LOGGER_TRACE);
 
        if($importer['readonly']) {
                // We aren't receiving stuff from this person. But we will quietly ignore them
@@ -3693,27 +3805,7 @@ function local_delivery($importer,$data) {
 
                        // This is my contact on another system, but it's really me.
                        // Turn this into a wall post.
-
-                       if($importer['remote_self']) {
-                               if ($importer['remote_self'] == 2) {
-                                       $r = q("SELECT `id`,`url`,`name`,`photo`,`network` FROM `contact` WHERE `uid` = %d AND `self`",
-                                               intval($importer['importer_uid']));
-                                       if (count($r)) {
-                                               $datarray['contact-id'] = $r[0]["id"];
-
-                                               $datarray['owner-name'] = $r[0]["name"];
-                                               $datarray['owner-link'] = $r[0]["url"];
-                                               $datarray['owner-avatar'] = $r[0]["photo"];
-
-                                               $datarray['author-name']   = $datarray['owner-name'];
-                                               $datarray['author-link']   = $datarray['owner-link'];
-                                               $datarray['author-avatar'] = $datarray['owner-avatar'];
-                                       }
-                               }
-
-                               $notify = true;
-                       } else
-                               $notify = false;
+                       $notify = item_is_remote_self($importer, $datarray);
 
                        $posted_id = item_store($datarray, false, $notify);