object
end
- def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object)
- when not is_nil(in_reply_to_id) do
+ def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object)
+ when not is_nil(in_reply_to) do
+ in_reply_to_id =
+ if is_bitstring(in_reply_to) do
+ in_reply_to
+ else
+ if is_map(in_reply_to) && in_reply_to["id"] do
+ in_reply_to["id"]
+ end
+ end
+
case ActivityPub.fetch_object_from_id(in_reply_to_id) do
{:ok, replied_object} ->
with %Activity{} = activity <-
|> Map.put("conversation", context)
end
- def fix_attachments(object) do
+ def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachment) do
attachments =
- (object["attachment"] || [])
+ attachment
|> Enum.map(fn data ->
url = [%{"type" => "Link", "mediaType" => data["mediaType"], "href" => data["url"]}]
Map.put(data, "url", url)
|> Map.put("attachment", attachments)
end
- def fix_emoji(object) do
- tags = object["tag"] || []
+ def fix_attachments(%{"attachment" => attachment} = object) when is_map(attachment) do
+ attachment =
+ Map.put(attachment, "url", [
+ %{"type" => "Link", "mediaType" => attachment["mediaType"], "href" => attachment["url"]}
+ ])
+
+ Map.put(object, "attachment", attachment)
+ end
+
+ def fix_attachments(object) do
+ object
+ end
+
+ def fix_emoji(%{"tag" => tags} = object) when is_list(tags) do
emoji = tags |> Enum.filter(fn data -> data["type"] == "Emoji" and data["icon"] end)
emoji =
emoji
|> Enum.reduce(%{}, fn data, mapping ->
- name = data["name"]
-
- name =
- if String.starts_with?(name, ":") do
- name |> String.slice(1..-2)
- else
- name
- end
+ name = String.trim(data["name"], ":")
mapping |> Map.put(name, data["icon"]["url"])
end)
|> Map.put("emoji", emoji)
end
+ def fix_emoji(%{"tag" => %{"type" => "Emoji"} = tag} = object) do
+ name = String.trim(tag["name"], ":")
+ emoji = %{name => tag["icon"]["url"]}
+
+ object
+ |> Map.put("emoji", emoji)
+ end
+
+ def fix_emoji(object) do
+ object
+ end
+
def fix_tag(object) do
tags =
(object["tag"] || [])
end
def handle_incoming(
- %{"type" => "Update", "object" => %{"type" => "Person"} = object, "actor" => actor_id} =
+ %{"type" => "Update", "object" => %{"type" => object_type} = object, "actor" => actor_id} =
data
- ) do
+ )
+ when object_type in ["Person", "Application", "Service", "Organization"] do
with %User{ap_id: ^actor_id} = actor <- User.get_by_ap_id(object["id"]) do
{:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)