diff options
| author | lain <lain@soykaf.club> | 2019-10-02 15:08:20 +0200 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2019-10-02 15:08:20 +0200 | 
| commit | dfe5c958eb94326f5a7743c9de0de073260db926 (patch) | |
| tree | 2b157f99f4d64430130f94de5017d8adccc2e65a /lib | |
| parent | 557223b2b5b60956d3e1a19e9fdae9e9798c4fe2 (diff) | |
| download | pleroma-dfe5c958eb94326f5a7743c9de0de073260db926.tar.gz pleroma-dfe5c958eb94326f5a7743c9de0de073260db926.zip | |
ActivityPub: Add undo for emoji reactions.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 13 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/utils.ex | 37 | ||||
| -rw-r--r-- | lib/pleroma/web/router.ex | 2 | 
3 files changed, 47 insertions, 5 deletions
| diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index a9e53141d..458d3590d 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -319,11 +319,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      end    end -  def unreact_with_emoji(user, reaction_id, option \\ []) do +  def unreact_with_emoji(user, reaction_id, options \\ []) do      with local <- Keyword.get(options, :local, true),           activity_id <- Keyword.get(options, :activity_id, nil), -           %Activity{actor: ^user.ap_id} = reaction_activity <- Activity.get_by_ap_id(reaction_id), -    unreact_data +         user_ap_id <- user.ap_id, +         %Activity{actor: ^user_ap_id} = reaction_activity <- Activity.get_by_ap_id(reaction_id), +         object <- Object.normalize(reaction_activity), +         unreact_data <- make_undo_data(user, reaction_activity, activity_id), +         {:ok, activity} <- insert(unreact_data, local), +         {:ok, object} <- remove_emoji_reaction_from_object(reaction_activity, object), +         :ok <- maybe_federate(activity) do +      {:ok, activity, object} +    end    end    # TODO: This is weird, maybe we shouldn't check here if we can make the activity. diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index 4c146fd86..7807fa9cd 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -337,6 +337,24 @@ defmodule Pleroma.Web.ActivityPub.Utils do      update_element_in_object("reaction", new_reactions, object)    end +  def remove_emoji_reaction_from_object( +        %Activity{data: %{"content" => emoji, "actor" => actor}}, +        object +      ) do +    reactions = object.data["reactions"] || %{} +    emoji_actors = reactions[emoji] || [] +    new_emoji_actors = List.delete(emoji_actors, actor) + +    new_reactions = +      if new_emoji_actors == [] do +        Map.delete(reactions, emoji) +      else +        Map.put(reactions, emoji, new_emoji_actors) +      end + +    update_element_in_object("reaction", new_reactions, object) +  end +    @spec add_like_to_object(Activity.t(), Object.t()) ::            {:ok, Object.t()} | {:error, Ecto.Changeset.t()}    def add_like_to_object(%Activity{data: %{"actor" => actor}}, object) do @@ -522,6 +540,25 @@ defmodule Pleroma.Web.ActivityPub.Utils do      |> maybe_put("id", activity_id)    end +  def make_undo_data( +        %User{ap_id: actor, follower_address: follower_address}, +        %Activity{ +          data: %{"id" => undone_activity_id, "context" => context}, +          actor: undone_activity_actor +        }, +        activity_id \\ nil +      ) do +    %{ +      "type" => "Undo", +      "actor" => actor, +      "object" => undone_activity_id, +      "to" => [follower_address, undone_activity_actor], +      "cc" => [Pleroma.Constants.as_public()], +      "context" => context +    } +    |> maybe_put("id", activity_id) +  end +    @spec add_announce_to_object(Activity.t(), Object.t()) ::            {:ok, Object.t()} | {:error, Ecto.Changeset.t()}    def add_announce_to_object( diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index eae1f676b..ff3dc273e 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -293,8 +293,6 @@ defmodule Pleroma.Web.Router do    end    scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do -    pipe_through(:authenticated_api) -      scope [] do        pipe_through(:authenticated_api)        pipe_through(:oauth_read) | 
