namespace Friendica\Protocol\ActivityPub;
-use Friendica\Content\PageInfo;
use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML;
use Friendica\Content\Text\Markdown;
class Processor
{
/**
- * Converts mentions from Pleroma into the Friendica format
+ * Extracts the tag character (#, @, !) from mention links
*
* @param string $body
- *
- * @return string converted body
+ * @return string
*/
- private static function convertMentions($body)
+ protected static function normalizeMentionLinks(string $body): string
{
- $URLSearchString = "^\[\]";
- $body = preg_replace("/\[url\=([$URLSearchString]*)\]([#@!])(.*?)\[\/url\]/ism", '$2[url=$1]$3[/url]', $body);
-
- return $body;
+ return preg_replace('%\[url=([^\[\]]*)]([#@!])(.*?)\[/url]%ism', '$2[url=$1]$3[/url]', $body);
}
/**
$data['url'] = $attachment['url'];
$data['mimetype'] = $attachment['mediaType'];
$data['height'] = $attachment['height'] ?? null;
+ $data['width'] = $attachment['width'] ?? null;
$data['size'] = $attachment['size'] ?? null;
$data['preview'] = $attachment['image'] ?? null;
$data['description'] = $attachment['name'] ?? null;
*
* @param array $activity Activity array
* @param array $item
+ *
+ * @return int event id
* @throws \Exception
*/
public static function createEvent($activity, $item)
$event['direction'] = $item['direction'];
$event['source'] = $item['source'];
- $condition = ['uri' => $item['uri'], 'uid' => $item['uid']];
- $ev = DBA::selectFirst('event', ['id'], $condition);
+ $ev = DBA::selectFirst('event', ['id'], ['uri' => $item['uri'], 'uid' => $item['uid']]);
if (DBA::isResult($ev)) {
$event['id'] = $ev['id'];
}
$event_id = Event::store($event);
+
Logger::info('Event was stored', ['id' => $event_id]);
+
+ return $event_id;
}
/**
$content = self::replaceEmojis($content, $activity['emojis']);
}
- $content = self::convertMentions($content);
+ $content = self::addMentionLinks($content, $activity['tags']);
if (!empty($activity['source'])) {
$item['body'] = $activity['source'];
$item['raw-body'] = $content;
+ $item['body'] = Item::improveSharedDataInBody($item);
} else {
if (empty($activity['directmessage']) && ($item['thr-parent'] != $item['uri']) && ($item['gravity'] == GRAVITY_COMMENT)) {
$item_private = !in_array(0, $activity['item_receiver']);
continue;
}
+ if (!($item['isForum'] ?? false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT) &&
+ ($item['post-reason'] == Item::PR_BCC) && !Contact::isSharingByURL($activity['author'], $receiver)) {
+ Logger::info('Top level post via BCC from a non sharer, ignoring', ['uid' => $receiver, 'contact' => $item['contact-id']]);
+ continue;
+ }
+
if (DI::pConfig()->get($receiver, 'system', 'accept_only_sharer', false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) {
$skip = !Contact::isSharingByURL($activity['author'], $receiver);
}
if (($item['gravity'] != GRAVITY_ACTIVITY) && ($activity['object_type'] == 'as:Event')) {
- self::createEvent($activity, $item);
+ $event_id = self::createEvent($activity, $item);
+
+ $item = Event::getItemArrayForImportedId($event_id, $item);
}
$item_id = Item::insert($item);
$title = $matches[3];
}
- $title = trim(HTML::toPlaintext(BBCode::convert($title, false, BBCode::API, true), 0));
+ $title = trim(BBCode::toPlaintext($title));
if (strlen($title) > 20) {
$title = substr($title, 0, 20) . '...';
return implode('', $kept_mentions);
}
+
+ /**
+ * Adds links to string mentions
+ *
+ * @param string $body
+ * @param array $tags
+ * @return string
+ */
+ protected static function addMentionLinks(string $body, array $tags): string
+ {
+ // This prevents links to be added again to Pleroma-style mention links
+ $body = self::normalizeMentionLinks($body);
+
+ $body = BBCode::performWithEscapedTags($body, ['url'], function ($body) use ($tags) {
+ foreach ($tags as $tag) {
+ if (empty($tag['name']) || empty($tag['type']) || empty($tag['href']) || !in_array($tag['type'], ['Mention', 'Hashtag'])) {
+ continue;
+ }
+
+ $hash = substr($tag['name'], 0, 1);
+ $name = substr($tag['name'], 1);
+ if (!in_array($hash, Tag::TAG_CHARACTER)) {
+ $hash = '';
+ $name = $tag['name'];
+ }
+
+ $body = str_replace($tag['name'], $hash . '[url=' . $tag['href'] . ']' . $name . '[/url]', $body);
+ }
+
+ return $body;
+ });
+
+ return $body;
+ }
}