forked from YokaiRick/akkoma
Merge branch 'fix/copy-emoji-summary' into 'develop'
Copy emoji in the subject from parent post See merge request pleroma/pleroma!3378
This commit is contained in:
commit
c09844d3d2
4 changed files with 111 additions and 0 deletions
|
@ -5,6 +5,7 @@
|
||||||
defmodule Pleroma.Web.CommonAPI.ActivityDraft do
|
defmodule Pleroma.Web.CommonAPI.ActivityDraft do
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Conversation.Participation
|
alias Pleroma.Conversation.Participation
|
||||||
|
alias Pleroma.Object
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
|
|
||||||
|
@ -186,6 +187,32 @@ defp sensitive(draft) do
|
||||||
defp object(draft) do
|
defp object(draft) do
|
||||||
emoji = Map.merge(Pleroma.Emoji.Formatter.get_emoji_map(draft.full_payload), draft.emoji)
|
emoji = Map.merge(Pleroma.Emoji.Formatter.get_emoji_map(draft.full_payload), draft.emoji)
|
||||||
|
|
||||||
|
# Sometimes people create posts with subject containing emoji,
|
||||||
|
# since subjects are usually copied this will result in a broken
|
||||||
|
# subject when someone replies from an instance that does not have
|
||||||
|
# the emoji or has it under different shortcode. This is an attempt
|
||||||
|
# to mitigate this by copying emoji from inReplyTo if they are present
|
||||||
|
# in the subject.
|
||||||
|
summary_emoji =
|
||||||
|
with %Activity{} <- draft.in_reply_to,
|
||||||
|
%Object{data: %{"tag" => [_ | _] = tag}} <- Object.normalize(draft.in_reply_to) do
|
||||||
|
Enum.reduce(tag, %{}, fn
|
||||||
|
%{"type" => "Emoji", "name" => name, "icon" => %{"url" => url}}, acc ->
|
||||||
|
if String.contains?(draft.summary, name) do
|
||||||
|
Map.put(acc, name, url)
|
||||||
|
else
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
|
||||||
|
_, acc ->
|
||||||
|
acc
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
_ -> %{}
|
||||||
|
end
|
||||||
|
|
||||||
|
emoji = Map.merge(emoji, summary_emoji)
|
||||||
|
|
||||||
object =
|
object =
|
||||||
Utils.make_note_data(draft)
|
Utils.make_note_data(draft)
|
||||||
|> Map.put("emoji", emoji)
|
|> Map.put("emoji", emoji)
|
||||||
|
|
49
test/fixtures/tesla_mock/emoji-in-summary.json
vendored
Normal file
49
test/fixtures/tesla_mock/emoji-in-summary.json
vendored
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
{
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://patch.cx/schemas/litepub-0.1.jsonld",
|
||||||
|
{
|
||||||
|
"@language": "und"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"actor": "https://patch.cx/users/rin",
|
||||||
|
"attachment": [],
|
||||||
|
"attributedTo": "https://patch.cx/users/rin",
|
||||||
|
"cc": [
|
||||||
|
"https://patch.cx/users/rin/followers"
|
||||||
|
],
|
||||||
|
"content": ":joker_disapprove: <br><br>just grabbing a test fixture, nevermind me",
|
||||||
|
"context": "https://patch.cx/contexts/2c3ce4b4-18b1-4b1a-8965-3932027b5326",
|
||||||
|
"conversation": "https://patch.cx/contexts/2c3ce4b4-18b1-4b1a-8965-3932027b5326",
|
||||||
|
"id": "https://patch.cx/objects/a399c28e-c821-4820-bc3e-4afeb044c16f",
|
||||||
|
"published": "2021-03-22T16:54:46.461939Z",
|
||||||
|
"sensitive": null,
|
||||||
|
"source": ":joker_disapprove: \r\n\r\njust grabbing a test fixture, nevermind me",
|
||||||
|
"summary": ":joker_smile: ",
|
||||||
|
"tag": [
|
||||||
|
{
|
||||||
|
"icon": {
|
||||||
|
"type": "Image",
|
||||||
|
"url": "https://patch.cx/emoji/custom/joker_disapprove.png"
|
||||||
|
},
|
||||||
|
"id": "https://patch.cx/emoji/custom/joker_disapprove.png",
|
||||||
|
"name": ":joker_disapprove:",
|
||||||
|
"type": "Emoji",
|
||||||
|
"updated": "1970-01-01T00:00:00Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": {
|
||||||
|
"type": "Image",
|
||||||
|
"url": "https://patch.cx/emoji/custom/joker_smile.png"
|
||||||
|
},
|
||||||
|
"id": "https://patch.cx/emoji/custom/joker_smile.png",
|
||||||
|
"name": ":joker_smile:",
|
||||||
|
"type": "Emoji",
|
||||||
|
"updated": "1970-01-01T00:00:00Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
],
|
||||||
|
"type": "Note"
|
||||||
|
}
|
|
@ -25,6 +25,11 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
|
|
||||||
require Pleroma.Constants
|
require Pleroma.Constants
|
||||||
|
|
||||||
|
setup_all do
|
||||||
|
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
setup do: clear_config([:instance, :safe_dm_mentions])
|
setup do: clear_config([:instance, :safe_dm_mentions])
|
||||||
setup do: clear_config([:instance, :limit])
|
setup do: clear_config([:instance, :limit])
|
||||||
setup do: clear_config([:instance, :max_pinned_statuses])
|
setup do: clear_config([:instance, :max_pinned_statuses])
|
||||||
|
@ -517,6 +522,27 @@ test "it adds an emoji on an external site" do
|
||||||
assert url == "#{Pleroma.Web.base_url()}/emoji/blank.png"
|
assert url == "#{Pleroma.Web.base_url()}/emoji/blank.png"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it copies emoji from the subject of the parent post" do
|
||||||
|
%Object{} =
|
||||||
|
object =
|
||||||
|
Object.normalize("https://patch.cx/objects/a399c28e-c821-4820-bc3e-4afeb044c16f",
|
||||||
|
fetch: true
|
||||||
|
)
|
||||||
|
|
||||||
|
activity = Activity.get_create_by_object_ap_id(object.data["id"])
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, reply_activity} =
|
||||||
|
CommonAPI.post(user, %{
|
||||||
|
in_reply_to_id: activity.id,
|
||||||
|
status: ":joker_disapprove:",
|
||||||
|
spoiler_text: ":joker_smile:"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert Object.normalize(reply_activity).data["emoji"][":joker_smile:"]
|
||||||
|
refute Object.normalize(reply_activity).data["emoji"][":joker_disapprove:"]
|
||||||
|
end
|
||||||
|
|
||||||
test "deactivated users can't post" do
|
test "deactivated users can't post" do
|
||||||
user = insert(:user, is_active: false)
|
user = insert(:user, is_active: false)
|
||||||
assert {:error, _} = CommonAPI.post(user, %{status: "ye"})
|
assert {:error, _} = CommonAPI.post(user, %{status: "ye"})
|
||||||
|
|
|
@ -1278,6 +1278,15 @@ def get("https://osada.macgirvin.com/", _, "", [{"accept", "text/html"}]) do
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get("https://patch.cx/objects/a399c28e-c821-4820-bc3e-4afeb044c16f", _, _, _) do
|
||||||
|
{:ok,
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body: File.read!("test/fixtures/tesla_mock/emoji-in-summary.json"),
|
||||||
|
headers: activitypub_object_headers()
|
||||||
|
}}
|
||||||
|
end
|
||||||
|
|
||||||
def get(url, query, body, headers) do
|
def get(url, query, body, headers) do
|
||||||
{:error,
|
{:error,
|
||||||
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{
|
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{
|
||||||
|
|
Loading…
Reference in a new issue