CommonAPI: add emoji to user source data on update
authoreal <eal@waifu.club>
Sun, 12 Aug 2018 19:24:10 +0000 (22:24 +0300)
committereal <eal@waifu.club>
Mon, 13 Aug 2018 12:27:20 +0000 (15:27 +0300)
lib/pleroma/web/common_api/common_api.ex
lib/pleroma/web/common_api/utils.ex
test/web/common_api/common_api_test.exs
test/web/common_api/common_api_utils_test.exs

index 3f18a68e8a9e527b723ac23625f3959c4a8d5788..4be6e75085c6dc7d0b9b985a4de58ccdbba75895 100644 (file)
@@ -1,5 +1,5 @@
 defmodule Pleroma.Web.CommonAPI do
-  alias Pleroma.{Repo, Activity, Object}
+  alias Pleroma.{User, Repo, Activity, Object}
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Formatter
 
@@ -118,6 +118,18 @@ defmodule Pleroma.Web.CommonAPI do
   end
 
   def update(user) do
+    user =
+      with emoji <- emoji_from_profile(user),
+           source_data <- (user.info["source_data"] || %{}) |> Map.put("tag", emoji),
+           new_info <- Map.put(user.info, "source_data", source_data),
+           change <- User.info_changeset(user, %{info: new_info}),
+           {:ok, user} <- User.update_and_set_cache(change) do
+        user
+      else
+        _e ->
+          user
+      end
+
     ActivityPub.update(%{
       local: true,
       to: [user.follower_address],
index 30089f553abbbf1646f6cd6e748bdd0828dfd7c3..f6960bf4146fa5267b90fcb7be9a682bc3b162dc 100644 (file)
@@ -1,6 +1,7 @@
 defmodule Pleroma.Web.CommonAPI.Utils do
   alias Pleroma.{Repo, Object, Formatter, Activity}
   alias Pleroma.Web.ActivityPub.Utils
+  alias Pleroma.Web.Endpoint
   alias Pleroma.User
   alias Calendar.Strftime
   alias Comeonin.Pbkdf2
@@ -196,4 +197,15 @@ defmodule Pleroma.Web.CommonAPI.Utils do
       _ -> {:error, "Invalid password."}
     end
   end
+
+  def emoji_from_profile(%{info: info} = user) do
+    (Formatter.get_emoji(user.bio) ++ Formatter.get_emoji(user.name))
+    |> Enum.map(fn {shortcode, url} ->
+      %{
+        "type" => "Emoji",
+        "icon" => %{"url" => "#{Endpoint.url()}#{url}"},
+        "name" => ":#{shortcode}:"
+      }
+    end)
+  end
 end
index a5da271b31e52696676f0a78db940f5769298a37..2a2c40833839bfbd28f9890c2a6fc1cc161687c7 100644 (file)
@@ -1,6 +1,7 @@
 defmodule Pleroma.Web.CommonAPI.Test do
   use Pleroma.DataCase
   alias Pleroma.Web.CommonAPI
+  alias Pleroma.User
 
   import Pleroma.Factory
 
@@ -10,4 +11,14 @@ defmodule Pleroma.Web.CommonAPI.Test do
 
     assert activity.data["object"]["tag"] == ["2hu"]
   end
+
+  test "it adds emoji when updating profiles" do
+    user = insert(:user, %{name: ":karjalanpiirakka:"})
+
+    CommonAPI.update(user)
+    user = User.get_cached_by_ap_id(user.ap_id)
+    [karjalanpiirakka] = user.info["source_data"]["tag"]
+
+    assert karjalanpiirakka["name"] == ":karjalanpiirakka:"
+  end
 end
index f39472ee33b1dc309423fc2a8a10dcd6fab04fca..cf97b2bfd2a33ae7a713365c791b539bc30d876f 100644 (file)
@@ -1,5 +1,6 @@
 defmodule Pleroma.Web.CommonAPI.UtilsTest do
   alias Pleroma.Web.CommonAPI.Utils
+  alias Pleroma.Web.Endpoint
   alias Pleroma.Builders.{UserBuilder}
   use Pleroma.DataCase
 
@@ -29,4 +30,23 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
       assert Utils.confirm_current_password(user, "test") == {:ok, user}
     end
   end
+
+  test "parses emoji from name and bio" do
+    {:ok, user} = UserBuilder.insert(%{name: ":karjalanpiirakka:", bio: ":perkele:"})
+
+    expected = [
+      %{
+        "type" => "Emoji",
+        "icon" => %{"url" => "#{Endpoint.url()}/finmoji/128px/perkele-128.png"},
+        "name" => ":perkele:"
+      },
+      %{
+        "type" => "Emoji",
+        "icon" => %{"url" => "#{Endpoint.url()}/finmoji/128px/karjalanpiirakka-128.png"},
+        "name" => ":karjalanpiirakka:"
+      }
+    ]
+
+    assert expected == Utils.emoji_from_profile(user)
+  end
 end