<?php
/**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
$tag = DBA::selectFirst('tag', ['name', 'type'], ['url' => $url]);
if (!empty($tag)) {
if ($tag['name'] != substr($name, 0, 96)) {
- DBA::update('tag', ['name' => substr($name, 0, 96)], ['url' => $url]);
+ DBA::update('tag', ['name' => substr($name, 0, 96)], ['url' => $url, 'type' => $tag['type']]);
}
if (!empty($target) && ($tag['type'] != $target)) {
DBA::update('tag', ['type' => $target], ['url' => $url]);
DBA::insert('post-tag', $fields, Database::INSERT_IGNORE);
- Logger::info('Stored tag/mention', ['uri-id' => $uriId, 'tag-id' => $tagid, 'contact-id' => $cid, 'name' => $name, 'type' => $type, 'callstack' => System::callstack(8)]);
+ Logger::debug('Stored tag/mention', ['uri-id' => $uriId, 'tag-id' => $tagid, 'contact-id' => $cid, 'name' => $name, 'type' => $type, 'callstack' => System::callstack(8)]);
}
/**
* @param string $hash
* @param string $name
* @param string $url
- * @param boolean $probing Whether probing is active
* @return void
*/
- public static function storeByHash(int $uriId, string $hash, string $name, string $url = '', bool $probing = true)
+ public static function storeByHash(int $uriId, string $hash, string $name, string $url = '')
{
$type = self::getTypeForHash($hash);
if ($type == self::UNKNOWN) {
return;
}
- self::store($uriId, $type, $name, $url, $probing);
+ self::store($uriId, $type, $name, $url);
}
/**
* @param integer $uriId URI-Id
* @param string $body Body of the post
* @param string $tags Accepted tags
- * @param boolean $probing Perform a probing for contacts, adding them if needed
* @return void
*/
- public static function storeFromBody(int $uriId, string $body, string $tags = null, bool $probing = true)
+ public static function storeFromBody(int $uriId, string $body, string $tags = null)
{
- Logger::info('Check for tags', ['uri-id' => $uriId, 'hash' => $tags, 'callstack' => System::callstack()]);
+ $item = ['uri-id' => $uriId, 'body' => $body, 'quote-uri-id' => null];
+ self::storeFromArray($item, $tags);
+ }
+
+ /**
+ * Store tags and mentions from the item array
+ *
+ * @param array $item Item array
+ * @param string $tags Accepted tags
+ * @return void
+ */
+ public static function storeFromArray(array $item, string $tags = null)
+ {
+ Logger::info('Check for tags', ['uri-id' => $item['uri-id'], 'hash' => $tags, 'callstack' => System::callstack()]);
if (is_null($tags)) {
$tags = self::TAG_CHARACTER[self::HASHTAG] . self::TAG_CHARACTER[self::MENTION] . self::TAG_CHARACTER[self::EXCLUSIVE_MENTION];
}
- // Only remove the shared data from "real" reshares
- $shared = BBCode::fetchShareAttributes($body);
- if (!empty($shared['guid'])) {
- if (preg_match("/\s*\[share .*?\](.*?)\[\/share\]\s*/ism", $body, $matches)) {
- $share_body = $matches[1];
- }
- $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
+ foreach (self::getFromBody($item['body'], $tags) as $tag) {
+ self::storeByHash($item['uri-id'], $tag[1], $tag[3], $tag[2]);
}
- foreach (self::getFromBody($body, $tags) as $tag) {
- self::storeByHash($uriId, $tag[1], $tag[3], $tag[2], $probing);
- }
+ $shared = DI::contentItem()->getSharedPost($item, ['uri-id']);
// Search for hashtags in the shared body (but only if hashtags are wanted)
- if (!empty($share_body) && (strpos($tags, self::TAG_CHARACTER[self::HASHTAG]) !== false)) {
- foreach (self::getFromBody($share_body, self::TAG_CHARACTER[self::HASHTAG]) as $tag) {
- self::storeByHash($uriId, $tag[1], $tag[3], $tag[2], $probing);
+ if (!empty($shared) && (strpos($tags, self::TAG_CHARACTER[self::HASHTAG]) !== false)) {
+ foreach (self::getByURIId($shared['post']['uri-id'], [self::HASHTAG]) as $tag) {
+ self::store($item['uri-id'], $tag['type'], $tag['name'], $tag['url']);
}
}
}
return;
}
- Logger::info('Removing tag/mention', ['uri-id' => $uriId, 'tid' => $tag['tid'], 'name' => $name, 'url' => $url, 'callstack' => System::callstack(8)]);
+ Logger::debug('Removing tag/mention', ['uri-id' => $uriId, 'tid' => $tag['tid'], 'name' => $name, 'url' => $url, 'callstack' => System::callstack(8)]);
DBA::delete('post-tag', ['uri-id' => $uriId, 'type' => $type, 'tid' => $tag['tid'], 'cid' => $tag['cid']]);
}
return DBA::selectToArray('tag-view', ['type', 'name', 'url', 'tag-type'], $condition);
}
+ /**
+ * Checks if the given url is mentioned in the post
+ *
+ * @param integer $uriId
+ * @param string $url
+ * @param array $type
+ *
+ * @return boolean
+ */
+ public static function isMentioned(int $uriId, string $url, array $type = [self::MENTION, self::EXCLUSIVE_MENTION]): bool
+ {
+ $tags = self::getByURIId($uriId, $type);
+ foreach ($tags as $tag) {
+ if (Strings::compareLink($url, $tag['url'])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Return a string with all tags and mentions
*