diff options
Diffstat (limited to 'lib/pleroma/web/common_api')
-rw-r--r-- | lib/pleroma/web/common_api/common_api.ex | 53 | ||||
-rw-r--r-- | lib/pleroma/web/common_api/utils.ex | 92 |
2 files changed, 103 insertions, 42 deletions
diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 5fc940261..21225c3b7 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -8,7 +8,7 @@ defmodule Pleroma.Web.CommonAPI do def delete(activity_id, user) do with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id), %Object{} = object <- Object.get_by_ap_id(object_id), - true <- user.info["is_moderator"] || (user.ap_id == object.data["actor"]), + true <- user.info["is_moderator"] || user.ap_id == object.data["actor"], {:ok, delete} <- ActivityPub.delete(object) do {:ok, delete} end @@ -46,17 +46,22 @@ defmodule Pleroma.Web.CommonAPI do end end - def get_visibility(%{"visibility" => visibility}) when visibility in ~w{public unlisted private direct}, do: visibility + def get_visibility(%{"visibility" => visibility}) + when visibility in ~w{public unlisted private direct}, + do: visibility + def get_visibility(%{"in_reply_to_status_id" => status_id}) when not is_nil(status_id) do inReplyTo = get_replied_to_activity(status_id) Pleroma.Web.MastodonAPI.StatusView.get_visibility(inReplyTo.data["object"]) end + def get_visibility(_), do: "public" @instance Application.get_env(:pleroma, :instance) @limit Keyword.get(@instance, :limit) def post(user, %{"status" => status} = data) do visibility = get_visibility(data) + with status <- String.trim(status), length when length in 1..@limit <- String.length(status), attachments <- attachments_from_ids(data["media_ids"]), @@ -64,18 +69,52 @@ defmodule Pleroma.Web.CommonAPI do inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]), {to, cc} <- to_for_user_and_mentions(user, mentions, inReplyTo, visibility), tags <- Formatter.parse_tags(status, data), - content_html <- make_content_html(status, mentions, attachments, tags, data["no_attachment_links"]), + content_html <- + make_content_html(status, mentions, attachments, tags, data["no_attachment_links"]), context <- make_context(inReplyTo), cw <- data["spoiler_text"], - object <- make_note_data(user.ap_id, to, context, content_html, attachments, inReplyTo, tags, cw, cc), - object <- Map.put(object, "emoji", Formatter.get_emoji(status) |> Enum.reduce(%{}, fn({name, file}, acc) -> Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url}#{file}") end)) do - res = ActivityPub.create(%{to: to, actor: user, context: context, object: object, additional: %{"cc" => cc}}) + object <- + make_note_data( + user.ap_id, + to, + context, + content_html, + attachments, + inReplyTo, + tags, + cw, + cc + ), + object <- + Map.put( + object, + "emoji", + Formatter.get_emoji(status) + |> Enum.reduce(%{}, fn {name, file}, acc -> + Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}") + end) + ) do + res = + ActivityPub.create(%{ + to: to, + actor: user, + context: context, + object: object, + additional: %{"cc" => cc} + }) + User.increase_note_count(user) res end end def update(user) do - ActivityPub.update(%{local: true, to: [user.follower_address], cc: [], actor: user.ap_id, object: Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user})}) + ActivityPub.update(%{ + local: true, + to: [user.follower_address], + cc: [], + actor: user.ap_id, + object: Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user}) + }) end end diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 3c09f0cc7..49c4ee1eb 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do # This is a hack for twidere. def get_by_id_or_ap_id(id) do activity = Repo.get(Activity, id) || Activity.get_create_activity_by_object_ap_id(id) + if activity.data["type"] == "Create" do activity else @@ -16,10 +17,11 @@ defmodule Pleroma.Web.CommonAPI.Utils do def get_replied_to_activity(id) when not is_nil(id) do Repo.get(Activity, id) end + def get_replied_to_activity(_), do: nil def attachments_from_ids(ids) do - Enum.map(ids || [], fn (media_id) -> + Enum.map(ids || [], fn media_id -> Repo.get(Object, media_id).data end) end @@ -27,8 +29,9 @@ defmodule Pleroma.Web.CommonAPI.Utils do def to_for_user_and_mentions(user, mentions, inReplyTo, "public") do to = ["https://www.w3.org/ns/activitystreams#Public"] - mentioned_users = Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end) + mentioned_users = Enum.map(mentions, fn {_, %{ap_id: ap_id}} -> ap_id end) cc = [user.follower_address | mentioned_users] + if inReplyTo do {to, Enum.uniq([inReplyTo.data["actor"] | cc])} else @@ -47,7 +50,8 @@ defmodule Pleroma.Web.CommonAPI.Utils do end def to_for_user_and_mentions(user, mentions, inReplyTo, "direct") do - mentioned_users = Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end) + mentioned_users = Enum.map(mentions, fn {_, %{ap_id: ap_id}} -> ap_id end) + if inReplyTo do {Enum.uniq([inReplyTo.data["actor"] | mentioned_users]), []} else @@ -62,55 +66,72 @@ defmodule Pleroma.Web.CommonAPI.Utils do end def make_context(%Activity{data: %{"context" => context}}), do: context - def make_context(_), do: Utils.generate_context_id + def make_context(_), do: Utils.generate_context_id() def maybe_add_attachments(text, attachments, _no_links = true), do: text + def maybe_add_attachments(text, attachments, _no_links) do add_attachments(text, attachments) end + def add_attachments(text, attachments) do - attachment_text = Enum.map(attachments, fn - (%{"url" => [%{"href" => href} | _]}) -> - name = URI.decode(Path.basename(href)) - "<a href=\"#{href}\" class='attachment'>#{shortname(name)}</a>" - _ -> "" - end) + attachment_text = + Enum.map(attachments, fn + %{"url" => [%{"href" => href} | _]} -> + name = URI.decode(Path.basename(href)) + "<a href=\"#{href}\" class='attachment'>#{shortname(name)}</a>" + + _ -> + "" + end) + Enum.join([text | attachment_text], "<br>") end def format_input(text, mentions, tags) do text - |> Formatter.html_escape + |> Formatter.html_escape() |> String.replace("\n", "<br>") - |> (&({[], &1})).() - |> Formatter.add_links + |> (&{[], &1}).() + |> Formatter.add_links() |> Formatter.add_user_links(mentions) |> Formatter.add_hashtag_links(tags) - |> Formatter.finalize + |> Formatter.finalize() end def add_tag_links(text, tags) do - tags = tags - |> Enum.sort_by(fn ({tag, _}) -> -String.length(tag) end) + tags = + tags + |> Enum.sort_by(fn {tag, _} -> -String.length(tag) end) - Enum.reduce(tags, text, fn({full, tag}, text) -> - url = "#<a href='#{Pleroma.Web.base_url}/tag/#{tag}' rel='tag'>#{tag}</a>" + Enum.reduce(tags, text, fn {full, tag}, text -> + url = "#<a href='#{Pleroma.Web.base_url()}/tag/#{tag}' rel='tag'>#{tag}</a>" String.replace(text, full, url) end) end - def make_note_data(actor, to, context, content_html, attachments, inReplyTo, tags, cw \\ nil, cc \\ []) do - object = %{ - "type" => "Note", - "to" => to, - "cc" => cc, - "content" => content_html, - "summary" => cw, - "context" => context, - "attachment" => attachments, - "actor" => actor, - "tag" => tags |> Enum.map(fn ({_, tag}) -> tag end) - } + def make_note_data( + actor, + to, + context, + content_html, + attachments, + inReplyTo, + tags, + cw \\ nil, + cc \\ [] + ) do + object = %{ + "type" => "Note", + "to" => to, + "cc" => cc, + "content" => content_html, + "summary" => cw, + "context" => context, + "attachment" => attachments, + "actor" => actor, + "tag" => tags |> Enum.map(fn {_, tag} -> tag end) + } if inReplyTo do object @@ -130,24 +151,25 @@ defmodule Pleroma.Web.CommonAPI.Utils do end def date_to_asctime(date) do - with {:ok, date, _offset} <- date |> DateTime.from_iso8601 do + with {:ok, date, _offset} <- date |> DateTime.from_iso8601() do format_asctime(date) - else _e -> + else + _e -> "" end end def to_masto_date(%NaiveDateTime{} = date) do date - |> NaiveDateTime.to_iso8601 + |> NaiveDateTime.to_iso8601() |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false) end def to_masto_date(date) do try do date - |> NaiveDateTime.from_iso8601! - |> NaiveDateTime.to_iso8601 + |> NaiveDateTime.from_iso8601!() + |> NaiveDateTime.to_iso8601() |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false) rescue _e -> "" |