From c5d773e46a76a9b7153fb8c84ba0cad6f4a3c2d8 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Mon, 12 Feb 2024 05:05:00 +0100 Subject: [PATCH] [backend/federation] Deliver activities to mentioned users --- .../Federation/ActivityPub/ActivityDeliverService.cs | 7 ++++++- Iceshrimp.Backend/Core/Services/NoteService.cs | 12 ++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs index eaa303f6..a6ee8b95 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs @@ -14,7 +14,7 @@ public class ActivityDeliverService( DatabaseContext db, QueueService queueService ) { - public async Task DeliverToFollowersAsync(ASActivity activity, User actor) { + public async Task DeliverToFollowersAsync(ASActivity activity, User actor, IEnumerable recipients) { logger.LogDebug("Delivering activity {id} to followers", activity.Id); if (activity.Actor == null) throw new Exception("Actor must not be null"); @@ -25,6 +25,11 @@ public class ActivityDeliverService( .Distinct() .ToListAsync(); + inboxUrls = inboxUrls + .Concat(recipients.Select(p => p.SharedInbox ?? p.Inbox).Where(p => p != null).Select(p => p!)) + .Distinct() + .ToList(); + if (inboxUrls.Count == 0) return; var keypair = await db.UserKeypairs.FirstAsync(p => p.User == actor); diff --git a/Iceshrimp.Backend/Core/Services/NoteService.cs b/Iceshrimp.Backend/Core/Services/NoteService.cs index abbc0786..12b7ec99 100644 --- a/Iceshrimp.Backend/Core/Services/NoteService.cs +++ b/Iceshrimp.Backend/Core/Services/NoteService.cs @@ -76,12 +76,20 @@ public class NoteService( var obj = await noteRenderer.RenderAsync(note, mentions); var activity = ActivityRenderer.RenderCreate(obj, actor); + var recipients = await db.Users + .Where(p => note.VisibleUserIds.Contains(p.Id)) + .Select(p => new User { + Host = p.Host, + Inbox = p.Inbox, + SharedInbox = p.SharedInbox + }) + .ToListAsync(); + if (note.Visibility == Note.NoteVisibility.Specified) { - var recipients = await db.Users.Where(p => note.VisibleUserIds.Contains(p.Id)).ToListAsync(); await deliverSvc.DeliverToAsync(activity, user, recipients); } else { - await deliverSvc.DeliverToFollowersAsync(activity, user); + await deliverSvc.DeliverToFollowersAsync(activity, user, recipients); } return note;