diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json index bd703726..66b6d064 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json @@ -200,7 +200,8 @@ }, "tag": { "@id": "as:tag", - "@type": "@id" + "@type": "@id", + "@container": "@list" }, "target": { "@id": "as:target", diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs index 30c813d2..50e08b24 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs @@ -46,7 +46,7 @@ public class ASEmoji : ASTag [J($"{Constants.ActivityStreamsNs}#icon")] [JC(typeof(ASImageConverter))] public ASImage? Image { get; set; } - + [J($"{Constants.ActivityStreamsNs}#name")] [JC(typeof(VC))] public string? Name { get; set; } @@ -54,7 +54,7 @@ public class ASEmoji : ASTag public sealed class ASTagConverter : JsonConverter { - public override bool CanWrite => false; + public override bool CanWrite => true; public override bool CanConvert(Type objectType) { @@ -74,7 +74,27 @@ public sealed class ASTagConverter : JsonConverter if (reader.TokenType == JsonToken.StartArray) { - var array = JArray.Load(reader); + // We have to use @list here because otherwise Akkoma will refuse to process activities with only one Tag. + // To solve this, we've patched the AS2 context to render & parse the tag type as @list, forcing it to be an array. + // Ref: https://akkoma.dev/AkkomaGang/akkoma/issues/720 + var array = JArray.Load(reader); + if (array.Count > 0) + { + try + { + return array.SelectToken("$.[*].@list") + ?.Children() + .OfType() + .Select(HandleObject) + .OfType() + .ToList(); + } + catch + { + //ignored + } + } + var result = new List(); foreach (var token in array) { @@ -105,6 +125,15 @@ public sealed class ASTagConverter : JsonConverter public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { - throw new NotImplementedException(); + if (value == null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + writer.WritePropertyName("@list"); + serializer.Serialize(writer, value); + writer.WriteEndObject(); } } \ No newline at end of file