diff options
author | William Pitcock <nenolod@dereferenced.org> | 2018-11-08 20:01:42 +0000 |
---|---|---|
committer | William Pitcock <nenolod@dereferenced.org> | 2018-11-08 20:19:56 +0000 |
commit | 81d6ca17830538aea2815a0381f3a287d68c454f (patch) | |
tree | 1e1684638e91d609b3320eedf8b748f24d80b770 /lib | |
parent | 6b4064fa5ddd8396faf7d6afef891d70e7a2e881 (diff) | |
download | pleroma-81d6ca17830538aea2815a0381f3a287d68c454f.tar.gz |
user: implement AS2 mention extraction + unify Announce handling
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 39 |
1 files changed, 24 insertions, 15 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,28 +482,37 @@ defmodule Pleroma.User 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 - |> Enum.uniq() - query = get_notified_from_activity_query(to, local_only) + # 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 - Repo.all(query) - end + # ensure all mentioned users are unique + to = + (to ++ tagged_mentions) + |> Enum.uniq() - def get_notified_from_activity(%Activity{data: %{"to" => to}}, local_only) do query = get_notified_from_activity_query(to, local_only) Repo.all(query) |