From 81d6ca17830538aea2815a0381f3a287d68c454f Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Thu, 8 Nov 2018 20:01:42 +0000 Subject: [PATCH] user: implement AS2 mention extraction + unify Announce handling --- lib/pleroma/user.ex | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 260d904bc..71bdbebee 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -482,20 +482,35 @@ def get_notified_from_activity_query(to, true) do def get_notified_from_activity(activity, local_only \\ true) - def get_notified_from_activity( - %Activity{data: %{"type" => "Announce", "to" => to} = data}, - local_only - ) do + def get_notified_from_activity(%Activity{data: %{"to" => to} = data}, local_only) do object = Object.normalize(data["object"]) - actor = User.get_cached_by_ap_id(data["actor"]) - # ensure that the actor who published the announced object appears only once - to = - if actor.nickname != nil do - to ++ [object.data["actor"]] + # somehow, get an AS2 object, preferring the normalized object if we have one + object_data = + if object do + object.data else - to + if is_map(data["object"]) do + data["object"] + else + %{} + end end + + # finally extract AS2 mentions from this object + tagged_mentions = + if object_data["tag"] do + object_data["tag"] + |> Enum.filter(fn x -> is_map(x) end) + |> Enum.filter(fn x -> x["type"] == "Mention" end) + |> Enum.map(fn x -> x["href"] end) + else + [] + end + + # ensure all mentioned users are unique + to = + (to ++ tagged_mentions) |> Enum.uniq() query = get_notified_from_activity_query(to, local_only) @@ -503,12 +518,6 @@ def get_notified_from_activity( Repo.all(query) end - def get_notified_from_activity(%Activity{data: %{"to" => to}}, local_only) do - query = get_notified_from_activity_query(to, local_only) - - Repo.all(query) - end - def get_notified_from_activity(_, _), do: [] def get_recipients_from_activity(%Activity{recipients: to}) do