diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/formatter.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 18 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/transmogrifier.ex | 18 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/utils.ex | 17 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api.ex | 4 | 
6 files changed, 52 insertions, 9 deletions
diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 395a0ac55..53e2c204f 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -160,7 +160,7 @@ defmodule Pleroma.Formatter do      links =        Regex.scan(@link_regex, text)        |> Enum.map(fn [url] -> {Ecto.UUID.generate(), url} end) -      |> Enum.sort_by(fn ({_, url}) -> -String.length(url) end) +      |> Enum.sort_by(fn {_, url} -> -String.length(url) end)      uuid_text =        links diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 973d18e52..4e97693a2 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -131,11 +131,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      end    end -  def unlike(%User{} = actor, %Object{} = object) do -    with %Activity{} = activity <- get_existing_like(actor.ap_id, object), -         {:ok, _activity} <- Repo.delete(activity), -         {:ok, object} <- remove_like_from_object(activity, object) do -      {:ok, object} +  def unlike( +        %User{} = actor, +        %Object{} = object, +        activity_id \\ nil, +        local \\ true +      ) do +    with %Activity{} = like_activity <- get_existing_like(actor.ap_id, object), +         unlike_data <- make_unlike_data(actor, like_activity, activity_id), +         {:ok, unlike_activity} <- insert(unlike_data, local), +         {:ok, _activity} <- Repo.delete(like_activity), +         {:ok, object} <- remove_like_from_object(like_activity, object), +         :ok <- maybe_federate(unlike_activity) do +      {:ok, unlike_activity, like_activity, object}      else        _e -> {:ok, object}      end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index c10d27dcd..a31452a63 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -241,6 +241,24 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do      end    end +  def handle_incoming( +        %{ +          "type" => "Undo", +          "object" => %{"type" => "Like", "object" => object_id}, +          "actor" => actor, +          "id" => id +        } = data +      ) do +    with %User{} = actor <- User.get_or_fetch_by_ap_id(actor), +         {:ok, object} <- +           get_obj_helper(object_id) || ActivityPub.fetch_object_from_id(object_id), +         {:ok, activity, _, _} <- ActivityPub.unlike(actor, object, id, false) do +      {:ok, activity} +    else +      e -> :error +    end +  end +    # TODO    # Accept    # Undo for non-Announce diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index d92db0d5f..937f032c3 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -315,6 +315,23 @@ defmodule Pleroma.Web.ActivityPub.Utils do      if activity_id, do: Map.put(data, "id", activity_id), else: data    end +  def make_unlike_data( +        %User{ap_id: ap_id} = user, +        %Activity{data: %{"context" => context}} = activity, +        activity_id +      ) do +    data = %{ +      "type" => "Undo", +      "actor" => ap_id, +      "object" => activity.data, +      "to" => [user.follower_address, activity.data["actor"]], +      "cc" => ["https://www.w3.org/ns/activitystreams#Public"], +      "context" => context +    } + +    if activity_id, do: Map.put(data, "id", activity_id), else: data +  end +    def add_announce_to_object(%Activity{data: %{"actor" => actor}}, object) do      with announcements <- [actor | object.data["announcements"] || []] |> Enum.uniq() do        update_element_in_object("announcement", announcements, object) diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 5475cb505..b218c269d 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -323,7 +323,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do    end    def unfav_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do -    with {:ok, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user), +    with {:ok, _, _, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user),           %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do        render(conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity})      end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 8177a4988..722e436e2 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -82,14 +82,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do    end    def fav(%User{} = user, ap_id_or_id) do -    with {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.favorite(ap_id_or_id, user), +    with {:ok, _fav, %{data: %{"id" => id}}} = CommonAPI.favorite(ap_id_or_id, user),           %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do        {:ok, activity}      end    end    def unfav(%User{} = user, ap_id_or_id) do -    with {:ok, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user), +    with {:ok, _unfav, _fav, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user),           %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do        {:ok, activity}      end  | 
