+ |> fix_attachments
+ |> fix_context
+ |> fix_in_reply_to
+ |> fix_emoji
+ |> fix_tag
+ end
+
+ def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object)
+ when not is_nil(in_reply_to_id) do
+ case ActivityPub.fetch_object_from_id(in_reply_to_id) do
+ {:ok, replied_object} ->
+ activity = Activity.get_create_activity_by_object_ap_id(replied_object.data["id"])
+
+ object
+ |> Map.put("inReplyTo", replied_object.data["id"])
+ |> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id)
+ |> Map.put("inReplyToStatusId", activity.id)
+ |> Map.put("conversation", replied_object.data["context"] || object["conversation"])
+ |> Map.put("context", replied_object.data["context"] || object["conversation"])
+
+ e ->
+ Logger.error("Couldn't fetch #{object["inReplyTo"]} #{inspect(e)}")
+ object
+ end
+ end
+
+ def fix_in_reply_to(object), do: object
+
+ def fix_context(object) do
+ object
+ |> Map.put("context", object["conversation"])
+ end
+
+ def fix_attachments(object) do
+ attachments =
+ (object["attachment"] || [])
+ |> Enum.map(fn data ->
+ url = [%{"type" => "Link", "mediaType" => data["mediaType"], "href" => data["url"]}]
+ Map.put(data, "url", url)
+ end)
+
+ object
+ |> Map.put("attachment", attachments)
+ end
+
+ def fix_emoji(object) do
+ tags = object["tag"] || []
+ emoji = tags |> Enum.filter(fn data -> data["type"] == "Emoji" and data["icon"] end)
+
+ emoji =
+ emoji
+ |> Enum.reduce(%{}, fn data, mapping ->
+ name = data["name"]
+
+ if String.starts_with?(name, ":") do
+ name = name |> String.slice(1..-2)
+ end
+
+ mapping |> Map.put(name, data["icon"]["url"])
+ end)
+
+ # we merge mastodon and pleroma emoji into a single mapping, to allow for both wire formats
+ emoji = Map.merge(object["emoji"] || %{}, emoji)
+
+ object
+ |> Map.put("emoji", emoji)
+ end
+
+ def fix_tag(object) do
+ tags =
+ (object["tag"] || [])
+ |> Enum.filter(fn data -> data["type"] == "Hashtag" and data["name"] end)
+ |> Enum.map(fn data -> String.slice(data["name"], 1..-1) end)
+
+ combined = (object["tag"] || []) ++ tags
+
+ object
+ |> Map.put("tag", combined)