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 pleroma-81d6ca17830538aea2815a0381f3a287d68c454f.zip  | |
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)  | 
