diff options
Diffstat (limited to 'lib/Interfaces/Object/NoteInterface.php')
-rw-r--r-- | lib/Interfaces/Object/NoteInterface.php | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/lib/Interfaces/Object/NoteInterface.php b/lib/Interfaces/Object/NoteInterface.php index 646c729f..161a79b6 100644 --- a/lib/Interfaces/Object/NoteInterface.php +++ b/lib/Interfaces/Object/NoteInterface.php @@ -31,25 +31,40 @@ declare(strict_types=1); namespace OCA\Social\Interfaces\Object; +use OCA\Social\AP; +use OCA\Social\Db\CacheActorsRequest; use OCA\Social\Db\StreamRequest; +use OCA\Social\Exceptions\CacheActorDoesNotExistException; use OCA\Social\Exceptions\InvalidOriginException; use OCA\Social\Exceptions\ItemAlreadyExistsException; use OCA\Social\Exceptions\ItemNotFoundException; use OCA\Social\Exceptions\StreamNotFoundException; use OCA\Social\Interfaces\Activity\AbstractActivityPubInterface; use OCA\Social\Interfaces\IActivityPubInterface; +use OCA\Social\Interfaces\Internal\SocialAppNotificationInterface; use OCA\Social\Model\ActivityPub\ACore; use OCA\Social\Model\ActivityPub\Activity\Create; use OCA\Social\Model\ActivityPub\Activity\Delete; +use OCA\Social\Model\ActivityPub\Internal\SocialAppNotification; +use OCA\Social\Model\ActivityPub\Object\Mention; use OCA\Social\Model\ActivityPub\Object\Note; use OCA\Social\Service\PushService; +use OCA\Social\Tools\Traits\TArrayTools; class NoteInterface extends AbstractActivityPubInterface implements IActivityPubInterface { + use TArrayTools; + private StreamRequest $streamRequest; + private CacheActorsRequest $cacheActorsRequest; private PushService $pushService; - public function __construct(StreamRequest $streamRequest, PushService $pushService) { + public function __construct( + StreamRequest $streamRequest, + CacheActorsRequest $cacheActorsRequest, + PushService $pushService + ) { $this->streamRequest = $streamRequest; + $this->cacheActorsRequest = $cacheActorsRequest; $this->pushService = $pushService; } @@ -91,6 +106,7 @@ class NoteInterface extends AbstractActivityPubInterface implements IActivityPub } catch (StreamNotFoundException $e) { $this->streamRequest->save($note); $this->updateDetails($note); + $this->generateNotification($note); $this->pushService->onNewStream($note->getId()); } } @@ -115,4 +131,40 @@ class NoteInterface extends AbstractActivityPubInterface implements IActivityPub } catch (StreamNotFoundException $e) { } } + + private function generateNotification(Note $note): void { + $mentions = $note->getTags('Mention'); + if (empty($mentions)) { + return; + } + + /** @var SocialAppNotificationInterface $notificationInterface */ + $notificationInterface = AP::$activityPub->getInterfaceFromType(SocialAppNotification::TYPE); + $post = $this->streamRequest->getStreamById($note->getId(), false, ACore::FORMAT_LOCAL); + + foreach ($mentions as $mention) { + try { + $recipient = $this->cacheActorsRequest->getFromId($this->get('href', $mention)); + if (!$recipient->isLocal()) { // only interested on local + throw new CacheActorDoesNotExistException(); + } + } catch (CacheActorDoesNotExistException $e) { + continue; + } + + /** @var SocialAppNotification $notification */ + $notification = AP::$activityPub->getItemFromType(SocialAppNotification::TYPE); + $notification->setDetailItem('post', $post); + $notification->addDetail('account', $post->getActor()->getAccount()); + $notification->setAttributedTo($recipient->getId()) + ->setSubType(Mention::TYPE) + ->setId($post->getId() . '/notification+mention') + ->setSummary('{account} mentioned you in a post') + ->setObjectId($post->getId()) + ->setTo($recipient->getId()) + ->setLocal(true); + + $notificationInterface->save($notification); + } + } } |