X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FProcessor.php;h=e5653a554fd565aa79cf286e9fd2604e28d0ed1a;hb=69b7923df2beed71419bc38e61ca9755fad24b12;hp=3fc7dabe05f9100ca1384c45fef32c058a6ad1a5;hpb=71afbabbd8a6ae24d86c052c3bf127a5594595fe;p=friendica.git diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 3fc7dabe05..e5653a554f 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -430,11 +430,88 @@ class Processor unset($item['post-type']); $item['object-type'] = Activity\ObjectType::NOTE; + if (!empty($activity['content'])) { + $item['body'] = HTML::toBBCode($activity['content']); + } + $item['diaspora_signed_text'] = $activity['diaspora:like'] ?? ''; self::postItem($activity, $item); } + /** + * Fetch the Uri-Id of a post for the "featured" collection + * + * @param array $activity + * @return null|int + */ + private static function getUriIdForFeaturedCollection(array $activity) + { + $actor = APContact::getByURL($activity['actor']); + if (empty($actor)) { + return null; + } + + // Refetch the account when the "featured" collection is missing. + // This can be removed in a future version (end of 2022 should be good). + if (empty($actor['featured'])) { + $actor = APContact::getByURL($activity['actor'], true); + if (empty($actor)) { + return null; + } + } + + if ($activity['target_id'] != $actor['featured']) { + return null; + } + + $id = Contact::getIdForURL($activity['actor']); + if (empty($id)) { + return null; + } + + $parent = Post::selectFirst(['uri-id'], ['uri' => $activity['object_id'], 'author-id' => $id]); + if (!empty($parent['uri-id'])) { + return $parent['uri-id']; + } + + return null; + } + + /** + * Add a post to the "Featured" collection + * + * @param array $activity + */ + public static function addToFeaturedCollection(array $activity) + { + $uriid = self::getUriIdForFeaturedCollection($activity); + if (empty($uriid)) { + return; + } + + Logger::debug('Add post to featured collection', ['uri-id' => $uriid]); + + Post\Collection::add($uriid, Post\Collection::FEATURED); + } + + /** + * Remove a post to the "Featured" collection + * + * @param array $activity + */ + public static function removeFromFeaturedCollection(array $activity) + { + $uriid = self::getUriIdForFeaturedCollection($activity); + if (empty($uriid)) { + return; + } + + Logger::debug('Remove post from featured collection', ['uri-id' => $uriid]); + + Post\Collection::remove($uriid, Post\Collection::FEATURED); + } + /** * Create an event * @@ -900,6 +977,80 @@ class Processor return Mail::insert($msg); } + /** + * Fetch featured posts from a contact with the given url + * + * @param string $url + * @return void + */ + public static function fetchFeaturedPosts(string $url) + { + Logger::info('Fetch featured posts', ['contact' => $url]); + + $apcontact = APContact::getByURL($url); + if (empty($apcontact['featured'])) { + Logger::info('Contact does not have a featured collection', ['contact' => $url]); + return; + } + + $pcid = Contact::getIdForURL($url, 0, false); + if (empty($pcid)) { + Logger::info('Contact not found', ['contact' => $url]); + return; + } + + $posts = Post\Collection::selectToArrayForContact($pcid, Post\Collection::FEATURED); + if (!empty($posts)) { + $old_featured = array_column($posts, 'uri-id'); + } + + $featured = ActivityPub::fetchItems($apcontact['featured']); + if (empty($featured)) { + Logger::info('Contact does not have featured posts', ['contact' => $url]); + + foreach ($old_featured as $uri_id) { + Post\Collection::remove($uri_id, Post\Collection::FEATURED); + Logger::debug('Removed no longer featured post', ['uri-id' => $uri_id, 'contact' => $url]); + } + return; + } + + $new = 0; + $old = 0; + + foreach ($featured as $post) { + if (empty($post['id'])) { + continue; + } + $id = Item::fetchByLink($post['id']); + if (!empty($id)) { + $item = Post::selectFirst(['uri-id', 'featured'], ['id' => $id]); + if (!empty($item['uri-id'])) { + if (!$item['featured']) { + Post\Collection::add($item['uri-id'], Post\Collection::FEATURED); + Logger::debug('Added featured post', ['uri-id' => $item['uri-id'], 'contact' => $url]); + $new++; + } else { + Logger::debug('Post already had been featured', ['uri-id' => $item['uri-id'], 'contact' => $url]); + $old++; + } + + $index = array_search($item['uri-id'], $old_featured); + if (!($index === false)) { + unset($old_featured[$index]); + } + } + } + } + + foreach ($old_featured as $uri_id) { + Post\Collection::remove($uri_id, Post\Collection::FEATURED); + Logger::debug('Removed no longer featured post', ['uri-id' => $uri_id, 'contact' => $url]); + } + + Logger::info('Fetched featured posts', ['new' => $new, 'old' => $old, 'contact' => $url]); + } + /** * Fetches missing posts * @@ -1129,6 +1280,52 @@ class Processor Logger::info('Deleted contact', ['object' => $activity['object_id']]); } + /** + * Blocks the user by the contact + * + * @param array $activity + * @throws \Exception + */ + public static function blockAccount($activity) + { + $cid = Contact::getIdForURL($activity['actor']); + if (empty($cid)) { + return; + } + + $uid = User::getIdForURL($activity['object_id']); + if (empty($uid)) { + return; + } + + Contact\User::setIsBlocked($cid, $uid, true); + + Logger::info('Contact blocked user', ['contact' => $cid, 'user' => $uid]); + } + + /** + * Unblocks the user by the contact + * + * @param array $activity + * @throws \Exception + */ + public static function unblockAccount($activity) + { + $cid = Contact::getIdForURL($activity['actor']); + if (empty($cid)) { + return; + } + + $uid = User::getIdForURL($activity['object_object']); + if (empty($uid)) { + return; + } + + Contact\User::setIsBlocked($cid, $uid, false); + + Logger::info('Contact unblocked user', ['contact' => $cid, 'user' => $uid]); + } + /** * Accept a follow request *