]> git.mxchange.org Git - friendica.git/commitdiff
New function to complete threads from ostatus postings
authorMichael Vogel <icarus@dabo.de>
Sun, 27 Jan 2013 22:25:04 +0000 (23:25 +0100)
committerMichael Vogel <icarus@dabo.de>
Sun, 27 Jan 2013 22:25:04 +0000 (23:25 +0100)
boot.php
include/items.php
include/ostatus_conversation.php [new file with mode: 0644]
include/plugin.php
object/Item.php

index da8ee8efa8936128bd9e361cd37f6accc5c14188..fa968ce42e90e0aee973cdaefffcc843be15ab01 100644 (file)
--- 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 );
index 1a50ac204af9bf234b995cb4006aeaf761c9be7d..94835d7ad1443dc368cbc3517fce8d74ef12b361 100755 (executable)
@@ -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 (file)
index 0000000..a566733
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+require_once("boot.php");
+if(@is_null($a)) {
+        $a = new App;
+}
+
+if(is_null($db)) {
+        @include(".htconfig.php");
+        require_once("dba.php");
+        $db = new dba($db_host, $db_user, $db_pass, $db_data);
+        unset($db_host, $db_user, $db_pass, $db_data);
+};
+
+function complete_conversation($itemid, $conversation_url) {
+       global $a;
+
+       require_once('include/html2bbcode.php');
+       require_once('include/items.php');
+
+       $messages = q("SELECT `uid`, `parent` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid));
+       if (!$messages)
+               return;
+       $message = $messages[0];
+
+       // Get the parent
+       $parents = q("SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+                       intval($message["uid"]), intval($message["parent"]));
+       if (!$parents)
+               return;
+       $parent = $parents[0];
+
+       // Store conversation url if not done before
+       $conversation = q("SELECT `url` FROM `term` WHERE `uid` = %d AND `oid` = %d AND `otype` = %d AND `type` = %d",
+               intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION));
+
+       if (!$conversation)
+               $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`) VALUES (%d, %d, %d, %d, '%s', '%s')",
+                       intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_CONVERSATION), '', dbesc($conversation_url));
+
+       $conv = str_replace("/conversation/", "/api/statusnet/conversation/", $conversation_url).".as";
+
+       $conv_as = fetch_url($conv);
+
+       if ($conv_as) {
+               $conv_as = str_replace(',"statusnet:notice_info":', ',"statusnet_notice_info":', $conv_as);
+               $conv_as = json_decode($conv_as);
+
+               $items = array_reverse($conv_as->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);
+?>
index 7a4a96670d66a7c953a81b2972b8089aef2b2960..12c29d1a6e09f7cabe5ca35b06c8293fa7b43b41 100644 (file)
@@ -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) {
                        }
                }
        }
-
 }}
 
 
index 18281e9bcba1379a2c58e98ae729dbdf68aa56b6..aa582875324ea6c5f73455cb9c752b79730a0e8e 100644 (file)
@@ -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' : '');