namespace Friendica\Protocol\ActivityPub;
+use Friendica\Content\PageInfo;
use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML;
use Friendica\Core\Logger;
use Friendica\Model\Item;
use Friendica\Model\ItemURI;
use Friendica\Model\Mail;
-use Friendica\Model\Term;
+use Friendica\Model\Tag;
use Friendica\Model\User;
use Friendica\Protocol\Activity;
use Friendica\Protocol\ActivityPub;
return $body;
}
- /**
- * Constructs a string with tags for a given tag array
- *
- * @param array $tags
- * @param boolean $sensitive
- * @return string with tags
- */
- private static function constructTagString(array $tags = null, $sensitive = false)
- {
- if (empty($tags)) {
- return '';
- }
-
- $tag_text = '';
- foreach ($tags as $tag) {
- if (in_array($tag['type'] ?? '', ['Mention', 'Hashtag'])) {
- if (!empty($tag_text)) {
- $tag_text .= ',';
- }
-
- $tag_text .= substr($tag['name'], 0, 1) . '[url=' . $tag['href'] . ']' . substr($tag['name'], 1) . '[/url]';
- }
- }
-
- /// @todo add nsfw for $sensitive
-
- return $tag_text;
- }
-
/**
* Add attachment data to the item array
*
}
foreach ($activity['attachments'] as $attach) {
- $filetype = strtolower(substr($attach['mediaType'], 0, strpos($attach['mediaType'], '/')));
- if ($filetype == 'image') {
- if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
- continue;
- }
-
- if (empty($attach['name'])) {
- $item['body'] .= "\n[img]" . $attach['url'] . '[/img]';
- } else {
- $item['body'] .= "\n[img=" . $attach['url'] . ']' . $attach['name'] . '[/img]';
- }
- } elseif ($filetype == 'audio') {
- if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
- continue;
- }
-
- $item['body'] .= "\n[audio]" . $attach['url'] . '[/audio]';
- } elseif ($filetype == 'video') {
- if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
- continue;
- }
-
- $item['body'] .= "\n[video]" . $attach['url'] . '[/video]';
- } else {
- if (!empty($item["attach"])) {
- $item["attach"] .= ',';
- } else {
- $item["attach"] = '';
- }
- if (!isset($attach['length'])) {
- $attach['length'] = "0";
- }
- $item["attach"] .= '[attach]href="'.$attach['url'].'" length="'.$attach['length'].'" type="'.$attach['mediaType'].'" title="'.($attach['name'] ?? '') .'"[/attach]';
+ switch ($attach['type']) {
+ case 'link':
+ $data = [
+ 'url' => $attach['url'],
+ 'type' => $attach['type'],
+ 'title' => $attach['title'] ?? '',
+ 'text' => $attach['desc'] ?? '',
+ 'image' => $attach['image'] ?? '',
+ 'images' => [],
+ 'keywords' => [],
+ ];
+ $item['body'] = PageInfo::appendDataToBody($item['body'], $data);
+ break;
+ default:
+ $filetype = strtolower(substr($attach['mediaType'], 0, strpos($attach['mediaType'], '/')));
+ if ($filetype == 'image') {
+ if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
+ continue 2;
+ }
+
+ $item['body'] .= "\n";
+
+ // image is the preview/thumbnail URL
+ if (!empty($attach['image'])) {
+ $item['body'] .= '[url=' . $attach['url'] . ']';
+ $attach['url'] = $attach['image'];
+ }
+
+ if (empty($attach['name'])) {
+ $item['body'] .= '[img]' . $attach['url'] . '[/img]';
+ } else {
+ $item['body'] .= '[img=' . $attach['url'] . ']' . $attach['name'] . '[/img]';
+ }
+
+ if (!empty($attach['image'])) {
+ $item['body'] .= '[/url]';
+ }
+ } elseif ($filetype == 'audio') {
+ if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
+ continue 2;
+ }
+
+ $item['body'] .= "\n[audio]" . $attach['url'] . '[/audio]';
+ } elseif ($filetype == 'video') {
+ if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
+ continue 2;
+ }
+
+ $item['body'] .= "\n[video]" . $attach['url'] . '[/video]';
+ } else {
+ if (!empty($item["attach"])) {
+ $item["attach"] .= ',';
+ } else {
+ $item["attach"] = '';
+ }
+
+ $item["attach"] .= '[attach]href="' . $attach['url'] . '" length="' . ($attach['length'] ?? '0') . '" type="' . $attach['mediaType'] . '" title="' . ($attach['name'] ?? '') . '"[/attach]';
+ }
}
}
{
$item = Item::selectFirst(['uri', 'uri-id', 'thr-parent', 'gravity'], ['uri' => $activity['id']]);
if (!DBA::isResult($item)) {
- Logger::warning('Unknown item', ['uri' => $activity['id']]);
+ Logger::warning('No existing item, item will be created', ['uri' => $activity['id']]);
+ $item = self::createItem($activity);
+ self::postItem($activity, $item);
return;
}
* Prepares data for a message
*
* @param array $activity Activity array
+ * @return array Internal item
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
$item['diaspora_signed_text'] = $activity['diaspora:comment'] ?? '';
- self::postItem($activity, $item);
+ /// @todo What to do with $activity['context']?
+ if (empty($activity['directmessage']) && ($item['gravity'] != GRAVITY_PARENT) && !Item::exists(['uri' => $item['thr-parent']])) {
+ Logger::info('Parent not found, message will be discarded.', ['thr-parent' => $item['thr-parent']]);
+ return [];
+ }
+
+ $item['network'] = Protocol::ACTIVITYPUB;
+ $item['author-link'] = $activity['author'];
+ $item['author-id'] = Contact::getIdForURL($activity['author'], 0, false);
+ $item['owner-link'] = $activity['actor'];
+ $item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, false);
+
+ if (in_array(0, $activity['receiver']) && !empty($activity['unlisted'])) {
+ $item['private'] = Item::UNLISTED;
+ } elseif (in_array(0, $activity['receiver'])) {
+ $item['private'] = Item::PUBLIC;
+ } else {
+ $item['private'] = Item::PRIVATE;
+ }
+
+ if (!empty($activity['raw'])) {
+ $item['source'] = $activity['raw'];
+ $item['protocol'] = Conversation::PARCEL_ACTIVITYPUB;
+ $item['conversation-href'] = $activity['context'] ?? '';
+ $item['conversation-uri'] = $activity['conversation'] ?? '';
+
+ if (isset($activity['push'])) {
+ $item['direction'] = $activity['push'] ? Conversation::PUSH : Conversation::PULL;
+ }
+ }
+
+ $item['isForum'] = false;
+
+ if (!empty($activity['thread-completion'])) {
+ // Store the original actor in the "causer" fields to enable the check for ignored or blocked contacts
+ $item['causer-link'] = $item['owner-link'];
+ $item['causer-id'] = $item['owner-id'];
+
+ Logger::info('Ignoring actor because of thread completion.', ['actor' => $item['owner-link']]);
+ $item['owner-link'] = $item['author-link'];
+ $item['owner-id'] = $item['author-id'];
+ } else {
+ $actor = APContact::getByURL($item['owner-link'], false);
+ $item['isForum'] = ($actor['type'] == 'Group');
+ }
+
+ $item['uri'] = $activity['id'];
+
+ $item['created'] = DateTimeFormat::utc($activity['published']);
+ $item['edited'] = DateTimeFormat::utc($activity['updated']);
+ $guid = $activity['sc:identifier'] ?: self::getGUIDByURL($item['uri']);
+ $item['guid'] = $activity['diaspora:guid'] ?: $guid;
+
+ $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
+
+ $item = self::processContent($activity, $item);
+ if (empty($item)) {
+ return [];
+ }
+
+ $item['plink'] = $activity['alternate-url'] ?? $item['uri'];
+
+ $item = self::constructAttachList($activity, $item);
+
+ return $item;
}
/**
{
$owner = Contact::getIdForURL($activity['actor']);
- Logger::log('Deleting item ' . $activity['object_id'] . ' from ' . $owner, Logger::DEBUG);
+ Logger::info('Deleting item', ['object' => $activity['object_id'], 'owner' => $owner]);
Item::markForDeletion(['uri' => $activity['object_id'], 'owner-id' => $owner]);
}
}
foreach ($activity['receiver'] as $receiver) {
- $item = Item::selectFirst(['id', 'tag', 'origin', 'author-link'], ['uri' => $activity['target_id'], 'uid' => $receiver]);
+ $item = Item::selectFirst(['id', 'uri-id', 'tag', 'origin', 'author-link'], ['uri' => $activity['target_id'], 'uid' => $receiver]);
if (!DBA::isResult($item)) {
// We don't fetch missing content for this purpose
continue;
continue;
}
- // To-Do:
- // - Check if "blocktag" is set
- // - Check if actor is a contact
-
- if (!stristr($item['tag'], trim($activity['object_content']))) {
- $tag = $item['tag'] . (strlen($item['tag']) ? ',' : '') . '#[url=' . $activity['object_id'] . ']'. $activity['object_content'] . '[/url]';
- Item::update(['tag' => $tag], ['id' => $item['id']]);
- Logger::info('Tagged item', ['id' => $item['id'], 'tag' => $activity['object_content'], 'uri' => $activity['target_id'], 'actor' => $activity['actor']]);
- }
+ Tag::store($item['uri-id'], Tag::HASHTAG, $activity['object_content'], $activity['object_id']);
+ Logger::info('Tagged item', ['id' => $item['id'], 'tag' => $activity['object_content'], 'uri' => $activity['target_id'], 'actor' => $activity['actor']]);
}
}
*/
public static function createActivity($activity, $verb)
{
- $item = [];
+ $item = self::createItem($activity);
$item['verb'] = $verb;
$item['thr-parent'] = $activity['object_id'];
$item['gravity'] = GRAVITY_ACTIVITY;
}
$event_id = Event::store($event);
- Logger::log('Event '.$event_id.' was stored', Logger::DEBUG);
+ Logger::info('Event was stored', ['id' => $event_id]);
}
/**
if (empty($activity['directmessage']) && ($item['thr-parent'] != $item['uri']) && ($item['gravity'] == GRAVITY_COMMENT)) {
$item_private = !in_array(0, $activity['item_receiver']);
- $parent = Item::selectFirst(['id', 'private', 'author-link', 'alias'], ['uri' => $item['thr-parent']]);
+ $parent = Item::selectFirst(['id', 'uri-id', 'private', 'author-link', 'alias'], ['uri' => $item['thr-parent']]);
if (!DBA::isResult($parent)) {
Logger::warning('Unknown parent item.', ['uri' => $item['thr-parent']]);
return false;
}
- if ($item_private && ($parent['private'] == Item::PRIVATE)) {
+ if ($item_private && ($parent['private'] != Item::PRIVATE)) {
Logger::warning('Item is private but the parent is not. Dropping.', ['item-uri' => $item['uri'], 'thr-parent' => $item['thr-parent']]);
return false;
}
- $potential_implicit_mentions = self::getImplicitMentionList($parent);
- $content = self::removeImplicitMentionsFromBody($content, $potential_implicit_mentions);
- $activity['tags'] = self::convertImplicitMentionsInTags($activity['tags'], $potential_implicit_mentions);
+ $content = self::removeImplicitMentionsFromBody($content, $parent);
}
$item['content-warning'] = HTML::toBBCode($activity['summary']);
$item['body'] = $content;
}
- $item['tag'] = self::constructTagString($activity['tags'], $activity['sensitive']);
-
+ self::storeFromBody($item);
self::storeTags($item['uri-id'], $activity['tags']);
$item['location'] = $activity['location'];
- if (!empty($item['latitude']) && !empty($item['longitude'])) {
- $item['coord'] = $item['latitude'] . ' ' . $item['longitude'];
+ if (!empty($activity['latitude']) && !empty($activity['longitude'])) {
+ $item['coord'] = $activity['latitude'] . ' ' . $activity['longitude'];
}
$item['app'] = $activity['generator'];
return $item;
}
+ /**
+ * Store hashtags and mentions
+ *
+ * @param array $item
+ */
+ private static function storeFromBody(array $item)
+ {
+ // Make sure to delete all existing tags (can happen when called via the update functionality)
+ DBA::delete('post-tag', ['uri-id' => $item['uri-id']]);
+
+ Tag::storeFromBody($item['uri-id'], $item['body'], '@!');
+ }
+
/**
* Generate a GUID out of an URL
*
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- private static function postItem($activity, $item)
+ public static function postItem(array $activity, array $item)
{
- /// @todo What to do with $activity['context']?
- if (empty($activity['directmessage']) && ($item['gravity'] != GRAVITY_PARENT) && !Item::exists(['uri' => $item['thr-parent']])) {
- Logger::info('Parent not found, message will be discarded.', ['thr-parent' => $item['thr-parent']]);
- return;
- }
-
- $item['network'] = Protocol::ACTIVITYPUB;
- $item['author-link'] = $activity['author'];
- $item['author-id'] = Contact::getIdForURL($activity['author'], 0, true);
- $item['owner-link'] = $activity['actor'];
- $item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, true);
-
- if (in_array(0, $activity['receiver']) && !empty($activity['unlisted'])) {
- $item['private'] = Item::UNLISTED;
- } elseif (in_array(0, $activity['receiver'])) {
- $item['private'] = Item::PUBLIC;
- } else {
- $item['private'] = Item::PRIVATE;
- }
-
- if (!empty($activity['raw'])) {
- $item['source'] = $activity['raw'];
- $item['protocol'] = Conversation::PARCEL_ACTIVITYPUB;
- $item['conversation-href'] = $activity['context'] ?? '';
- $item['conversation-uri'] = $activity['conversation'] ?? '';
-
- if (isset($activity['push'])) {
- $item['direction'] = $activity['push'] ? Conversation::PUSH : Conversation::PULL;
- }
- }
-
- $isForum = false;
-
- if (!empty($activity['thread-completion'])) {
- // Store the original actor in the "causer" fields to enable the check for ignored or blocked contacts
- $item['causer-link'] = $item['owner-link'];
- $item['causer-id'] = $item['owner-id'];
-
- Logger::info('Ignoring actor because of thread completion.', ['actor' => $item['owner-link']]);
- $item['owner-link'] = $item['author-link'];
- $item['owner-id'] = $item['author-id'];
- } else {
- $actor = APContact::getByURL($item['owner-link'], false);
- $isForum = ($actor['type'] == 'Group');
- }
-
- $item['uri'] = $activity['id'];
-
- $item['created'] = DateTimeFormat::utc($activity['published']);
- $item['edited'] = DateTimeFormat::utc($activity['updated']);
- $item['guid'] = $activity['diaspora:guid'] ?: $activity['sc:identifier'] ?: self::getGUIDByURL($item['uri']);
-
- $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
-
- $item = self::processContent($activity, $item);
if (empty($item)) {
return;
}
- $item['plink'] = $activity['alternate-url'] ?? $item['uri'];
-
- $item = self::constructAttachList($activity, $item);
-
$stored = false;
foreach ($activity['receiver'] as $receiver) {
$item['uid'] = $receiver;
- if ($isForum) {
- $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver, true);
+ if ($item['isForum'] ?? false) {
+ $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver, false);
} else {
- $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true);
+ $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, false);
}
if (($receiver != 0) && empty($item['contact-id'])) {
- $item['contact-id'] = Contact::getIdForURL($activity['author'], 0, true);
+ $item['contact-id'] = Contact::getIdForURL($activity['author'], 0, false);
}
if (!empty($activity['directmessage'])) {
if (DI::pConfig()->get($receiver, 'system', 'accept_only_sharer', false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) {
$skip = !Contact::isSharingByURL($activity['author'], $receiver);
- if ($skip && (($activity['type'] == 'as:Announce') || $isForum)) {
+ if ($skip && (($activity['type'] == 'as:Announce') || ($item['isForum'] ?? false))) {
$skip = !Contact::isSharingByURL($activity['actor'], $receiver);
}
$author = APContact::getByURL($item['owner-link'], false);
// We send automatic follow requests for reshared messages. (We don't need though for forum posts)
if ($author['type'] != 'Group') {
- Logger::log('Send follow request for ' . $item['uri'] . ' (' . $stored . ') to ' . $item['author-link'], Logger::DEBUG);
+ Logger::info('Send follow request', ['uri' => $item['uri'], 'stored' => $stored, 'to' => $item['author-link']]);
ActivityPub\Transmitter::sendFollowObject($item['uri'], $item['author-link']);
}
}
}
+ /**
+ * Store tags and mentions into the tag table
+ *
+ * @param integer $uriid
+ * @param array $tags
+ */
private static function storeTags(int $uriid, array $tags = null)
{
- // Make sure to delete all existing tags (can happen when called via the update functionality)
- DBA::delete('tag', ['uri-id' => $uriid]);
-
foreach ($tags as $tag) {
if (empty($tag['name']) || empty($tag['type']) || !in_array($tag['type'], ['Mention', 'Hashtag'])) {
continue;
}
- $fields = ['uri-id' => $uriid, 'name' => $tag['name']];
+ $hash = substr($tag['name'], 0, 1);
if ($tag['type'] == 'Mention') {
- $fields['type'] = Term::MENTION;
-
- if (substr($fields['name'], 0, 1) == Term::TAG_CHARACTER[Term::MENTION]) {
- $fields['name'] = substr($fields['name'], 1);
- } elseif (substr($fields['name'], 0, 1) == Term::TAG_CHARACTER[Term::EXCLUSIVE_MENTION]) {
- $fields['type'] = Term::EXCLUSIVE_MENTION;
- $fields['name'] = substr($fields['name'], 1);
- } elseif (substr($fields['name'], 0, 1) == Term::TAG_CHARACTER[Term::IMPLICIT_MENTION]) {
- $fields['type'] = Term::IMPLICIT_MENTION;
- $fields['name'] = substr($fields['name'], 1);
+ if (in_array($hash, [Tag::TAG_CHARACTER[Tag::MENTION],
+ Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION],
+ Tag::TAG_CHARACTER[Tag::IMPLICIT_MENTION]])) {
+ $tag['name'] = substr($tag['name'], 1);
}
+ $type = Tag::IMPLICIT_MENTION;
+
if (!empty($tag['href'])) {
$apcontact = APContact::getByURL($tag['href']);
- if (!empty($apcontact['name'])) {
- $fields['name'] = $apcontact['name'];
+ if (!empty($apcontact['name']) || !empty($apcontact['nick'])) {
+ $tag['name'] = $apcontact['name'] ?: $apcontact['nick'];
}
}
} elseif ($tag['type'] == 'Hashtag') {
- $fields['type'] = Term::HASHTAG;
- if (substr($fields['name'], 0, 1) == Term::TAG_CHARACTER[Term::HASHTAG]) {
- $fields['name'] = substr($fields['name'], 1);
+ if ($hash == Tag::TAG_CHARACTER[Tag::HASHTAG]) {
+ $tag['name'] = substr($tag['name'], 1);
}
+ $type = Tag::HASHTAG;
}
- if (empty($fields['name'])) {
+ if (empty($tag['name'])) {
continue;
- } else {
- $fields['name'] = substr($fields['name'], 0, 64);
}
-
- if (!empty($tag['href'] && ($tag['href'] != $tag['name']))) {
- $fields['url'] = $tag['href'];
- }
-
- DBA::insert('tag', $fields, true);
- Logger::info('Stored tag/mention', ['uriid' => $uriid, 'tag' => $tag, 'fields' => $fields]);
+ Tag::store($uriid, $type, $tag['name'], $tag['href']);
}
}
$title = $matches[3];
}
- $title = trim(HTML::toPlaintext(BBCode::convert($title, false, 2, true), 0));
+ $title = trim(HTML::toPlaintext(BBCode::convert($title, false, BBCode::API, true), 0));
if (strlen($title) > 20) {
$title = substr($title, 0, 20) . '...';
* @return string fetched message URL
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
- public static function fetchMissingActivity($url, $child = [])
+ public static function fetchMissingActivity(string $url, array $child = [])
{
if (!empty($child['receiver'])) {
$uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']);
$result = Contact::addRelationship($owner, $contact, $item, false, $note);
if ($result === true) {
- ActivityPub\Transmitter::sendContactAccept($item['author-link'], $item['author-id'], $owner['uid']);
+ ActivityPub\Transmitter::sendContactAccept($item['author-link'], $activity['id'], $owner['uid']);
}
$cid = Contact::getIdForURL($activity['actor'], $uid);
return;
}
- Logger::log('Updating profile for ' . $activity['object_id'], Logger::DEBUG);
+ Logger::info('Updating profile', ['object' => $activity['object_id']]);
Contact::updateFromProbeByURL($activity['object_id'], true);
}
public static function deletePerson($activity)
{
if (empty($activity['object_id']) || empty($activity['actor'])) {
- Logger::log('Empty object id or actor.', Logger::DEBUG);
+ Logger::info('Empty object id or actor.');
return;
}
if ($activity['object_id'] != $activity['actor']) {
- Logger::log('Object id does not match actor.', Logger::DEBUG);
+ Logger::info('Object id does not match actor.');
return;
}
}
DBA::close($contacts);
- Logger::log('Deleted contact ' . $activity['object_id'], Logger::DEBUG);
+ Logger::info('Deleted contact', ['object' => $activity['object_id']]);
}
/**
$cid = Contact::getIdForURL($activity['actor'], $uid);
if (empty($cid)) {
- Logger::log('No contact found for ' . $activity['actor'], Logger::DEBUG);
+ Logger::info('No contact found', ['actor' => $activity['actor']]);
return;
}
$condition = ['id' => $cid];
DBA::update('contact', $fields, $condition);
- Logger::log('Accept contact request from contact ' . $cid . ' for user ' . $uid, Logger::DEBUG);
+ Logger::info('Accept contact request', ['contact' => $cid, 'user' => $uid]);
}
/**
$cid = Contact::getIdForURL($activity['actor'], $uid);
if (empty($cid)) {
- Logger::log('No contact found for ' . $activity['actor'], Logger::DEBUG);
+ Logger::info('No contact found', ['actor' => $activity['actor']]);
return;
}
if (DBA::exists('contact', ['id' => $cid, 'rel' => Contact::SHARING])) {
Contact::remove($cid);
- Logger::log('Rejected contact request from contact ' . $cid . ' for user ' . $uid . ' - contact had been removed.', Logger::DEBUG);
+ Logger::info('Rejected contact request - contact removed', ['contact' => $cid, 'user' => $uid]);
} else {
- Logger::log('Rejected contact request from contact ' . $cid . ' for user ' . $uid . '.', Logger::DEBUG);
+ Logger::info('Rejected contact request', ['contact' => $cid, 'user' => $uid]);
}
}
$cid = Contact::getIdForURL($activity['actor'], $uid);
if (empty($cid)) {
- Logger::log('No contact found for ' . $activity['actor'], Logger::DEBUG);
+ Logger::info('No contact found', ['actor' => $activity['actor']]);
return;
}
}
Contact::removeFollower($owner, $contact);
- Logger::log('Undo following request from contact ' . $cid . ' for user ' . $uid, Logger::DEBUG);
+ Logger::info('Undo following request', ['contact' => $cid, 'user' => $uid]);
}
/**
*/
private static function getImplicitMentionList(array $parent)
{
- if (DI::config()->get('system', 'disable_implicit_mentions')) {
- return [];
- }
+ $parent_terms = Tag::getByURIId($parent['uri-id'], [Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION]);
- $parent_terms = Term::tagArrayFromItemId($parent['id'], [Term::MENTION, Term::IMPLICIT_MENTION]);
-
- $parent_author = Contact::getDetailsByURL($parent['author-link'], 0);
+ $parent_author = Contact::getByURL($parent['author-link'], false, ['url', 'nurl', 'alias']);
$implicit_mentions = [];
- if (empty($parent_author)) {
+ if (empty($parent_author['url'])) {
Logger::notice('Author public contact unknown.', ['author-link' => $parent['author-link'], 'item-id' => $parent['id']]);
} else {
$implicit_mentions[] = $parent_author['url'];
}
foreach ($parent_terms as $term) {
- $contact = Contact::getDetailsByURL($term['url'], 0);
- if (!empty($contact)) {
+ $contact = Contact::getByURL($term['url'], false, ['url', 'nurl', 'alias']);
+ if (!empty($contact['url'])) {
$implicit_mentions[] = $contact['url'];
$implicit_mentions[] = $contact['nurl'];
$implicit_mentions[] = $contact['alias'];
* Strips from the body prepended implicit mentions
*
* @param string $body
- * @param array $potential_mentions
+ * @param array $parent
* @return string
*/
- private static function removeImplicitMentionsFromBody($body, array $potential_mentions)
+ private static function removeImplicitMentionsFromBody(string $body, array $parent)
{
if (DI::config()->get('system', 'disable_implicit_mentions')) {
return $body;
}
+ $potential_mentions = self::getImplicitMentionList($parent);
+
$kept_mentions = [];
// Extract one prepended mention at a time from the body
return implode('', $kept_mentions);
}
-
- private static function convertImplicitMentionsInTags($activity_tags, array $potential_mentions)
- {
- if (DI::config()->get('system', 'disable_implicit_mentions')) {
- return $activity_tags;
- }
-
- foreach ($activity_tags as $index => $tag) {
- if (in_array($tag['href'], $potential_mentions)) {
- $activity_tags[$index]['name'] = preg_replace(
- '/' . preg_quote(Term::TAG_CHARACTER[Term::MENTION], '/') . '/',
- Term::TAG_CHARACTER[Term::IMPLICIT_MENTION],
- $activity_tags[$index]['name'],
- 1
- );
- }
- }
-
- return $activity_tags;
- }
}