X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fitems.php;h=e8fc739cd0852839c5011cb4ec7a34de2ea25824;hb=e3b6770ad4b452841da25d5275ae8e2fbcb5b148;hp=5b275593576f82de68aa9902f1764347af05000e;hpb=fd61391e3eb9934955922d35aabecfc267c701a3;p=friendica.git diff --git a/include/items.php b/include/items.php index 5b27559357..e8fc739cd0 100644 --- a/include/items.php +++ b/include/items.php @@ -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,19 @@ 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'], false, "", ($contact['fetch_further_information'] == 2), $contact['ffi_keyword_blacklist']); + $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["tag"] = add_page_keywords($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/")) { @@ -903,6 +914,12 @@ function add_page_info_data($data) { 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=".$data["url"]."]".trim($data["title"])."[/bookmark]"; @@ -930,12 +947,20 @@ function add_page_info_data($data) { return("\n[class=type-".$data["type"]."]".$text."[/class]".$hashtags); } -function add_page_info($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") { +function query_page_info($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") { require_once("mod/parse_url.php"); - $data = parseurl_getsiteinfo($url, true); + $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); + logger('fetch page info for '.$url.' '.print_r($data, true), LOGGER_DEBUG); if (!$keywords AND isset($data["keywords"])) unset($data["keywords"]); @@ -950,6 +975,32 @@ function add_page_info($url, $no_photos = false, $photo = "", $keywords = false, } } + return($data); +} + +function add_page_keywords($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") { + $data = query_page_info($url, $no_photos, $photo, $keywords, $keyword_blacklist); + + $tags = ""; + if (isset($data["keywords"]) AND count($data["keywords"])) { + $a = get_app(); + foreach ($data["keywords"] AS $keyword) { + $hashtag = str_replace(array(" ", "+", "/", ".", "#", "'"), + array("","", "", "", "", ""), $keyword); + + if ($tags != "") + $tags .= ","; + + $tags .= "#[url=".$a->get_baseurl()."/search?tag=".rawurlencode($hashtag)."]".$hashtag."[/url]"; + } + } + + return($tags); +} + +function add_page_info($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") { + $data = query_page_info($url, $no_photos, $photo, $keywords, $keyword_blacklist); + $text = add_page_info_data($data); return($text); @@ -1021,7 +1072,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) { @@ -1299,6 +1350,9 @@ function item_store($arr,$force_parent = false, $notify = false) { return 0; } + // Store the unescaped version + $unescaped = $arr; + dbesc_array($arr); logger('item_store: ' . print_r($arr,true), LOGGER_DATA); @@ -1309,10 +1363,12 @@ function item_store($arr,$force_parent = false, $notify = false) { . implode("', '", array_values($arr)) . "')" ); - // find the item we just created + // And restore it + $arr = $unescaped; + // find the item we just created $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC ", - $arr['uri'], // already dbesc'd + dbesc($arr['uri']), intval($arr['uid']) ); @@ -1320,6 +1376,26 @@ 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["network"], $arr["author-avatar"], "", "", "", "", "", $arr["received"], $arr["contact-id"], $arr["uid"]); + + // Maybe its a body with a shared item? Then extract a global contact from it. + poco_contact_from_body($arr["body"], $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']); @@ -1370,7 +1446,7 @@ function item_store($arr,$force_parent = false, $notify = false) { if(count($r) > 1) { logger('item_store: duplicated post occurred. Removing duplicates.'); q("DELETE FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `id` != %d ", - $arr['uri'], + dbesc($arr['uri']), intval($arr['uid']), intval($current_post) ); @@ -1446,7 +1522,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'])); @@ -1468,7 +1544,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) @@ -2017,9 +2093,16 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) { $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']; $new_name = $elems['name'][0]['data']; + + // Manually checking for changed contact names + if (($new_name != $contact['name']) AND ($new_name != "") AND ($name_updated <= $contact['name-date'])) { + $name_updated = date("c"); + $photo_timestamp = date("c"); + } } if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) { - $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']); + if ($photo_timestamp == "") + $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']); $photo_url = $elems['link'][0]['attribs']['']['href']; } @@ -2639,20 +2722,24 @@ function item_is_remote_self($contact, &$datarray) { if ($datarray["app"] == $a->get_hostname()) return false; + // Only forward posts + if ($datarray["verb"] != ACTIVITY_POST) + 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`,`photo`,`network` FROM `contact` WHERE `uid` = %d AND `self`", + $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]["avatar"]; + $datarray['owner-avatar'] = $r[0]["thumb"]; $datarray['author-name'] = $datarray['owner-name']; $datarray['author-link'] = $datarray['owner-link']; @@ -2732,9 +2819,16 @@ function local_delivery($importer,$data) { if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) { $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']; $new_name = $elems['name'][0]['data']; + + // Manually checking for changed contact names + if (($new_name != $importer['name']) AND ($new_name != "") AND ($name_updated <= $importer['name-date'])) { + $name_updated = date("c"); + $photo_timestamp = date("c"); + } } if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) { - $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']); + if ($photo_timestamp == "") + $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']); $photo_url = $elems['link'][0]['attribs']['']['href']; } } @@ -2861,6 +2955,7 @@ function local_delivery($importer,$data) { thumb = '%s', micro = '%s', url = '%s', + nurl = '%s', request = '%s', confirm = '%s', notify = '%s', @@ -2872,6 +2967,7 @@ function local_delivery($importer,$data) { dbesc($newloc['thumb']), dbesc($newloc['micro']), dbesc($newloc['url']), + dbesc(normalise_link($newloc['url'])), dbesc($newloc['request']), dbesc($newloc['confirm']), dbesc($newloc['notify']), @@ -4031,6 +4127,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) { else $body = $item['body']; + $o = "\r\n\r\n\r\n"; if(is_array($author)) @@ -4045,13 +4142,22 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) { $o .= '' . "\r\n"; } + $htmlbody = $body; + + if ($item['title'] != "") + $htmlbody = "[b]".$item['title']."[/b]\n\n".$htmlbody; + + $htmlbody = bbcode(bb_remove_share_information($htmlbody), false, false, 7); + $o .= '' . xmlify($item['uri']) . '' . "\r\n"; $o .= '' . xmlify($item['title']) . '' . "\r\n"; $o .= '' . xmlify(datetime_convert('UTC','UTC',$item['created'] . '+00:00',ATOM_TIME)) . '' . "\r\n"; $o .= '' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '' . "\r\n"; $o .= '' . base64url_encode($body, true) . '' . "\r\n"; - $o .= '' . xmlify((($type === 'html') ? bbcode($body) : $body)) . '' . "\r\n"; + $o .= '' . xmlify((($type === 'html') ? $htmlbody : $body)) . '' . "\r\n"; $o .= '' . "\r\n"; + + if($comment) $o .= '' . intval($item['last-child']) . '' . "\r\n"; @@ -4469,7 +4575,7 @@ function drop_item($id,$interactive = true) { ); create_tags_from_item($item['id']); create_files_from_item($item['id']); - delete_thread($item['id']); + delete_thread($item['id'], $item['parent-uri']); // clean up categories and tags so they don't end up as orphans