]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Item.php
Merge pull request #6752 from MrPetovan/bug/notices
[friendica.git] / src / Model / Item.php
index c08eb861cc85388a68b7e2c07fa82c6f1a0a2e65..16a3b07b53097e98ab3d52dccd693a1b9ce4f888 100644 (file)
@@ -559,10 +559,10 @@ class Item extends BaseObject
 
                $fields['permissionset'] = ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid'];
 
-               $fields['author'] = ['url' => 'author-link', 'name' => 'author-name',
+               $fields['author'] = ['url' => 'author-link', 'name' => 'author-name', 'addr' => 'author-addr',
                        'thumb' => 'author-avatar', 'nick' => 'author-nick', 'network' => 'author-network'];
 
-               $fields['owner'] = ['url' => 'owner-link', 'name' => 'owner-name',
+               $fields['owner'] = ['url' => 'owner-link', 'name' => 'owner-name', 'addr' => 'owner-addr',
                        'thumb' => 'owner-avatar', 'nick' => 'owner-nick', 'network' => 'owner-network'];
 
                $fields['contact'] = ['url' => 'contact-link', 'name' => 'contact-name', 'thumb' => 'contact-avatar',
@@ -1315,6 +1315,8 @@ class Item extends BaseObject
                        $item['gravity'] = GRAVITY_PARENT;
                } elseif (activity_match($item['verb'], ACTIVITY_POST)) {
                        $item['gravity'] = GRAVITY_COMMENT;
+               } elseif (activity_match($item['verb'], ACTIVITY_FOLLOW)) {
+                       $item['gravity'] = GRAVITY_ACTIVITY;
                } else {
                        $item['gravity'] = GRAVITY_UNKNOWN;   // Should not happen
                        Logger::log('Unknown gravity for verb: ' . $item['verb'], Logger::DEBUG);
@@ -1334,7 +1336,11 @@ class Item extends BaseObject
                        $expire_date = time() - ($expire_interval * 86400);
                        $created_date = strtotime($item['created']);
                        if ($created_date < $expire_date) {
-                               Logger::log('item-store: item created ('.date('c', $created_date).') before expiration time ('.date('c', $expire_date).'). ignored. ' . print_r($item,true), Logger::DEBUG);
+                               Logger::notice('Item created before expiration interval.', [
+                                       'created' => date('c', $created_date),
+                                       'expired' => date('c', $expire_date),
+                                       '$item' => $item
+                               ]);
                                return 0;
                        }
                }
@@ -1352,7 +1358,13 @@ class Item extends BaseObject
                        if (DBA::isResult($existing)) {
                                // We only log the entries with a different user id than 0. Otherwise we would have too many false positives
                                if ($uid != 0) {
-                                       Logger::log("Item with uri ".$item['uri']." already existed for user ".$uid." with id ".$existing["id"]." target network ".$existing["network"]." - new network: ".$item['network']);
+                                       Logger::notice('Item already existed for user', [
+                                               'uri' => $item['uri'],
+                                               'uid' => $uid,
+                                               'network' => $item['network'],
+                                               'existing_id' => $existing["id"],
+                                               'existing_network' => $existing["network"]
+                                       ]);
                                }
 
                                return $existing["id"];
@@ -1403,7 +1415,7 @@ class Item extends BaseObject
 
                // When there is no content then we don't post it
                if ($item['body'].$item['title'] == '') {
-                       Logger::log('No body, no title.');
+                       Logger::notice('No body, no title.');
                        return 0;
                }
 
@@ -1430,7 +1442,7 @@ class Item extends BaseObject
                $item['author-id'] = defaults($item, 'author-id', Contact::getIdForURL($item["author-link"], 0, false, $default));
 
                if (Contact::isBlocked($item["author-id"])) {
-                       Logger::log('Contact '.$item["author-id"].' is blocked, item '.$item["uri"].' will not be stored');
+                       Logger::notice('Author is blocked node-wide', ['author-link' => $item["author-link"], 'item-uri' => $item["uri"]]);
                        return 0;
                }
 
@@ -1440,25 +1452,46 @@ class Item extends BaseObject
                $item['owner-id'] = defaults($item, 'owner-id', Contact::getIdForURL($item["owner-link"], 0, false, $default));
 
                if (Contact::isBlocked($item["owner-id"])) {
-                       Logger::log('Contact '.$item["owner-id"].' is blocked, item '.$item["uri"].' will not be stored');
+                       Logger::notice('Owner is blocked node-wide', ['owner-link' => $item["owner-link"], 'item-uri' => $item["uri"]]);
                        return 0;
                }
 
                if ($item['network'] == Protocol::PHANTOM) {
-                       Logger::log('Missing network. Called by: '.System::callstack(), Logger::DEBUG);
-
                        $item['network'] = Protocol::DFRN;
-                       Logger::log("Set network to " . $item["network"] . " for " . $item["uri"], Logger::DEBUG);
+                       Logger::notice('Missing network, setting to {network}.', [
+                               'uri' => $item["uri"],
+                               'network' => $item['network'],
+                               'callstack' => System::callstack()
+                       ]);
                }
 
                // Checking if there is already an item with the same guid
-               Logger::log('Checking for an item for user '.$item['uid'].' on network '.$item['network'].' with the guid '.$item['guid'], Logger::DEBUG);
                $condition = ['guid' => $item['guid'], 'network' => $item['network'], 'uid' => $item['uid']];
                if (self::exists($condition)) {
-                       Logger::log('found item with guid '.$item['guid'].' for user '.$item['uid'].' on network '.$item['network'], Logger::DEBUG);
+                       Logger::notice('Found already existing item', [
+                               'guid' => $item['guid'],
+                               'uid' => $item['uid'],
+                               'network' => $item['network']
+                       ]);
                        return 0;
                }
 
+               if ($item['verb'] == ACTIVITY_FOLLOW) {
+                       if (!$item['origin'] && ($item['author-id'] == Contact::getPublicIdByUserId($uid))) {
+                               // Our own follow request can be relayed to us. We don't store it to avoid notification chaos.
+                               Logger::log("Follow: Don't store not origin follow request from us for " . $item['parent-uri'], Logger::DEBUG);
+                               return 0;
+                       }
+
+                       $condition = ['verb' => ACTIVITY_FOLLOW, 'uid' => $item['uid'],
+                               'parent-uri' => $item['parent-uri'], 'author-id' => $item['author-id']];
+                       if (self::exists($condition)) {
+                               // It happens that we receive multiple follow requests by the same author - we only store one.
+                               Logger::log('Follow: Found existing follow request from author ' . $item['author-id'] . ' for ' . $item['parent-uri'], Logger::DEBUG);
+                               return 0;
+                       }
+               }
+
                // Check for hashtags in the body and repair or add hashtag links
                self::setHashtags($item);
 
@@ -1535,17 +1568,10 @@ class Item extends BaseObject
                                        $item['private'] = 0;
                                }
 
-                               // If its a post from myself then tag the thread as "mention"
-                               Logger::log("Checking if parent ".$parent_id." has to be tagged as mention for user ".$item['uid'], Logger::DEBUG);
-                               $user = DBA::selectFirst('user', ['nickname'], ['uid' => $item['uid']]);
-                               if (DBA::isResult($user)) {
-                                       $self = Strings::normaliseLink(System::baseUrl() . '/profile/' . $user['nickname']);
-                                       $self_id = Contact::getIdForURL($self, 0, true);
-                                       Logger::log("'myself' is ".$self_id." for parent ".$parent_id." checking against ".$item['author-id']." and ".$item['owner-id'], Logger::DEBUG);
-                                       if (($item['author-id'] == $self_id) || ($item['owner-id'] == $self_id)) {
-                                               DBA::update('thread', ['mention' => true], ['iid' => $parent_id]);
-                                               Logger::log("tagged thread ".$parent_id." as mention for user ".$self, Logger::DEBUG);
-                                       }
+                               // If its a post that originated here then tag the thread as "mention"
+                               if ($item['origin'] && $item['uid']) {
+                                       DBA::update('thread', ['mention' => true], ['iid' => $parent_id]);
+                                       Logger::log('tagged thread ' . $parent_id . ' as mention for user ' . $item['uid'], Logger::DEBUG);
                                }
                        } else {
                                /*
@@ -1598,7 +1624,7 @@ class Item extends BaseObject
                        $item["global"] = true;
 
                        // Set the global flag on all items if this was a global item entry
-                       self::update(['global' => true], ['uri' => $item["uri"]]);
+                       DBA::update('item', ['global' => true], ['uri' => $item["uri"]]);
                } else {
                        $item["global"] = self::exists(['uid' => 0, 'uri' => $item["uri"]]);
                }
@@ -1754,7 +1780,7 @@ class Item extends BaseObject
                }
 
                // Set parent id
-               self::update(['parent' => $parent_id], ['id' => $current_post]);
+               DBA::update('item', ['parent' => $parent_id], ['id' => $current_post]);
 
                $item['id'] = $current_post;
                $item['parent'] = $parent_id;
@@ -1762,9 +1788,9 @@ class Item extends BaseObject
                // update the commented timestamp on the parent
                // Only update "commented" if it is really a comment
                if (($item['gravity'] != GRAVITY_ACTIVITY) || !Config::get("system", "like_no_comment")) {
-                       self::update(['commented' => DateTimeFormat::utcNow(), 'changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]);
+                       DBA::update('item', ['commented' => DateTimeFormat::utcNow(), 'changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]);
                } else {
-                       self::update(['changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]);
+                       DBA::update('item', ['changed' => DateTimeFormat::utcNow()], ['id' => $parent_id]);
                }
 
                if ($dsprsig) {
@@ -2386,24 +2412,23 @@ class Item extends BaseObject
 
        public static function setHashtags(&$item)
        {
+               $tags = BBCode::getTags($item["body"]);
+
+               // No hashtags?
+               if (!count($tags)) {
+                       return false;
+               }
 
                // What happens in [code], stays in [code]!
                // escape the # and the [
                // hint: we will also get in trouble with #tags, when we want markdown in posts -> ### Headline 3
-               $item["body"] = preg_replace_callback("/\[code(.*)\](.*?)\[\/code\]/ism",
+               $item["body"] = preg_replace_callback("/\[code(.*?)\](.*?)\[\/code\]/ism",
                        function ($match) {
                                // we truly ESCape all # and [ to prevent gettin weird tags in [code] blocks
                                $find = ['#', '['];
                                $replace = [chr(27).'sharp', chr(27).'leftsquarebracket'];
-                               return ("[code" . str_replace($find, $replace, $match[1]) . "]" . $match[2] . "[/code]");
+                               return ("[code" . $match[1] . "]" . str_replace($find, $replace, $match[2]) . "[/code]");
                        }, $item["body"]);
-               
-               $tags = BBCode::getTags($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
@@ -2463,12 +2488,12 @@ class Item extends BaseObject
 
                // Remember! What happens in [code], stays in [code]
                // roleback the # and [
-               $item["body"] = preg_replace_callback("/\[code(.*)\](.*?)\[\/code\]/ism",
+               $item["body"] = preg_replace_callback("/\[code(.*?)\](.*?)\[\/code\]/ism",
                        function ($match) {
                                // we truly unESCape all sharp and leftsquarebracket
                                $find = [chr(27).'sharp', chr(27).'leftsquarebracket'];
                                $replace = ['#', '['];
-                               return ("[code" . str_replace($find, $replace, $match[1]) . "]" . $match[2] . "[/code]");
+                               return ("[code" . $match[1] . "]" . str_replace($find, $replace, $match[2]) . "[/code]");
                        }, $item["body"]);
        }