Merge pull request #3803 from annando/conversation-feed
we now provide a feed for the conversation
This commit is contained in:
commit
edb16f8dc8
3 changed files with 63 additions and 16 deletions
|
@ -289,10 +289,17 @@ class dfrn {
|
||||||
* @brief Generate an atom entry for a given item id
|
* @brief Generate an atom entry for a given item id
|
||||||
*
|
*
|
||||||
* @param int $item_id The 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
|
* @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`,
|
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
|
||||||
`contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`,
|
`contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`,
|
||||||
`contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`,
|
`contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`,
|
||||||
|
@ -302,8 +309,9 @@ class dfrn {
|
||||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
|
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
|
||||||
AND (NOT `contact`.`blocked` OR `contact`.`pending`)
|
AND (NOT `contact`.`blocked` OR `contact`.`pending`)
|
||||||
LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`
|
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`",
|
AND NOT `item`.`private`",
|
||||||
|
$condition,
|
||||||
intval($item_id)
|
intval($item_id)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -311,6 +319,7 @@ class dfrn {
|
||||||
killme();
|
killme();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$items = $r;
|
||||||
$item = $r[0];
|
$item = $r[0];
|
||||||
|
|
||||||
$r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`, `user`.`account-type`
|
$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 = new DOMDocument('1.0', 'utf-8');
|
||||||
$doc->formatOutput = true;
|
$doc->formatOutput = true;
|
||||||
|
|
||||||
$alternatelink = $owner['url'];
|
|
||||||
|
|
||||||
$type = 'html';
|
$type = 'html';
|
||||||
|
|
||||||
|
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);
|
$root = self::entry($doc, $type, $item, $owner, true, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
$atom = trim($doc->saveXML());
|
$atom = trim($doc->saveXML());
|
||||||
return $atom;
|
return $atom;
|
||||||
|
|
|
@ -17,7 +17,14 @@ function display_init(App $a) {
|
||||||
if ($a->argc == 3) {
|
if ($a->argc == 3) {
|
||||||
if (substr($a->argv[2], -5) == '.atom') {
|
if (substr($a->argv[2], -5) == '.atom') {
|
||||||
$item_id = substr($a->argv[2], 0, -5);
|
$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')) {
|
if (strstr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) {
|
||||||
logger('Directly serving XML for id '.$r["id"], LOGGER_DEBUG);
|
logger('Directly serving XML for id '.$r["id"], LOGGER_DEBUG);
|
||||||
displayShowFeed($r["id"]);
|
displayShowFeed($r["id"], false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($r["id"] != $r["parent"]) {
|
if ($r["id"] != $r["parent"]) {
|
||||||
|
@ -219,17 +226,18 @@ function display_content(App $a, $update = 0) {
|
||||||
$nick = "";
|
$nick = "";
|
||||||
|
|
||||||
if (local_user()) {
|
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`
|
WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`
|
||||||
AND `guid` = ? AND `uid` = ?", $a->argv[1], local_user());
|
AND `guid` = ? AND `uid` = ?", $a->argv[1], local_user());
|
||||||
if (dbm::is_result($r)) {
|
if (dbm::is_result($r)) {
|
||||||
$item_id = $r["id"];
|
$item_id = $r["id"];
|
||||||
|
$item_parent = $r["parent"];
|
||||||
$nick = $a->user["nickname"];
|
$nick = $a->user["nickname"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($nick == "") {
|
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`
|
WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`
|
||||||
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
|
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
|
||||||
AND `item`.`deny_cid` = '' AND `item`.`deny_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]);
|
AND `item`.`guid` = ?", $a->argv[1]);
|
||||||
if (dbm::is_result($r)) {
|
if (dbm::is_result($r)) {
|
||||||
$item_id = $r["id"];
|
$item_id = $r["id"];
|
||||||
|
$item_parent = $r["parent"];
|
||||||
$nick = $r["nickname"];
|
$nick = $r["nickname"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($nick == "") {
|
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`
|
WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`
|
||||||
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
|
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
|
||||||
AND `item`.`deny_cid` = '' AND `item`.`deny_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]);
|
AND `item`.`guid` = ?", $a->argv[1]);
|
||||||
if (dbm::is_result($r)) {
|
if (dbm::is_result($r)) {
|
||||||
$item_id = $r["id"];
|
$item_id = $r["id"];
|
||||||
|
$item_parent = $r["parent"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($item_id && !is_numeric($item_id)) {
|
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)) {
|
if (dbm::is_result($r)) {
|
||||||
$item_id = $r["id"];
|
$item_id = $r["id"];
|
||||||
|
$item_parent = $r["parent"];
|
||||||
} else {
|
} else {
|
||||||
$item_id = false;
|
$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));
|
$is_public = dba::exists('item', array('id' => $item_id, 'private' => false));
|
||||||
if ($is_public) {
|
if ($is_public) {
|
||||||
$alternate = System::baseUrl().'/display/'.$nick.'/'.$item_id.'.atom';
|
$alternate = System::baseUrl().'/display/'.$nick.'/'.$item_id.'.atom';
|
||||||
|
$conversation = System::baseUrl().'/display/'.$nick.'/'.$item_parent.'/conversation.atom';
|
||||||
} else {
|
} else {
|
||||||
$alternate = '';
|
$alternate = '';
|
||||||
|
$conversation = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'),
|
$a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'),
|
||||||
array('$alternate' => $alternate));
|
array('$alternate' => $alternate,
|
||||||
|
'$conversation' => $conversation));
|
||||||
|
|
||||||
$groups = array();
|
$groups = array();
|
||||||
|
|
||||||
|
@ -476,8 +490,8 @@ function display_content(App $a, $update = 0) {
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayShowFeed($item_id) {
|
function displayShowFeed($item_id, $conversation) {
|
||||||
$xml = dfrn::itemFeed($item_id);
|
$xml = dfrn::itemFeed($item_id, $conversation);
|
||||||
if ($xml == '') {
|
if ($xml == '') {
|
||||||
http_status_exit(500);
|
http_status_exit(500);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
{{if $alternate}}<link href='{{$alternate}}' rel='alternate' type='application/atom+xml'>{{/if}}
|
{{if $alternate}}
|
||||||
|
<link href='{{$alternate}}' rel='alternate' type='application/atom+xml'>
|
||||||
|
{{/if}}
|
||||||
|
{{if $conversation}}
|
||||||
|
<link href='{{$conversation}}' rel='conversation' type='application/atom+xml'>
|
||||||
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$(".comment-edit-wrapper textarea").editor_autocomplete(baseurl+"/acl");
|
$(".comment-edit-wrapper textarea").editor_autocomplete(baseurl+"/acl");
|
||||||
|
|
Loading…
Reference in a new issue