From bc972e16ce513fd610615d190046cd43e01fb92d Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 27 Jan 2013 23:25:04 +0100 Subject: [PATCH] New function to complete threads from ostatus postings --- boot.php | 1 + include/items.php | 34 ++++++++-- include/ostatus_conversation.php | 112 +++++++++++++++++++++++++++++++ include/plugin.php | 3 +- object/Item.php | 16 ++--- 5 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 include/ostatus_conversation.php diff --git a/boot.php b/boot.php index da8ee8efa8..fa968ce42e 100644 --- a/boot.php +++ b/boot.php @@ -208,6 +208,7 @@ define ( 'TERM_CATEGORY', 3 ); define ( 'TERM_PCATEGORY', 4 ); define ( 'TERM_FILE', 5 ); define ( 'TERM_SAVEDSEARCH', 6 ); +define ( 'TERM_CONVERSATION', 7 ); define ( 'TERM_OBJ_POST', 1 ); define ( 'TERM_OBJ_PHOTO', 2 ); diff --git a/include/items.php b/include/items.php index 1a50ac204a..94835d7ad1 100755 --- a/include/items.php +++ b/include/items.php @@ -831,15 +831,28 @@ function get_atom_elements($feed,$item) { } } + // Search for ostatus conversation url + $links = $item->feed->data["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["feed"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["entry"][0]["child"]["http://www.w3.org/2005/Atom"]["link"]; + + foreach ($links as $link) { + $conversation = array_shift($link["attribs"]); + + if ($conversation["rel"] == "ostatus:conversation") { + $res["ostatus_conversation"] = $conversation["href"]; + logger('get_atom_elements: found conversation url '.$res["ostatus_conversation"]); + } + }; + $arr = array('feed' => $feed, 'item' => $item, 'result' => $res); call_hooks('parse_atom', $arr); //if (($res["title"] != "") or (strpos($res["body"], "RT @") > 0)) { //if (strpos($res["body"], "RT @") !== false) { - // $debugfile = tempnam("/home/ike/log", "item-res2-"); - // file_put_contents($debugfile, serialize($arr)); - //} + /*if (strpos($res["body"], "@") !== false) { + $debugfile = tempnam("/var/www/virtual/pirati.ca/phptmp/", "item-res2-"); + file_put_contents($debugfile, serialize($arr)); + }*/ return $res; } @@ -878,6 +891,15 @@ function item_store($arr,$force_parent = false) { unset($arr['dsprsig']); } + // if an OStatus conversation url was passed in, it is stored and then + // removed from the array. + $ostatus_conversation = null; + + if (isset($arr["ostatus_conversation"])) { + $ostatus_conversation = $arr["ostatus_conversation"]; + unset($arr["ostatus_conversation"]); + } + if(x($arr, 'gravity')) $arr['gravity'] = intval($arr['gravity']); elseif($arr['parent-uri'] === $arr['uri']) @@ -969,9 +991,9 @@ function item_store($arr,$force_parent = false) { $deny_cid = $arr['deny_cid']; $deny_gid = $arr['deny_gid']; } - else { + else { - // find the parent and snarf the item id and ACL's + // find the parent and snarf the item id and ACLs // and anything else we need to inherit $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1", @@ -1076,6 +1098,7 @@ function item_store($arr,$force_parent = false) { $current_post = $r[0]['id']; logger('item_store: created item ' . $current_post); create_tags_from_item($r[0]['id']); + // ostatus_conversation } else { logger('item_store: could not locate created item'); return 0; @@ -1159,6 +1182,7 @@ function item_store($arr,$force_parent = false) { if (($cachefile != '') AND !file_exists($cachefile)) { $s = prepare_text($arr['body']); + $a = get_app(); $stamp1 = microtime(true); file_put_contents($cachefile, $s); $a->save_timestamp($stamp1, "file"); diff --git a/include/ostatus_conversation.php b/include/ostatus_conversation.php new file mode 100644 index 0000000000..a566733905 --- /dev/null +++ b/include/ostatus_conversation.php @@ -0,0 +1,112 @@ +items); + + foreach ($items as $single_conv) { + //print_r($single_conv); + + if (isset($single_conv->context->inReplyTo->id)) + $parent_uri = $single_conv->context->inReplyTo->id; + else + $parent_uri = $parent["uri"]; + + $message_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1", + intval($message["uid"]), dbesc($single_conv->id)); + if ($message_exists) { + $existing_message = $message_exists[0]; + $r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s', `thr-parent` = '%s' WHERE `id` = %d LIMIT 1", + intval($parent["id"]), + dbesc($parent["uri"]), + dbesc($parent_uri), + intval($existing_message["id"])); + continue; + } + + $arr = array(); + $arr["uri"] = $single_conv->id; + $arr["uid"] = $message["uid"]; + $arr["contact-id"] = $parent["contact-id"]; // To-Do + $arr["parent"] = $parent["id"]; + $arr["parent-uri"] = $parent["uri"]; + $arr["thr-parent"] = $parent_uri; + $arr["created"] = $single_conv->published; + $arr["edited"] = $single_conv->published; + $arr["owner-name"] = $single_conv->actor->contact->displayName; + //$arr["owner-name"] = $single_conv->actor->contact->preferredUsername; + $arr["owner-link"] = $single_conv->actor->id; + $arr["owner-avatar"] = $single_conv->actor->image->url; + $arr["author-name"] = $single_conv->actor->contact->displayName; + //$arr["author-name"] = $single_conv->actor->contact->preferredUsername; + $arr["author-link"] = $single_conv->actor->id; + $arr["author-avatar"] = $single_conv->actor->image->url; + $arr["body"] = html2bbcode($single_conv->content); + $arr["app"] = strip_tags($single_conv->statusnet_notice_info->source); + if ($arr["app"] == "") + $arr["app"] = $single_conv->provider->displayName; + $arr["verb"] = $parent["verb"]; + $arr["visible"] = $parent["visible"]; + $arr["location"] = $single_conv->location->displayName; + $arr["coord"] = trim($single_conv->location->lat." ".$single_conv->location->lon); + + if ($arr["location"] == "") + unset($arr["location"]); + + if ($arr["coord"] == "") + unset($arr["coord"]); + + item_store($arr); + //print_r($arr); + } + } +} + +$id = 282481; +$conversation = "http://identi.ca/conversation/98268580"; + +complete_conversation($id, $conversation); +?> diff --git a/include/plugin.php b/include/plugin.php index 7a4a96670d..12c29d1a6e 100644 --- a/include/plugin.php +++ b/include/plugin.php @@ -158,6 +158,8 @@ function load_hooks() { if(! function_exists('call_hooks')) { function call_hooks($name, &$data = null) { + $stamp1 = microtime(true); + $a = get_app(); if((is_array($a->hooks)) && (array_key_exists($name,$a->hooks))) { @@ -177,7 +179,6 @@ function call_hooks($name, &$data = null) { } } } - }} diff --git a/object/Item.php b/object/Item.php index 18281e9bcb..aa58287532 100644 --- a/object/Item.php +++ b/object/Item.php @@ -190,10 +190,10 @@ class Item extends BaseObject { * Maybe we should establish a way to be notified about conversation changes */ $this->check_wall_to_wall(); - + if($this->is_wall_to_wall() && ($this->get_owner_url() == $this->get_redirect_url())) $osparkle = ' sparkle'; - + if($this->is_toplevel()) { if($conv->get_profile_owner() == local_user()) { $isstarred = (($item['starred']) ? "starred" : "unstarred"); @@ -283,14 +283,14 @@ class Item extends BaseObject { 'type' => implode("",array_slice(explode("/",$item['verb']),-1)), 'tags' => $tags, - 'hashtags' => $hashtags, - 'mentions' => $mentions, + 'hashtags' => $hashtags, + 'mentions' => $mentions, 'txt_cats' => t('Categories:'), 'txt_folders' => t('Filed under:'), 'has_cats' => ((count($categories)) ? 'true' : ''), 'has_folders' => ((count($folders)) ? 'true' : ''), - 'categories' => $categories, - 'folders' => $folders, + 'categories' => $categories, + 'folders' => $folders, 'body' => $body_e, 'text' => $text_e, 'id' => $this->get_id(), @@ -361,12 +361,12 @@ class Item extends BaseObject { } } } - + if ($this->is_toplevel()) { $result['total_comments_num'] = "$total_children"; $result['total_comments_text'] = tt('comment', 'comments', $total_children); } - + $result['private'] = $item['private']; $result['toplevel'] = ($this->is_toplevel() ? 'toplevel_item' : '');