From e910f21d8d0246010956385be5bad486243d8e4c Mon Sep 17 00:00:00 2001
From: FloatingGhost <hannah@coffee-and-dreams.uk>
Date: Wed, 8 Jun 2022 13:27:25 +0100
Subject: [PATCH] allow undoing

---
 lib/pleroma/web/activity_pub/utils.ex | 28 +++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex
index 83bb8a552..cca58e0da 100644
--- a/lib/pleroma/web/activity_pub/utils.ex
+++ b/lib/pleroma/web/activity_pub/utils.ex
@@ -349,10 +349,17 @@ defmodule Pleroma.Web.ActivityPub.Utils do
       ) do
     reactions = get_cached_emoji_reactions(object)
     emoji = stripped_emoji_name(emoji)
+    url = emoji_url(emoji, activity)
     new_reactions =
-      case Enum.find_index(reactions, fn [candidate, _, _] -> emoji == candidate end) do
+      case Enum.find_index(reactions, fn [candidate, _, candidate_url] ->
+        if is_nil(candidate_url) do
+            emoji == candidate
+        else
+            url == candidate_url
+        end
+      end) do
         nil ->
-          reactions ++ [[emoji, [actor], emoji_url(emoji, activity)]]
+          reactions ++ [[emoji, [actor], url]]
 
         index ->
           List.update_at(
@@ -386,12 +393,20 @@ defmodule Pleroma.Web.ActivityPub.Utils do
   end
 
   def remove_emoji_reaction_from_object(
-        %Activity{data: %{"content" => emoji, "actor" => actor}},
+        %Activity{data: %{"content" => emoji, "actor" => actor}} = activity,
         object
       ) do
+    emoji = stripped_emoji_name(emoji)
     reactions = get_cached_emoji_reactions(object)
+    url = emoji_url(emoji, activity)
     new_reactions =
-      case Enum.find_index(reactions, fn [candidate, _, _] -> emoji == candidate end) do
+      case Enum.find_index(reactions, fn [candidate, _, candidate_url] ->
+        if is_nil(candidate_url) do
+            emoji == candidate
+        else
+            url == candidate_url
+        end
+      end) do
         nil ->
           reactions
 
@@ -521,6 +536,11 @@ defmodule Pleroma.Web.ActivityPub.Utils do
 
   def get_latest_reaction(internal_activity_id, %{ap_id: ap_id}, emoji) do
     %{data: %{"object" => object_ap_id}} = Activity.get_by_id(internal_activity_id)
+    emoji = if String.starts_with?(emoji, ":") do
+      emoji
+    else
+      ":#{emoji}:"
+    end
 
     "EmojiReact"
     |> Activity.Queries.by_type()