39 lines
1.0 KiB
C#
39 lines
1.0 KiB
C#
using System.Text.Json.Nodes;
|
|||
|
|
|
||
|
|
namespace PrivaPub.Federation.Objects
|
||
|
|
{
|
||
|
|
public static class ActivityJson
|
||
|
|
{
|
||
|
|
public static string Id(JsonNode node) => node switch
|
||
|
|
{
|
||
|
|
JsonValue value when value.TryGetValue<string>(out var text) => text,
|
||
|
|
JsonObject obj => Value(obj, "id") ?? Value(obj, "href"),
|
||
|
|
JsonArray array => array.Select(Id).FirstOrDefault(i => i != default),
|
||
|
|
_ => default
|
||
|
|
};
|
||
|
|
|
||
|
|
public static string Value(JsonNode node, string property) =>
|
||
|
|
node is JsonObject obj && obj[property] is JsonValue value && value.TryGetValue<string>(out var text) ? text : default;
|
||
|
|
|
||
|
|
public static IEnumerable<string> Addresses(JsonNode node)
|
||
|
|
{
|
||
|
|
foreach (var field in new[] { "to", "cc", "bto", "bcc", "audience" })
|
||
|
|
{
|
||
|
|
switch (node[field])
|
||
|
|
{
|
||
|
|
case JsonArray array:
|
||
|
|
foreach (var item in array)
|
||
|
|
{
|
||
|
|
var id = Id(item);
|
||
|
|
if (id != default)
|
||
|
|
yield return id;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case JsonNode single when Id(single) is { } id:
|
||
|
|
yield return id;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|