diff --git a/plugins/Repeat/Controller/Repeat.php b/plugins/Repeat/Controller/Repeat.php
index a1c25a8ac9..275c245e93 100644
--- a/plugins/Repeat/Controller/Repeat.php
+++ b/plugins/Repeat/Controller/Repeat.php
@@ -97,7 +97,7 @@ class Repeat extends Controller
// Add it to note_repeat table
if (!is_null($repeat_id)) {
DB::persist(NoteRepeat::create([
- 'id' => $repeat_id,
+ 'note_id' => $repeat_id,
'actor_id' => $actor_id,
'repeat_of' => $og_id
]));
diff --git a/plugins/Repeat/Entity/NoteRepeat.php b/plugins/Repeat/Entity/NoteRepeat.php
index c5dcd05329..567b792e67 100644
--- a/plugins/Repeat/Entity/NoteRepeat.php
+++ b/plugins/Repeat/Entity/NoteRepeat.php
@@ -23,7 +23,9 @@ declare(strict_types=1);
namespace Plugin\Repeat\Entity;
+use App\Core\DB\DB;
use App\Core\Entity;
+use App\Entity\Note;
/**
* Entity for notices
@@ -37,19 +39,19 @@ use App\Core\Entity;
*/
class NoteRepeat extends Entity
{
- private int $id;
+ private int $note_id;
private int $actor_id;
private int $repeat_of;
- public function setId(int $id): self
+ public function setNoteId(int $note_id): self
{
- $this->id = $id;
+ $this->note_id = $note_id;
return $this;
}
- public function getId(): int
+ public function getNoteId(): int
{
- return $this->id;
+ return $this->note_id;
}
public function setActorId(int $actor_id): self
@@ -74,18 +76,37 @@ class NoteRepeat extends Entity
return $this->repeat_of;
}
+ public static function getNoteRepeats(Note $note): array
+ {
+ return DB::sql(
+ <<<'EOF'
+ select {select} from note n
+ inner join note_repeat nr
+ on nr.note_id = n.id
+ where repeat_of = :note_id
+ order by n.created DESC
+ EOF,
+ ['note_id' => $note->getId()]
+ );
+ }
+
public static function schemaDef(): array
{
return [
'name' => 'note_repeat',
'fields' => [
- 'id' => ['type' => 'int', 'not null' => true, 'description' => 'The id of the repeat itself'],
+ 'note_id' => ['type' => 'int', 'not null' => true, 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'description' => 'The id of the repeat itself'],
'actor_id' => ['type' => 'int', 'not null' => true, 'foreign key' => true, 'target' => 'Actor.id', 'multiplicity' => 'one to one', 'description' => 'Who made this repeat'],
'repeat_of' => ['type' => 'int', 'not null' => true, 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'description' => 'Note this is a repeat of'],
],
- 'primary key' => ['id'],
+ 'primary key' => ['note_id'],
'foreign keys' => [
+ 'note_id_to_id_fkey' => ['note', ['note_id' => 'id']],
'note_repeat_of_id_fkey' => ['note', ['repeat_of' => 'id']],
+ 'actor_reply_to_id_fkey' => ['actor', ['actor_id' => 'id']],
+ ],
+ 'indexes' => [
+ 'note_repeat_of_idx' => ['repeat_of'],
],
];
}
diff --git a/plugins/Repeat/Repeat.php b/plugins/Repeat/Repeat.php
index 8097126473..f34afcaa2e 100644
--- a/plugins/Repeat/Repeat.php
+++ b/plugins/Repeat/Repeat.php
@@ -34,6 +34,8 @@ use App\Util\Exception\InvalidFormException;
use App\Util\Exception\NoSuchNoteException;
use App\Util\Exception\NotFoundException;
use App\Util\Exception\RedirectException;
+use App\Util\Formatting;
+use Plugin\Repeat\Entity\NoteRepeat;
use Symfony\Component\HttpFoundation\Request;
class Repeat extends NoteHandlerPlugin
@@ -64,7 +66,7 @@ class Repeat extends NoteHandlerPlugin
} catch (NotFoundException $e) {
}
- $is_repeat = DB::count('note_repeat', ['id' => $note->getId()]) >= 1;
+ $is_repeat = DB::count('note_repeat', ['note_id' => $note->getId()]) >= 1;
// Generating URL for repeat action route
$args = ['id' => $note->getId()];
@@ -93,10 +95,44 @@ class Repeat extends NoteHandlerPlugin
public function onAppendCardNote(array $vars, array &$result) {
// if note is the original and user isn't the one who repeated, append on end "user repeated this"
// if user is the one who repeated, append on end "you repeated this, remove repeat?"
- $actor = $vars['actor'];
+ $current_actor_id = (Common::actor())->getId();
$note = $vars['note'];
- return Event::next;
+ $complementary_info = '';
+ $repeat_actor = [];
+ $note_repeats = NoteRepeat::getNoteRepeats($note);
+
+ // Get actors who replied
+ foreach ($note_repeats as $reply) {
+ $repeat_actor[] = Actor::getWithPK($reply->getActorId());
+ }
+ if (count($repeat_actor) < 1) {
+ return null;
+ }
+
+ // Filter out multiple replies from the same actor
+ $repeat_actor = array_unique($repeat_actor, SORT_REGULAR);
+
+ // Add to complementary info
+ foreach ($repeat_actor as $actor) {
+ $repeat_actor_url = $actor->getUrl();
+ $repeat_actor_nickname = $actor->getNickname();
+
+ if ($actor->getId() === $current_actor_id) {
+ // If the repeat is yours
+ $prepend = "You, " . ($prepend = &$complementary_info);
+ $complementary_info = $prepend;
+ } else {
+ // If the repeat is from someone else
+ $complementary_info .= "{$repeat_actor_nickname}, ";
+ }
+ }
+
+ $complementary_info = rtrim(trim($complementary_info), ',');
+ $complementary_info .= ' repeated this note.';
+ $result[] = Formatting::twigRenderString($complementary_info, []);
+
+ return $result;
}
public function onAddRoute(RouteLoader $r): bool