X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FItem.php;h=e4d18c9a740b1ff864ce566d99cb71ba833446e7;hb=8c1db51a760dd60745c55592fd08dee03c2d8a52;hp=77ba9e63448d5fa97d4da0366d747c580185557e;hpb=87b1d0a4d74764b8fc49e732e4468a4f5a197551;p=friendica.git diff --git a/src/Model/Item.php b/src/Model/Item.php index 77ba9e6344..e4d18c9a74 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -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,7 @@ 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-store: item created ('.date('c', $created_date).') before expiration time ('.date('c', $expire_date).'). ignored. ' . print_r($item,true)); return 0; } } @@ -1352,7 +1354,7 @@ 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 with uri ".$item['uri']." already existed for user ".$uid." with id ".$existing["id"]." target network ".$existing["network"]." - new network: ".$item['network']); } return $existing["id"]; @@ -1403,7 +1405,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 +1432,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('Contact '.$item["author-id"].' is blocked, item '.$item["uri"].' will not be stored'); return 0; } @@ -1440,25 +1442,40 @@ 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('Contact '.$item["owner-id"].' is blocked, item '.$item["uri"].' will not be stored'); return 0; } if ($item['network'] == Protocol::PHANTOM) { - Logger::log('Missing network. Called by: '.System::callstack(), Logger::DEBUG); + Logger::notice('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("Set network to " . $item["network"] . " for " . $item["uri"], Logger::DEBUG); } // 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 with guid '.$item['guid'].' for user '.$item['uid'].' on 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 +1552,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 +1608,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 +1764,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 +1772,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,7 +2396,6 @@ class Item extends BaseObject public static function setHashtags(&$item) { - $tags = BBCode::getTags($item["body"]); // No hashtags? @@ -2394,23 +2403,23 @@ class Item extends BaseObject 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); - - $URLSearchString = "^\[\]"; - // 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"]); - + + // 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); + + $URLSearchString = "^\[\]"; + // All hashtags should point to the home server if "local_tags" is activated if (Config::get('system', 'local_tags')) { $item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", @@ -2441,22 +2450,20 @@ class Item extends BaseObject "#$2", $item["body"]); foreach ($tags as $tag) { - if ((strpos($tag, '#') !== 0) || strpos($tag, '[url=')) { + if ((strpos($tag, '#') !== 0) || strpos($tag, '[url=') || $tag[1] == '#') { continue; } $basetag = str_replace('_',' ',substr($tag,1)); - if($basetag[0] != '#') { - $newtag = '#[url=' . System::baseUrl() . '/search?tag=' . $basetag . ']' . $basetag . '[/url]'; + $newtag = '#[url=' . System::baseUrl() . '/search?tag=' . $basetag . ']' . $basetag . '[/url]'; - $item["body"] = str_replace($tag, $newtag, $item["body"]); + $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"]; + if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) { + if (strlen($item["tag"])) { + $item["tag"] = ',' . $item["tag"]; } + $item["tag"] = $newtag . $item["tag"]; } } @@ -2465,12 +2472,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"]); }