aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier.ex37
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index afb25b97b..8b1a26ae5 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -21,6 +21,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> fix_attachments
|> fix_context
|> fix_in_reply_to
+ |> fix_emoji
end
def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object) when not is_nil(in_reply_to_id) do
@@ -56,6 +57,25 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> 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
+
# TODO: validate those with a Ecto scheme
# - tags
# - emoji
@@ -168,6 +188,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> set_sensitive
|> add_hashtags
|> add_mention_tags
+ |> add_emoji_tags
|> add_attributed_to
|> prepare_attachments
|> set_conversation
@@ -215,6 +236,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> Map.put("tag", tags ++ mentions)
end
+ # TODO: we should probably send mtime instead of unix epoch time for updated
+ def add_emoji_tags(object) do
+ tags = object["tag"] || []
+ emoji = object["emoji"] || []
+ out = emoji |> Enum.map(fn {name, url} ->
+ %{"icon" => %{"url" => url, "type" => "Image"},
+ "name" => ":" <> name <> ":",
+ "type" => "Emoji",
+ "updated" => "1970-01-01T00:00:00Z",
+ "id" => url}
+ end)
+
+ object
+ |> Map.put("tag", tags ++ out)
+ end
+
def set_conversation(object) do
Map.put(object, "conversation", object["context"])
end