using Iceshrimp.Backend.Core.Federation.ActivityPub; using Iceshrimp.Backend.Core.Federation.ActivityStreams; using Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; using Iceshrimp.Backend.Core.Services; using Newtonsoft.Json.Linq; namespace Iceshrimp.Backend.Core.Queues; public class InboxQueue { public static JobQueue Create() { return new JobQueue("inbox", InboxQueueProcessor, 4); } private static async Task InboxQueueProcessor(InboxJob job, IServiceProvider scope, CancellationToken token) { var expanded = LdHelpers.Expand(job.Body); if (expanded == null) throw new Exception("Failed to expand ASObject"); var obj = ASObject.Deserialize(expanded); if (obj == null) throw new Exception("Failed to deserialize ASObject"); if (obj is not ASActivity activity) throw new NotImplementedException("Job data is not an ASActivity"); var apHandler = scope.GetRequiredService(); var logger = scope.GetRequiredService>(); logger.LogTrace("Preparation took {ms} ms", job.Duration); await apHandler.PerformActivity(activity, job.InboxUserId); } } public class InboxJob(JToken body, string? inboxUserId) : Job { public readonly JToken Body = body; public readonly string? InboxUserId = inboxUserId; }