summaryrefslogtreecommitdiffstats
path: root/lib/Interfaces/Object/NoteInterface.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Interfaces/Object/NoteInterface.php')
-rw-r--r--lib/Interfaces/Object/NoteInterface.php54
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);
+ }
+ }
}