<?php
/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Friendica\Content\Text\Markdown;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
+use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\APContact;
*
* @return string with replaced emojis
*/
- private static function replaceEmojis($body, array $emojis)
+ private static function replaceEmojis(int $uri_id, $body, array $emojis)
{
$body = strtr($body,
array_combine(
array_column($emojis, 'name'),
array_map(function ($emoji) {
- return '[class=emoji mastodon][img=' . $emoji['href'] . ']' . $emoji['name'] . '[/img][/class]';
+ return '[emoji=' . $emoji['href'] . ']' . $emoji['name'] . '[/emoji]';
}, $emojis)
)
);
+ // We store the emoji here to be able to avoid storing it in the media
+ foreach ($emojis as $emoji) {
+ Post\Link::getByLink($uri_id, $emoji['href']);
+ }
return $body;
}
$data = ['uri-id' => $uriid];
$data['type'] = Post\Media::UNKNOWN;
$data['url'] = $attachment['url'];
- $data['mimetype'] = $attachment['mediaType'];
+ $data['mimetype'] = $attachment['mediaType'] ?? null;
$data['height'] = $attachment['height'] ?? null;
$data['width'] = $attachment['width'] ?? null;
$data['size'] = $attachment['size'] ?? null;
}
Item::update($item, ['uri' => $activity['id']]);
+
+ if ($activity['object_type'] == 'as:Event') {
+ $posts = Post::select(['event-id', 'uid'], ['uri' => $activity['id']]);
+ while ($post = DBA::fetch($posts)) {
+ if (empty($post['event-id'])) {
+ continue;
+ }
+ self::updateEvent($post['event-id'], $activity);
+ }
+ }
+ }
+
+ /**
+ * Update an existing event
+ *
+ * @param int $event_id
+ * @param array $activity
+ */
+ private static function updateEvent(int $event_id, array $activity)
+ {
+ $event = DBA::selectFirst('event', [], ['id' => $event_id]);
+
+ $event['edited'] = DateTimeFormat::utc($activity['updated']);
+ $event['summary'] = HTML::toBBCode($activity['name']);
+ $event['desc'] = HTML::toBBCode($activity['content']);
+ $event['start'] = $activity['start-time'];
+ $event['finish'] = $activity['end-time'];
+ $event['nofinish'] = empty($event['finish']);
+ $event['location'] = $activity['location'];
+
+ Logger::info('Updating event', ['uri' => $activity['id'], 'id' => $event_id]);
+ Event::store($event);
}
/**
$item['post-type'] = Item::PT_IMAGE;
} elseif ($activity['object_type'] == 'as:Page') {
$item['post-type'] = Item::PT_PAGE;
+ } elseif ($activity['object_type'] == 'as:Question') {
+ $item['post-type'] = Item::PT_POLL;
} elseif ($activity['object_type'] == 'as:Video') {
$item['post-type'] = Item::PT_VIDEO;
} else {
$item['uri'] = $activity['id'];
- $item['created'] = DateTimeFormat::utc($activity['published']);
- $item['edited'] = DateTimeFormat::utc($activity['updated']);
+ if (empty($activity['published']) || empty($activity['updated'])) {
+ DI::logger()->notice('published or updated keys are empty for activity', ['activity' => $activity, 'callstack' => System::callstack(10)]);
+ }
+
+ $item['created'] = DateTimeFormat::utc($activity['published'] ?? 'now');
+ $item['edited'] = DateTimeFormat::utc($activity['updated'] ?? 'now');
$guid = $activity['sc:identifier'] ?: self::getGUIDByURL($item['uri']);
$item['guid'] = $activity['diaspora:guid'] ?: $guid;
*
* @param array $activity Activity array
* @param array $item
- *
+ *
* @return int event id
* @throws \Exception
*/
$event['finish'] = $activity['end-time'];
$event['nofinish'] = empty($event['finish']);
$event['location'] = $activity['location'];
- $event['adjust'] = $activity['adjust'] ?? true;
$event['cid'] = $item['contact-id'];
$event['uid'] = $item['uid'];
$event['uri'] = $item['uri'];
}
if (!empty($activity['emojis'])) {
- $content = self::replaceEmojis($content, $activity['emojis']);
+ $content = self::replaceEmojis($item['uri-id'], $content, $activity['emojis']);
}
$content = self::addMentionLinks($content, $activity['tags']);
continue;
}
- if (DI::pConfig()->get($receiver, 'system', 'accept_only_sharer', false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) {
+ $is_forum = false;
+
+ if ($receiver != 0) {
+ $user = User::getById($receiver, ['account-type']);
+ if (!empty($user['account-type'])) {
+ $is_forum = ($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
+ }
+ }
+
+ if (!$is_forum && 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') || ($item['isForum'] ?? false))) {
self::switchContact($cid);
- if (DBA::exists('contact', ['id' => $cid, 'rel' => Contact::SHARING])) {
+ $contact = Contact::getById($cid, ['rel']);
+ if ($contact['rel'] == Contact::SHARING) {
Contact::remove($cid);
Logger::info('Rejected contact request - contact removed', ['contact' => $cid, 'user' => $uid]);
+ } elseif ($contact['rel'] == Contact::FRIEND) {
+ Contact::update(['rel' => Contact::FOLLOWER], ['id' => $cid]);
} else {
Logger::info('Rejected contact request', ['contact' => $cid, 'user' => $uid]);
}