X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Factivity_pub%2Ftransmogrifier.ex;h=b6ee24ee613bf479a53f73c1d9096e90f05cfe3b;hb=1419eee5dfe1f3d76c28ab7c6f3cb24ba652fef2;hp=142af1a13bb9ca0e6e212332ee15323979c282b5;hpb=33a19c002a9196cb67d3379d5237f9490c957f1b;p=akkoma diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 142af1a13..b6ee24ee6 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -384,52 +384,21 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def handle_incoming(%{"id" => id}, _options) when is_binary(id) and byte_size(id) < 8, do: :error + @doc "Rewrite misskey likes into EmojiReacts" def handle_incoming( - %{"type" => "Listen", "object" => %{"type" => "Audio"} = object} = data, + %{ + "type" => "Like", + "_misskey_reaction" => reaction, + "tag" => _ + } = data, options ) do - actor = Containment.get_actor(data) - - data = - Map.put(data, "actor", actor) - |> fix_addressing - - with {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(data["actor"]) do - reply_depth = (options[:depth] || 0) + 1 - options = Keyword.put(options, :depth, reply_depth) - object = fix_object(object, options) - - params = %{ - to: data["to"], - object: object, - actor: user, - context: nil, - local: false, - published: data["published"], - additional: Map.take(data, ["cc", "id"]) - } - - ActivityPub.listen(params) - else - _e -> :error - end + data + |> Map.put("type", "EmojiReact") + |> Map.put("content", reaction) + |> handle_incoming(options) end - @misskey_reactions %{ - "like" => "👍", - "love" => "❤️", - "laugh" => "😆", - "hmm" => "🤔", - "surprise" => "😮", - "congrats" => "🎉", - "angry" => "💢", - "confused" => "😥", - "rip" => "😇", - "pudding" => "🍮", - "star" => "⭐" - } - - @doc "Rewrite misskey likes into EmojiReacts" def handle_incoming( %{ "type" => "Like", @@ -439,7 +408,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do ) do data |> Map.put("type", "EmojiReact") - |> Map.put("content", @misskey_reactions[reaction] || reaction) + |> Map.put("content", reaction) |> handle_incoming(options) end @@ -447,7 +416,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do %{"type" => "Create", "object" => %{"type" => objtype, "id" => obj_id}} = data, options ) - when objtype in ~w{Question Answer ChatMessage Audio Video Event Article Note Page} do + when objtype in ~w{Question Answer Audio Video Event Article Note Page} do fetch_options = Keyword.put(options, :depth, (options[:depth] || 0) + 1) object = @@ -472,11 +441,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def handle_incoming(%{"type" => type} = data, _options) when type in ~w{Like EmojiReact Announce Add Remove} do with :ok <- ObjectValidator.fetch_actor_and_object(data), - {:ok, activity, _meta} <- - Pipeline.common_pipeline(data, local: false) do + {:ok, activity, _meta} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} else - e -> {:error, e} + e -> + {:error, e} end end @@ -629,6 +598,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def set_reply_to_uri(obj), do: obj + def set_quote_url(%{"quoteUri" => quote} = object) when is_binary(quote) do + Map.put(object, "quoteUrl", quote) + end + + def set_quote_url(obj), do: obj + @doc """ Serialized Mastodon-compatible `replies` collection containing _self-replies_. Based on Mastodon's ActivityPub::NoteSerializer#replies. @@ -683,6 +658,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do |> prepare_attachments |> set_conversation |> set_reply_to_uri + |> set_quote_url() |> set_replies |> strip_internal_fields |> strip_internal_tags @@ -695,7 +671,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do # """ def prepare_outgoing(%{"type" => activity_type, "object" => object_id} = data) - when activity_type in ["Create", "Listen"] do + when activity_type in ["Create"] do object = object_id |> Object.normalize(fetch: false) @@ -877,9 +853,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do Map.put(object, "attributedTo", attributed_to) end - # TODO: Revisit this - def prepare_attachments(%{"type" => "ChatMessage"} = object), do: object - def prepare_attachments(object) do attachments = object @@ -913,6 +886,43 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do defp strip_internal_tags(object), do: object + def fix_quote_url(object, options \\ []) + + def fix_quote_url(%{"quoteUri" => quote_url} = object, options) + when not is_nil(quote_url) do + with {:ok, quoted_object} <- get_obj_helper(quote_url, options), + %Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do + Map.put(object, "quoteUri", quoted_object.data["id"]) + else + e -> + Logger.warn("Couldn't fetch #{inspect(quote_url)}, error: #{inspect(e)}") + object + end + end + + # Soapbox + def fix_quote_url(%{"quoteUrl" => quote_url} = object, options) do + object + |> Map.put("quoteUri", quote_url) + |> fix_quote_url(options) + end + + # Old Fedibird (bug) + # https://github.com/fedibird/mastodon/issues/9 + def fix_quote_url(%{"quoteURL" => quote_url} = object, options) do + object + |> Map.put("quoteUri", quote_url) + |> fix_quote_url(options) + end + + def fix_quote_url(%{"_misskey_quote" => quote_url} = object, options) do + object + |> Map.put("quoteUri", quote_url) + |> fix_quote_url(options) + end + + def fix_quote_url(object, _), do: object + def perform(:user_upgrade, user) do # we pass a fake user so that the followers collection is stripped away old_follower_address = User.ap_followers(%User{nickname: user.nickname})