[COMPONENT][Notification] Do not re-render content just to grab attentions

Other minor improvements and bug fixes
This commit is contained in:
Diogo Peralta Cordeiro 2021-12-21 16:04:50 +00:00
parent e2c0505620
commit 8b5286c383
No known key found for this signature in database
GPG Key ID: 18D2D35001FBFAB0
3 changed files with 66 additions and 22 deletions

View File

@ -144,10 +144,27 @@ abstract class Entity
} }
/** /**
* @return array of Actors * Who should be notified about this object?
*
* @return array of ids of Actors
*/ */
public function getNotificationTargets(array $ids_already_known = []): array public function getNotificationTargetIds(array $ids_already_known = [], ?int $sender_id = null): array
{ {
// Additional actors that should know about this
if (array_key_exists('additional', $ids_already_known)) {
return $ids_already_known['additional'];
}
return []; return [];
} }
/**
* Who should be notified about this object?
*
* @return array of Actors
*/
public function getNotificationTargets(array $ids_already_known = [], ?int $sender_id = null): array
{
$target_ids = $this->getNotificationTargetIds($ids_already_known, $sender_id);
return $target_ids === [] ? [] : DB::findBy('actor', ['id' => $target_ids]);
}
} }

View File

@ -154,10 +154,11 @@ class Activity extends Entity
} }
/** /**
* Who should be notified about this object?
* *
* @return array of Actors * @return array of ids of Actors
*/ */
public function getNotificationTargets(array $ids_already_known = [], ?int $sender_id = null): array public function getNotificationTargetIds(array $ids_already_known = [], ?int $sender_id = null): array
{ {
$target_ids = []; $target_ids = [];
@ -182,7 +183,7 @@ class Activity extends Entity
if (!is_null($author = $this->getObject()?->getActorId()) && $author !== $sender_id) { if (!is_null($author = $this->getObject()?->getActorId()) && $author !== $sender_id) {
$target_ids[] = $this->getObject()->getActorId(); $target_ids[] = $this->getObject()->getActorId();
} }
array_push($target_ids, ...$this->getObject()->getNotificationTargets($ids_already_known)); array_push($target_ids, ...$this->getObject()->getNotificationTargetIds($ids_already_known));
} }
// Additional actors that should know about this // Additional actors that should know about this
@ -190,8 +191,7 @@ class Activity extends Entity
array_push($target_ids, ...$ids_already_known['additional']); array_push($target_ids, ...$ids_already_known['additional']);
} }
$target_ids = array_unique($target_ids); return array_unique($target_ids);
return $target_ids === [] ? [] : DB::findBy('actor', ['id' => $target_ids]);
} }
public static function schemaDef(): array public static function schemaDef(): array

View File

@ -28,6 +28,7 @@ use App\Core\DB\DB;
use App\Core\Entity; use App\Core\Entity;
use App\Core\Event; use App\Core\Event;
use App\Core\VisibilityScope; use App\Core\VisibilityScope;
use App\Util\Formatting;
use Component\Avatar\Avatar; use Component\Avatar\Avatar;
use DateTimeInterface; use DateTimeInterface;
@ -347,26 +348,52 @@ class Note extends Entity
} }
/** /**
* Find all mentioned actors in this note
* *
* @TODO: Seems rather inneficient to be rendering just for this * @return array of ids of Actors
*/ */
public function getNotificationTargets(array $ids_already_known = []): array public function getNotificationTargetIds(array $ids_already_known = [], ?int $sender_id = null): array
{ {
$rendered = null; $target_ids = [];
$mentions = []; if (!array_key_exists('object', $ids_already_known)) {
Event::handle('RenderNoteContent', [$this->getContent(), $mentions = Formatting::findMentions($this->getContent(), $this->getActor());
$this->getContentType(), foreach ($mentions as $mention) {
&$rendered, foreach ($mention['mentioned'] as $m) {
$this->getActor(), $target_ids[] = $m->getId();
\is_null($this->getLanguageId()) ? null : Language::getById($this->getLanguageId())->getLocale(), }
&$mentions, ]);
$mentioned = [];
foreach ($mentions as $mention) {
foreach ($mention['mentioned'] as $m) {
$mentioned[] = $m;
} }
} }
// Additional actors that should know about this
if (array_key_exists('additional', $ids_already_known)) {
array_push($target_ids, ...$ids_already_known['additional']);
}
return array_unique($target_ids);
}
/**
*
* @return array of Actors
*/
public function getNotificationTargets(array $ids_already_known = [], ?int $sender_id = null): array
{
if (array_key_exists('additional', $ids_already_known)) {
$target_ids = $this->getNotificationTargetIds($ids_already_known, $sender_id);
return $target_ids === [] ? [] : DB::findBy('actor', ['id' => $target_ids]);
}
$mentioned = [];
if (!array_key_exists('object', $ids_already_known)) {
$mentions = Formatting::findMentions($this->getContent(), $this->getActor());
foreach ($mentions as $mention) {
foreach ($mention['mentioned'] as $m) {
$mentioned[] = $m;
}
}
} else {
$mentioned = $ids_already_known['object'] === [] ? [] : DB::findBy('actor', ['id' => $ids_already_known['object']]);
}
return $mentioned; return $mentioned;
} }