/**
* Store tag/mention elements
*
- * @param integer $uriId URI id
+ * @param integer $uriId
* @param integer $type Tag type
* @param string $name Tag name
* @param string $url Contact URL (optional)
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)]);
}
/**
* Get a tag id for a given tag name and URL
*
* @param string $name Name of tag
- * @param string $url URL
+ * @param string $url
* @param int $type Type of tag
* @return int Tag id
*/
return $tid;
}
- // Also log type and tag id
+ // Also log type
$fields['type'] = $type;
- $fields['tid'] = $tid;
Logger::error('No tag id created', $fields);
return 0;
/**
* Store tag/mention elements
*
- * @param integer $uriId URI id
- * @param string $hash Hash
- * @param string $name Name
- * @param string $url URL
- * @param boolean $probing Whether probing is active
+ * @param integer $uriId
+ * @param string $hash
+ * @param string $name
+ * @param string $url
* @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']);
}
}
}
/**
* Remove tag/mention
*
- * @param integer $uriId URI id
+ * @param integer $uriId
* @param integer $type Type
* @param string $name Name
* @param string $url 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']]);
}
/**
* Remove tag/mention
*
- * @param integer $uriId URI id
- * @param string $hash Hash
- * @param string $name Name
- * @param string $url URL
+ * @param integer $uriId
+ * @param string $hash
+ * @param string $name
+ * @param string $url
* @return void
*/
public static function removeByHash(int $uriId, string $hash, string $name, string $url = '')
/**
* Get the type for the given hash
*
- * @param string $hash Hash
+ * @param string $hash
* @return integer Tag type
*/
private static function getTypeForHash(string $hash): int
/**
* Create implicit mentions for a given post
*
- * @param integer $uriId URI Id
- * @param integer $parentUriId Parent URI id
+ * @param integer $uriId
+ * @param integer $parentUriId
* @return void
*/
public static function createImplicitMentions(int $uriId, int $parentUriId)
/**
* Retrieves the terms from the provided type(s) associated with the provided item ID.
*
- * @param int $uriId URI id
+ * @param int $uriId
* @param array $type Tag type(s)
* @return array|bool Array on success, false on error
* @throws \Exception
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
*
- * @param integer $uriId URI id
+ * @param integer $uriId
* @param array $type Tag type(s)
* @return string tags and mentions
* @throws \Exception
break;
default:
- Logger:warning('Unknown tag type found', $tag);
+ Logger::warning('Unknown tag type found', $tag);
}
}
DBA::close($taglist);
{
$condition = ["`name` = ? AND (`uid` = ? OR (`uid` = ? AND NOT `global`))
AND (`network` IN (?, ?, ?, ?) OR (`uid` = ? AND `uid` != ?))",
- $search,
- 0,
- $uid,
- Protocol::ACTIVITYPUB,
- Protocol::DFRN,
- Protocol::DIASPORA,
- Protocol::OSTATUS,
- $uid,
- 0,
+ $search, 0, $uid,
+ Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, $uid, 0,
];
return DBA::count('tag-search-view', $condition);
{
$condition = ["`name` = ? AND (`uid` = ? OR (`uid` = ? AND NOT `global`))
AND (`network` IN (?, ?, ?, ?) OR (`uid` = ? AND `uid` != ?))",
- $search,
- 0,
- $uid,
- Protocol::ACTIVITYPUB,
- Protocol::DFRN,
- Protocol::DIASPORA,
- Protocol::OSTATUS,
- $uid,
- 0,
+ $search, 0, $uid,
+ Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, $uid, 0,
];
if (!empty($last_uriid)) {
FROM `tag-search-view`
WHERE `private` = ? AND `uid` = ? AND `uri-id` > ? $block_sql
GROUP BY `term` ORDER BY `authors` DESC, `score` DESC LIMIT ?",
- Item::PUBLIC,
- 0,
- $post['uri-id'],
+ Item::PUBLIC, 0, $post['uri-id'],
$limit
);
FROM `tag-search-view`
WHERE `private` = ? AND `wall` AND `origin` AND `uri-id` > ? $block_sql
GROUP BY `term` ORDER BY `authors` DESC, `score` DESC LIMIT ?",
- Item::PUBLIC,
- $post['uri-id'],
+ Item::PUBLIC, $post['uri-id'],
$limit
);
/**
* Fetch user who subscribed to the tags of the given item
*
- * @param integer $uriId URI Id
+ * @param integer $uriId
* @return array User list
*/
public static function getUIDListByURIId(int $uriId): array