diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 6503d7222..3b575756d 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -243,7 +243,21 @@ def parse_mentions(text) do end def add_user_links(text, mentions) do - Enum.reduce(mentions, text, fn ({match, %User{ap_id: ap_id}}, text) -> String.replace(text, match, "#{match}") end) + mentions = mentions + |> Enum.sort_by(fn ({name, _}) -> -String.length(name) end) + |> Enum.map(fn({name, user}) -> {name, user, Ecto.UUID.generate} end) + + # This replaces the mention with a unique reference first so it doesn't + # contain parts of other replaced mentions. There probably is a better + # solution for this... + step_one = mentions + |> Enum.reduce(text, fn ({match, _user, uuid}, text) -> + String.replace(text, match, uuid) + end) + + Enum.reduce(mentions, step_one, fn ({match, %User{ap_id: ap_id}, uuid}, text) -> + String.replace(text, uuid, "#{match}") + end) end def register_user(params) do diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index ebc9e362f..d70ef88f3 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -236,27 +236,30 @@ test "upload a file" do end test "it can parse mentions and return the relevant users" do - text = "@gsimg According to @archaeme , that is @daggsy." + text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" gsimg = insert(:user, %{nickname: "gsimg"}) archaeme = insert(:user, %{nickname: "archaeme"}) + archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) expected_result = [ {"@gsimg", gsimg}, - {"@archaeme", archaeme} + {"@archaeme", archaeme}, + {"@archaeme@archae.me", archaeme_remote}, ] assert TwitterAPI.parse_mentions(text) == expected_result end test "it adds user links to an existing text" do - text = "@gsimg According to @archaeme , that is @daggsy." + text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" gsimg = insert(:user, %{nickname: "gsimg"}) archaeme = insert(:user, %{nickname: "archaeme"}) + archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) mentions = TwitterAPI.parse_mentions(text) - expected_text = "@gsimg According to @archaeme , that is @daggsy." + expected_text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" assert TwitterAPI.add_user_links(text, mentions) == expected_text end