]> git.mxchange.org Git - friendica.git/blobdiff - include/items.php
Merge pull request #35 from fabrixxm/master
[friendica.git] / include / items.php
index 2c23c6f1bdb7928b7bb2ed62ab30e44afbc52348..a12cdd911cfb91dd178c2546dfda3183ebd4bbaa 100644 (file)
@@ -617,7 +617,7 @@ function get_atom_elements($feed,$item) {
                        if(! $body)
                                $body = $rawobj[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['summary'][0]['data'];
                        // preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events
-                       $res['object'] .= '<orig>' . xmlify($body) . '</orig>' . "\n";
+                       $res['target'] .= '<orig>' . xmlify($body) . '</orig>' . "\n";
                        if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
 
                                $body = html2bb_video($body);
@@ -730,6 +730,7 @@ function item_store($arr,$force_parent = false) {
        $arr['tag']           = ((x($arr,'tag'))           ? notags(trim($arr['tag']))           : '');
        $arr['attach']        = ((x($arr,'attach'))        ? notags(trim($arr['attach']))        : '');
        $arr['app']           = ((x($arr,'app'))           ? notags(trim($arr['app']))           : '');
+       $arr['origin']        = ((x($arr,'origin'))        ? intval($arr['origin'])              : 0 );
        $arr['guid']          = ((x($arr,'guid'))          ? notags(trim($arr['guid']))          : get_guid());
 
        if($arr['parent-uri'] === $arr['uri']) {
@@ -818,18 +819,10 @@ function item_store($arr,$force_parent = false) {
 
        // find the item we just created
 
-       $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 ORDER BY `id` ASC",
+       $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
                $arr['uri'],           // already dbesc'd
                intval($arr['uid'])
        );
-       if(! count($r)) {
-               // This is not good, but perhaps we encountered a rare race/cache condition, so back off and try again. 
-               sleep(3);
-               $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 ORDER BY `id` ASC",
-                       $arr['uri'],           // already dbesc'd
-                       intval($arr['uid'])
-               );
-       }
 
        if(count($r)) {
                $current_post = $r[0]['id'];
@@ -1270,7 +1263,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                        $when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
                        }
                        if($deleted && is_array($contact)) {
-                               $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `contact-id` = %d LIMIT 1",
+                               $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join `contact` on `item`.`contact-id` = `contact`.id` 
+                                       WHERE `uri` = '%s' AND `uid` = %d AND `contact-id` = %d LIMIT 1",
                                        dbesc($uri),
                                        intval($importer['uid']),
                                        intval($contact['id'])
@@ -1281,6 +1275,41 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                        if(! $item['deleted'])
                                                logger('consume_feed: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
 
+                                       if(($item['verb'] === ACTIVITY_TAG) && ($item['object-type'] === ACTVITY_OBJ_TAGTERM)) {
+                                               $xo = parse_xml_string($item['object'],false);
+                                               $xt = parse_xml_string($item['target'],false);
+                                               if($xt->type === ACTIVITY_OBJ_NOTE) {
+                                                       $i = q("select * from `item` where uri = '%s' and uid = %d limit 1",
+                                                               dbesc($xt->id),
+                                                               intval($importer['importer_uid'])
+                                                       );
+                                                       if(count($i)) {
+
+                                                               // For tags, the owner cannot remove the tag on the author's copy of the post.
+
+                                                               $owner_remove = (($item['contact-id'] == $i[0]['contact-id']) ? true: false);
+                                                               $author_remove = (($item['origin'] && $item['self']) ? true : false);
+                                                               $author_copy = (($item['origin']) ? true : false);
+
+                                                               if($owner_remove && $author_copy)
+                                                                       continue;
+                                                               if($author_remove || $owner_remove) {
+                                                                       $tags = explode(',',$i[0]['tag']);
+                                                                       $newtags = array();
+                                                                       if(count($tags)) {
+                                                                               foreach($tags as $tag)
+                                                                                       if(trim($tag) !== trim($xo->body))
+                                                                                               $newtags[] = trim($tag);
+                                                                       }
+                                                                       q("update item set tag = '%s' where id = %d limit 1",
+                                                                               dbesc(implode(',',$newtags)),
+                                                                               intval($i[0]['id'])
+                                                                       );
+                                                               }
+                                                       }
+                                               }
+                                       }
+
                                        if($item['uri'] == $item['parent-uri']) {
                                                $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
                                                        `body` = '', `title` = ''
@@ -1348,7 +1377,10 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                $parent_uri = $rawthread[0]['attribs']['']['ref'];
                        }
 
-                       if(($is_reply) && is_array($contact) && $pass != 1) {
+                       if(($is_reply) && is_array($contact)) {
+
+                               if($pass == 1)
+                                       continue;
 
                                // Have we seen it? If not, import it.
        
@@ -1424,6 +1456,30 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                }
 
+                               if(($datarray['verb'] === ACTIVITY_TAG) && ($datarray['object-type'] === ACTIVITY_OBJ_TAGTERM)) {
+                                       $xo = parse_xml_string($datarray['object'],false);
+                                       $xt = parse_xml_string($datarray['target'],false);
+
+                                       if($xt->type == ACTIVITY_OBJ_NOTE) {
+                                               $r = q("select * from item where `uri` = '%s' AND `uid` = %d limit 1",
+                                                       dbesc($xt->id),
+                                                       intval($importer['importer_uid'])
+                                               );
+                                               if(! count($r))
+                                                       continue;
+
+                                               // extract tag, if not duplicate, add to parent item
+                                               if($xo->content) {
+                                                       if(! (stristr($r[0]['tag'],trim($xo->content)))) {
+                                                               q("UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1",
+                                                                       dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . '#[url=' . $xo->id . ']'. $xo->content . '[/url]'),
+                                                                       intval($r[0]['id'])
+                                                               );
+                                                       }
+                                               }
+                                       }
+                               }
+
                                $r = item_store($datarray,$force_parent);
                                continue;
                        }
@@ -1801,7 +1857,8 @@ function local_delivery($importer,$data) {
                        }
                        if($deleted) {
 
-                               $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `contact-id` = %d LIMIT 1",
+                               $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join contact on `item`.`contact-id` = `contact`.`id`
+                                       WHERE `uri` = '%s' AND `uid` = %d AND `contact-id` = %d LIMIT 1",
                                        dbesc($uri),
                                        intval($importer['importer_uid']),
                                        intval($importer['id'])
@@ -1810,8 +1867,45 @@ function local_delivery($importer,$data) {
                                if(count($r)) {
                                        $item = $r[0];
 
-                                       if(! $item['deleted'])
-                                               logger('local_delivery: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
+                                       if($item['deleted'])
+                                               continue;
+
+                                       logger('local_delivery: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
+
+                                       if(($item['verb'] === ACTIVITY_TAG) && ($item['object-type'] === ACTVITY_OBJ_TAGTERM)) {
+                                               $xo = parse_xml_string($item['object'],false);
+                                               $xt = parse_xml_string($item['target'],false);
+                                               if($xt->type === ACTIVITY_OBJ_NOTE) {
+                                                       $i = q("select * from `item` where uri = '%s' and uid = %d limit 1",
+                                                               dbesc($xt->id),
+                                                               intval($importer['importer_uid'])
+                                                       );
+                                                       if(count($i)) {
+
+                                                               // For tags, the owner cannot remove the tag on the author's copy of the post.
+                                                               
+                                                               $owner_remove = (($item['contact-id'] == $i[0]['contact-id']) ? true: false);
+                                                               $author_remove = (($item['origin'] && $item['self']) ? true : false);
+                                                               $author_copy = (($item['origin']) ? true : false); 
+
+                                                               if($owner_remove && $author_copy)
+                                                                       continue;
+                                                               if($author_remove || $owner_remove) {                                                           
+                                                                       $tags = explode(',',$i[0]['tag']);
+                                                                       $newtags = array();
+                                                                       if(count($tags)) {
+                                                                               foreach($tags as $tag)
+                                                                                       if(trim($tag) !== trim($xo->body))
+                                                                                               $newtags[] = trim($tag);
+                                                                       }
+                                                                       q("update item set tag = '%s' where id = %d limit 1",
+                                                                               dbesc(implode(',',$newtags)),
+                                                                               intval($i[0]['id'])
+                                                                       );
+                                                               }
+                                                       }
+                                               }
+                                       }
 
                                        if($item['uri'] == $item['parent-uri']) {
                                                $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s'
@@ -1873,13 +1967,14 @@ function local_delivery($importer,$data) {
 
                        $r = q("select `item`.`id`, `contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item` 
                                LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` 
-                               WHERE `contact`.`self` = 1 AND `item`.`wall` = 1 AND `item`.`uri` = '%s' AND `item`.`uid` = %d LIMIT 1",
+                               WHERE `contact`.`self` = 1 AND `item`.`wall` = 1 AND `item`.`uri` = '%s' AND `item`.`parent-uri` = '%s'
+                               AND `item`.`uid` = %d LIMIT 1",
+                               dbesc($parent_uri),
                                dbesc($parent_uri),
                                intval($importer['importer_uid'])
                        );
                        if($r && count($r)) {   
 
-
                                logger('local_delivery: received remote comment');
                                $is_like = false;
                                // remote reply to our post. Import and then notify everybody else.
@@ -1899,12 +1994,39 @@ function local_delivery($importer,$data) {
                                $datarray['owner-link'] = $r[0]['url'];
                                $datarray['owner-avatar'] = $r[0]['thumb'];
                                $datarray['contact-id'] = $importer['id'];
-                               if(($datarray['verb'] == ACTIVITY_LIKE) || ($datarray['verb'] == ACTIVITY_DISLIKE)) {
+                               if(($datarray['verb'] === ACTIVITY_LIKE) || ($datarray['verb'] === ACTIVITY_DISLIKE)) {
                                        $is_like = true;
                                        $datarray['type'] = 'activity';
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                        $datarray['last-child'] = 0;
                                }
+
+                               if(($datarray['verb'] === ACTIVITY_TAG) && ($datarray['object-type'] === ACTIVITY_OBJ_TAGTERM)) {
+
+
+                                       $xo = parse_xml_string($datarray['object'],false);
+                                       $xt = parse_xml_string($datarray['target'],false);
+
+                                       if(($xt->type == ACTIVITY_OBJ_NOTE) && ($xt->id == $r[0]['uri'])) {
+
+                                               // extract tag, if not duplicate, and this user allows tags, add to parent item                                         
+                                               if($xo->content) {
+
+                                                       if(! (stristr($r[0]['tag'],trim($xo->content)))) {
+                                                               $i = q("SELECT `blocktags` FROM `user` where `uid` = %d LIMIT 1",
+                                                                       intval($importer['importer_uid'])
+                                                               );
+                                                               if(count($i) && ! ($i[0]['blocktags'])) {
+                                                                       q("UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1",
+                                                                               dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . '#[url=' . $xo->id . ']'. $xo->content . '[/url]'),
+                                                                               intval($r[0]['id'])
+                                                                       );
+                                                               }
+                                                       }
+                                               }                                                                                                       
+                                       }
+                               }
+
                                $posted_id = item_store($datarray);
                                $parent = 0;
 
@@ -2052,6 +2174,32 @@ function local_delivery($importer,$data) {
                                        $datarray['type'] = 'activity';
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                }
+
+                               if(($datarray['verb'] === ACTIVITY_TAG) && ($datarray['object-type'] === ACTIVITY_OBJ_TAGTERM)) {
+
+                                       $xo = parse_xml_string($datarray['object'],false);
+                                       $xt = parse_xml_string($datarray['target'],false);
+
+                                       if($xt->type == ACTIVITY_OBJ_NOTE) {
+                                               $r = q("select * from item where `uri` = '%s' AND `uid` = %d limit 1",
+                                                       dbesc($xt->id),
+                                                       intval($importer['importer_uid'])
+                                               );
+                                               if(! count($r))
+                                                       continue;                               
+
+                                               // extract tag, if not duplicate, add to parent item                                            
+                                               if($xo->content) {
+                                                       if(! (stristr($r[0]['tag'],trim($xo->content)))) {
+                                                               q("UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1",
+                                                                       dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . '#[url=' . $xo->id . ']'. $xo->content . '[/url]'),
+                                                                       intval($r[0]['id'])
+                                                               );
+                                                       }
+                                               }                                                                                                       
+                                       }
+                               }
+
                                $posted_id = item_store($datarray);
 
                                // find out if our user is involved in this conversation and wants to be notified.
@@ -2388,6 +2536,9 @@ function atom_entry($item,$type,$author,$owner,$comment = false) {
 
        $a = get_app();
 
+       if(! $item['parent'])
+               return;
+
        if($item['deleted'])
                return '<at:deleted-entry ref="' . xmlify($item['uri']) . '" when="' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '" />' . "\r\n";
 
@@ -2723,4 +2874,4 @@ function drop_item($id,$interactive = true) {
                //NOTREACHED
        }
        
-}
\ No newline at end of file
+}