From 30d65639c1bea2471752ed9c142ada63437f6d09 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 13 Mar 2018 08:05:43 +0100 Subject: [PATCH] Fix Mastodon emojis. Code by Kaniini --- .../web/activity_pub/transmogrifier.ex | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) 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