diff --git a/include/dfrn.php b/include/dfrn.php index eb0f9fbb4e..55c51cb011 100644 --- a/include/dfrn.php +++ b/include/dfrn.php @@ -289,10 +289,17 @@ class dfrn { * @brief Generate an atom entry for a given item id * * @param int $item_id The item id + * @param boolean $conversation Show the conversation. If false show the single post. * * @return string DFRN feed entry */ - public static function itemFeed($item_id) { + public static function itemFeed($item_id, $conversation = false) { + if ($conversation) { + $condition = '`item`.`parent`'; + } else { + $condition = '`item`.`id`'; + } + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`, `contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`, @@ -302,8 +309,9 @@ class dfrn { STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND (NOT `contact`.`blocked` OR `contact`.`pending`) LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` - WHERE `item`.`id` = %d AND `item`.`visible` AND NOT `item`.`moderated` AND `item`.`parent` != 0 + WHERE %s = %d AND `item`.`visible` AND NOT `item`.`moderated` AND `item`.`parent` != 0 AND NOT `item`.`private`", + $condition, intval($item_id) ); @@ -311,6 +319,7 @@ class dfrn { killme(); } + $items = $r; $item = $r[0]; $r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`, `user`.`account-type` @@ -327,12 +336,31 @@ class dfrn { $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - - $alternatelink = $owner['url']; - $type = 'html'; - $root = self::entry($doc, $type, $item, $owner, true, 0, true); + if ($conversation) { + $root = $doc->createElementNS(NAMESPACE_ATOM1, 'feed'); + $doc->appendChild($root); + + $root->setAttribute("xmlns:thr", NAMESPACE_THREAD); + $root->setAttribute("xmlns:at", NAMESPACE_TOMB); + $root->setAttribute("xmlns:media", NAMESPACE_MEDIA); + $root->setAttribute("xmlns:dfrn", NAMESPACE_DFRN); + $root->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY); + $root->setAttribute("xmlns:georss", NAMESPACE_GEORSS); + $root->setAttribute("xmlns:poco", NAMESPACE_POCO); + $root->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS); + $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET); + + //$root = self::add_header($doc, $owner, "dfrn:owner", "", false); + + foreach ($items as $item) { + $entry = self::entry($doc, $type, $item, $owner, true, 0); + $root->appendChild($entry); + } + } else { + $root = self::entry($doc, $type, $item, $owner, true, 0, true); + } $atom = trim($doc->saveXML()); return $atom; diff --git a/mod/display.php b/mod/display.php index 1ecff36182..bdb32e9de9 100644 --- a/mod/display.php +++ b/mod/display.php @@ -17,7 +17,14 @@ function display_init(App $a) { if ($a->argc == 3) { if (substr($a->argv[2], -5) == '.atom') { $item_id = substr($a->argv[2], 0, -5); - displayShowFeed($item_id); + displayShowFeed($item_id, false); + } + } + + if ($a->argc == 4) { + if ($a->argv[3] == 'conversation.atom') { + $item_id = $a->argv[2]; + displayShowFeed($item_id, true); } } @@ -66,7 +73,7 @@ function display_init(App $a) { if (strstr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) { logger('Directly serving XML for id '.$r["id"], LOGGER_DEBUG); - displayShowFeed($r["id"]); + displayShowFeed($r["id"], false); } if ($r["id"] != $r["parent"]) { @@ -219,17 +226,18 @@ function display_content(App $a, $update = 0) { $nick = ""; if (local_user()) { - $r = dba::fetch_first("SELECT `id` FROM `item` + $r = dba::fetch_first("SELECT `id`, `parent` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `guid` = ? AND `uid` = ?", $a->argv[1], local_user()); if (dbm::is_result($r)) { $item_id = $r["id"]; + $item_parent = $r["parent"]; $nick = $a->user["nickname"]; } } if ($nick == "") { - $r = dba::fetch_first("SELECT `user`.`nickname`, `item`.`id` FROM `item` STRAIGHT_JOIN `user` ON `user`.`uid` = `item`.`uid` + $r = dba::fetch_first("SELECT `user`.`nickname`, `item`.`id`, `item`.`parent` FROM `item` STRAIGHT_JOIN `user` ON `user`.`uid` = `item`.`uid` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' @@ -237,11 +245,12 @@ function display_content(App $a, $update = 0) { AND `item`.`guid` = ?", $a->argv[1]); if (dbm::is_result($r)) { $item_id = $r["id"]; + $item_parent = $r["parent"]; $nick = $r["nickname"]; } } if ($nick == "") { - $r = dba::fetch_first("SELECT `item`.`id` FROM `item` + $r = dba::fetch_first("SELECT `item`.`id`, `item`.`parent` FROM `item` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' @@ -249,15 +258,17 @@ function display_content(App $a, $update = 0) { AND `item`.`guid` = ?", $a->argv[1]); if (dbm::is_result($r)) { $item_id = $r["id"]; + $item_parent = $r["parent"]; } } } } if ($item_id && !is_numeric($item_id)) { - $r = dba::select('item', array('id'), array('uri' => $item_id, 'uid' => $a->profile['uid']), array('limit' => 1)); + $r = dba::select('item', array('id', 'parent'), array('uri' => $item_id, 'uid' => $a->profile['uid']), array('limit' => 1)); if (dbm::is_result($r)) { $item_id = $r["id"]; + $item_parent = $r["parent"]; } else { $item_id = false; } @@ -273,12 +284,15 @@ function display_content(App $a, $update = 0) { $is_public = dba::exists('item', array('id' => $item_id, 'private' => false)); if ($is_public) { $alternate = System::baseUrl().'/display/'.$nick.'/'.$item_id.'.atom'; + $conversation = System::baseUrl().'/display/'.$nick.'/'.$item_parent.'/conversation.atom'; } else { $alternate = ''; + $conversation = ''; } $a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), - array('$alternate' => $alternate)); + array('$alternate' => $alternate, + '$conversation' => $conversation)); $groups = array(); @@ -476,8 +490,8 @@ function display_content(App $a, $update = 0) { return $o; } -function displayShowFeed($item_id) { - $xml = dfrn::itemFeed($item_id); +function displayShowFeed($item_id, $conversation) { + $xml = dfrn::itemFeed($item_id, $conversation); if ($xml == '') { http_status_exit(500); } diff --git a/view/templates/display-head.tpl b/view/templates/display-head.tpl index dda8162146..b0f0a828e7 100644 --- a/view/templates/display-head.tpl +++ b/view/templates/display-head.tpl @@ -1,4 +1,9 @@ -{{if $alternate}}{{/if}} +{{if $alternate}} + +{{/if}} +{{if $conversation}} + +{{/if}}