]> git.mxchange.org Git - friendica.git/blobdiff - include/items.php
Merge remote-tracking branch 'upstream/develop' into 1504-unified-follow
[friendica.git] / include / items.php
index 3a9d850d48df56344adba579a8ae9dd8e6cb5217..3832b80b318f30f51a0f8b716d87c752f65ac855 100644 (file)
@@ -12,6 +12,7 @@ require_once('include/email.php');
 require_once('include/ostatus_conversation.php');
 require_once('include/threads.php');
 require_once('include/socgraph.php');
+require_once('mod/share.php');
 
 function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
 
@@ -838,10 +839,7 @@ function get_atom_elements($feed, $item, $contact = array()) {
                        logger('get_atom_elements: fixing sender of repeated message.');
 
                        if (!intval(get_config('system','wall-to-wall_share'))) {
-                               $prefix = "[share author='".str_replace("'", "'",$name).
-                                               "' profile='".$uri.
-                                               "' avatar='".$avatar.
-                                               "' link='".$orig_uri."']";
+                               $prefix = share_header($name, $uri, $avatar, "", "", $orig_uri);
 
                                $res["body"] = $prefix.html2bbcode($message)."[/share]";
                        } else {
@@ -1183,9 +1181,9 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        $arr['owner-avatar']  = ((x($arr,'owner-avatar'))  ? notags(trim($arr['owner-avatar']))  : '');
        $arr['created']       = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
        $arr['edited']        = ((x($arr,'edited')  !== false) ? datetime_convert('UTC','UTC',$arr['edited'])  : datetime_convert());
-       $arr['commented']     = datetime_convert();
-       $arr['received']      = datetime_convert();
-       $arr['changed']       = datetime_convert();
+       $arr['commented']     = ((x($arr,'commented')  !== false) ? datetime_convert('UTC','UTC',$arr['commented'])  : datetime_convert());
+       $arr['received']      = ((x($arr,'received')  !== false) ? datetime_convert('UTC','UTC',$arr['received'])  : datetime_convert());
+       $arr['changed']       = ((x($arr,'changed')  !== false) ? datetime_convert('UTC','UTC',$arr['changed'])  : datetime_convert());
        $arr['title']         = ((x($arr,'title'))         ? notags(trim($arr['title']))         : '');
        $arr['location']      = ((x($arr,'location'))      ? notags(trim($arr['location']))      : '');
        $arr['coord']         = ((x($arr,'coord'))         ? notags(trim($arr['coord']))         : '');
@@ -1210,8 +1208,8 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        $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(30));
        $arr['network']       = ((x($arr,'network'))       ? trim($arr['network'])               : '');
+       $arr['guid']          = ((x($arr,'guid'))          ? notags(trim($arr['guid']))          : get_guid(32, $arr['network']));
        $arr['postopts']      = ((x($arr,'postopts'))      ? trim($arr['postopts'])              : '');
        $arr['resource-id']   = ((x($arr,'resource-id'))   ? trim($arr['resource-id'])           : '');
        $arr['event-id']      = ((x($arr,'event-id'))      ? intval($arr['event-id'])            : 0 );
@@ -1239,6 +1237,9 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
                logger("item_store: Set network to ".$arr["network"]." for ".$arr["uri"], LOGGER_DEBUG);
        }
 
+       // Check for hashtags in the body and repair or add hashtag links
+       item_body_set_hashtags($arr);
+
        $arr['thr-parent'] = $arr['parent-uri'];
        if($arr['parent-uri'] === $arr['uri']) {
                $parent_id = 0;
@@ -1343,6 +1344,20 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
                return 0;
        }
 
+       // Is this item available in the global items (with uid=0)?
+       if ($arr["uid"] == 0) {
+               $arr["global"] = true;
+
+               q("UPDATE `item` SET `global` = 1 WHERE `guid` = '%s'", dbesc($arr["guid"]));
+       }  else {
+               $isglobal = q("SELECT `global` FROM `item` WHERE `uid` = 0 AND `guid` = '%s'", dbesc($arr["guid"]));
+
+               $arr["global"] = (count($isglobal) > 0);
+       }
+
+       // Fill the cache field
+       put_item_in_cache($arr);
+
        call_hooks('post_remote',$arr);
 
        if(x($arr,'cancel')) {
@@ -1434,12 +1449,18 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        $arr['deleted'] = $parent_deleted;
 
        // update the commented timestamp on the parent
-
-       q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d",
-               dbesc(datetime_convert()),
-               dbesc(datetime_convert()),
-               intval($parent_id)
-       );
+       // Only update "commented" if it is really a comment
+       if (($arr['verb'] == ACTIVITY_POST) OR !get_config("system", "like_no_comment"))
+               q("UPDATE `item` SET `commented` = '%s', `changed` = '%s' WHERE `id` = %d",
+                       dbesc(datetime_convert()),
+                       dbesc(datetime_convert()),
+                       intval($parent_id)
+               );
+       else
+               q("UPDATE `item` SET `changed` = '%s' WHERE `id` = %d",
+                       dbesc(datetime_convert()),
+                       intval($parent_id)
+               );
 
        if($dsprsig) {
                q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
@@ -1469,9 +1490,6 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        // in it.
        if (!$deleted AND !$dontcache) {
 
-               // Store the fresh generated item into the cache
-               put_item_in_cache($arr);
-
                $r = q('SELECT * FROM `item` WHERE id = %d', intval($current_post));
                if (count($r) == 1) {
                        call_hooks('post_remote_end', $r[0]);
@@ -1541,8 +1559,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
                        ));
                        logger('item_store: Notification sent for contact '.$arr['contact-id'].' and post '.$current_post, LOGGER_DEBUG);
                }
-       } else
+       } else {
                update_thread($parent_id);
+               add_shadow_entry($arr);
+       }
 
        if ($notify)
                proc_run('php', "include/notifier.php", $notify_type, $current_post);
@@ -1550,6 +1570,73 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        return $current_post;
 }
 
+function item_body_set_hashtags(&$item) {
+
+       $tags = get_tags($item["body"]);
+
+       // No hashtags?
+       if(!count($tags))
+               return(false);
+
+       // This sorting is important when there are hashtags that are part of other hashtags
+       // Otherwise there could be problems with hashtags like #test and #test2
+       rsort($tags);
+
+       $a = get_app();
+
+       $URLSearchString = "^\[\]";
+
+       // All hashtags should point to the home server
+       //$item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
+       //              "#[url=".$a->get_baseurl()."/search?tag=$2]$2[/url]", $item["body"]);
+
+       //$item["tag"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
+       //              "#[url=".$a->get_baseurl()."/search?tag=$2]$2[/url]", $item["tag"]);
+
+       // mask hashtags inside of url, bookmarks and attachments to avoid urls in urls
+       $item["body"] = preg_replace_callback("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
+               function ($match){
+                       return("[url=".$match[1]."]".str_replace("#", "#", $match[2])."[/url]");
+               },$item["body"]);
+
+       $item["body"] = preg_replace_callback("/\[bookmark\=([$URLSearchString]*)\](.*?)\[\/bookmark\]/ism",
+               function ($match){
+                       return("[bookmark=".$match[1]."]".str_replace("#", "#", $match[2])."[/bookmark]");
+               },$item["body"]);
+
+       $item["body"] = preg_replace_callback("/\[attachment (.*)\](.*?)\[\/attachment\]/ism",
+               function ($match){
+                       return("[attachment ".str_replace("#", "#", $match[1])."]".$match[2]."[/attachment]");
+               },$item["body"]);
+
+       // Repair recursive urls
+       $item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
+                       "#$2", $item["body"]);
+
+       foreach($tags as $tag) {
+               if(strpos($tag,'#') !== 0)
+                       continue;
+
+               if(strpos($tag,'[url='))
+                       continue;
+
+               $basetag = str_replace('_',' ',substr($tag,1));
+
+               $newtag = '#[url='.$a->get_baseurl().'/search?tag='.rawurlencode($basetag).']'.$basetag.'[/url]';
+
+               $item["body"] = str_replace($tag, $newtag, $item["body"]);
+
+               if(!stristr($item["tag"],"/search?tag=".$basetag."]".$basetag."[/url]")) {
+                       if(strlen($item["tag"]))
+                               $item["tag"] = ','.$item["tag"];
+                       $item["tag"] = $newtag.$item["tag"];
+               }
+       }
+
+       // Convert back the masked hashtags
+       $item["body"] = str_replace("#", "#", $item["body"]);
+}
+
 function get_item_guid($id) {
        $r = q("SELECT `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($id));
        if (count($r))