summaryrefslogtreecommitdiff
path: root/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex')
-rw-r--r--lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex42
1 files changed, 37 insertions, 5 deletions
diff --git a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex
index c9b022cf8..255910b2f 100644
--- a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex
+++ b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex
@@ -3,6 +3,8 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent do
+ require Pleroma.Constants
+
alias Pleroma.Formatter
alias Pleroma.Object
alias Pleroma.User
@@ -58,9 +60,25 @@ defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent do
defp sort_replied_user(users, _), do: users
+ # Drop constants and the actor's own AP ID
+ defp clean_recipients(recipients, object) do
+ Enum.reject(recipients, fn ap_id ->
+ ap_id in [
+ object["object"]["actor"],
+ Pleroma.Constants.as_public(),
+ Pleroma.Web.ActivityPub.Utils.as_local_public()
+ ]
+ end)
+ end
+
@impl true
- def filter(%{"type" => "Create", "object" => %{"type" => "Note", "to" => to}} = object)
- when is_list(to) do
+ def filter(
+ %{
+ "type" => "Create",
+ "object" => %{"type" => "Note", "to" => to, "inReplyTo" => in_reply_to}
+ } = object
+ )
+ when is_list(to) and is_binary(in_reply_to) do
# image-only posts from pleroma apparently reach this MRF without the content field
content = object["object"]["content"] || ""
@@ -69,6 +87,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent do
mention_users =
to
+ |> clean_recipients(object)
|> Enum.map(&User.get_cached_by_ap_id/1)
|> Enum.reject(&is_nil/1)
|> sort_replied_user(replied_to_user)
@@ -84,10 +103,23 @@ defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent do
end
end)
- content =
+ recipients_inline =
if added_mentions != "",
- do: "<span class=\"recipients-inline\">#{added_mentions}</span>" <> content,
- else: content
+ do: "<span class=\"recipients-inline\">#{added_mentions}</span>",
+ else: ""
+
+ content =
+ cond do
+ # For Markdown posts, insert the mentions inside the first <p> tag
+ recipients_inline != "" && String.starts_with?(content, "<p>") ->
+ "<p>" <> recipients_inline <> String.trim_leading(content, "<p>")
+
+ recipients_inline != "" ->
+ recipients_inline <> content
+
+ true ->
+ content
+ end
{:ok, put_in(object["object"]["content"], content)}
end