From cac39ef8173a627668ee622b905523968f871846 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Sat, 25 Jun 2022 15:27:46 +0100 Subject: [PATCH 1/2] Bugfix: standardise scheme for emoji reactions --- lib/pleroma/emoji.ex | 6 +++- .../emoji_reaction_controller_test.exs | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/emoji.ex b/lib/pleroma/emoji.ex index 9e1858ae7..ced2ae83d 100644 --- a/lib/pleroma/emoji.ex +++ b/lib/pleroma/emoji.ex @@ -159,7 +159,11 @@ def maybe_quote(name) when is_binary(name) do if is_unicode_emoji?(name) do name else - ":#{name}:" + if String.starts_with?(name, ":") do + name + else + ":#{name}:" + end end end diff --git a/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs index 3f47ceb75..65bb22e27 100644 --- a/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/emoji_reaction_controller_test.exs @@ -34,6 +34,30 @@ test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do %{"name" => "☕", "count" => 1, "me" => true, "url" => nil} ] + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + + ObanHelpers.perform_all() + # Reacting with a custom emoji + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:") + |> json_response_and_validate_schema(200) + + # We return the status, but this our implementation detail. + assert %{"id" => id} = result + assert to_string(activity.id) == id + + assert result["pleroma"]["emoji_reactions"] == [ + %{ + "name" => "dinosaur", + "count" => 1, + "me" => true, + "url" => "http://localhost:4001/emoji/dino walking.gif" + } + ] + # Reacting with a non-emoji assert conn |> assign(:user, other_user) @@ -48,6 +72,7 @@ test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, ":dinosaur:") ObanHelpers.perform_all() @@ -60,6 +85,17 @@ test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do assert %{"id" => id} = json_response_and_validate_schema(result, 200) assert to_string(activity.id) == id + # Remove custom emoji + + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:") + + assert %{"id" => id} = json_response_and_validate_schema(result, 200) + assert to_string(activity.id) == id + ObanHelpers.perform_all() object = Object.get_by_ap_id(activity.data["object"]) From 45b7d18871b4c27d65468fc8ac88b4c78f8ed295 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Sat, 25 Jun 2022 15:45:10 +0100 Subject: [PATCH 2/2] update api spec for custom emoji reaction --- .../operations/emoji_reaction_operation.ex | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex index a7b306a30..b254fc57b 100644 --- a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex +++ b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex @@ -43,10 +43,14 @@ def index_operation do def create_operation do %Operation{ tags: ["Emoji reactions"], - summary: "React to a post with a unicode emoji", + summary: "React to a post with either a unicode or custom emoji", parameters: [ Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), - Operation.parameter(:emoji, :path, :string, "A single character unicode emoji", + Operation.parameter( + :emoji, + :path, + :string, + "A single character unicode emoji, or a \:shortcode\: format emoji name", required: true ) ], @@ -62,10 +66,14 @@ def create_operation do def delete_operation do %Operation{ tags: ["Emoji reactions"], - summary: "Remove a reaction to a post with a unicode emoji", + summary: "Remove a reaction to a post with either a unicode or custom emoji", parameters: [ Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), - Operation.parameter(:emoji, :path, :string, "A single character unicode emoji", + Operation.parameter( + :emoji, + :path, + :string, + "A single character unicode emoji, or a \:shortcode\: format emoji name", required: true ) ], @@ -81,7 +89,7 @@ defp array_of_reactions_response do Operation.response("Array of Emoji reactions", "application/json", %Schema{ type: :array, items: emoji_reaction(), - example: [emoji_reaction().example] + example: emoji_reaction().example }) end @@ -93,18 +101,34 @@ defp emoji_reaction do name: %Schema{type: :string, description: "Emoji"}, count: %Schema{type: :integer, description: "Count of reactions with this emoji"}, me: %Schema{type: :boolean, description: "Did I react with this emoji?"}, + url: %Schema{ + type: :string, + description: "URL of the emoji if it's custom - otherwise null", + nullable: true, + format: "url" + }, accounts: %Schema{ type: :array, items: Account, description: "Array of accounts reacted with this emoji" } }, - example: %{ - "name" => "😱", - "count" => 1, - "me" => false, - "accounts" => [Account.schema().example] - } + example: [ + %{ + "name" => "😱", + "count" => 1, + "me" => false, + "url" => nil, + "accounts" => [Account.schema().example] + }, + %{ + "name" => "dinosaur", + "count" => 1, + "me" => false, + "url" => "https://akkoma.dev/emoji/dinosaur.png", + "accounts" => [Account.schema().example] + } + ] } end end