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) {
}
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/")) {
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
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]';
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) {
-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) {
$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();
$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']);
// 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']));
}
}
- create_tags_from_item($current_post);
+ create_tags_from_item($current_post, $dontcache);
create_files_from_item($current_post);
if ($notify)
// 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
// 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);