diff options
Diffstat (limited to 'lib/pleroma/web/common_api')
-rw-r--r-- | lib/pleroma/web/common_api/common_api.ex | 18 | ||||
-rw-r--r-- | lib/pleroma/web/common_api/utils.ex | 36 |
2 files changed, 42 insertions, 12 deletions
diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 849360a16..0f84542f0 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -46,24 +46,36 @@ defmodule Pleroma.Web.CommonAPI do end end + def get_visibility(%{"visibility" => visibility}), do: visibility + def get_visibility(%{"in_reply_to_status_id" => status_id}) when 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"]), mentions <- Formatter.parse_mentions(status), inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]), - to <- to_for_user_and_mentions(user, mentions, inReplyTo), + {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"]), context <- make_context(inReplyTo), cw <- data["spoiler_text"], - object <- make_note_data(user.ap_id, to, context, content_html, attachments, inReplyTo, tags, cw), + 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, user, context, object) + 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})}) + end end diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 2b359dd72..75c63e5f4 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -24,17 +24,34 @@ defmodule Pleroma.Web.CommonAPI.Utils do end) end - def to_for_user_and_mentions(user, mentions, inReplyTo) do - default_to = [ - user.follower_address, - "https://www.w3.org/ns/activitystreams#Public" - ] + def to_for_user_and_mentions(user, mentions, inReplyTo, "public") do + to = ["https://www.w3.org/ns/activitystreams#Public"] - to = default_to ++ 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 - Enum.uniq([inReplyTo.data["actor"] | to]) + {to, Enum.uniq([inReplyTo.data["actor"] | cc])} else - to + {to, cc} + end + end + + def to_for_user_and_mentions(user, mentions, inReplyTo, "unlisted") do + {to, cc} = to_for_user_and_mentions(user, mentions, inReplyTo, "public") + {cc, to} + end + + def to_for_user_and_mentions(user, mentions, inReplyTo, "private") do + {to, cc} = to_for_user_and_mentions(user, mentions, inReplyTo, "direct") + {[user.follower_address | to], cc} + 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) + if inReplyTo do + {Enum.uniq([inReplyTo.data["actor"] | mentioned_users]), []} + else + {mentioned_users, []} end end @@ -99,10 +116,11 @@ defmodule Pleroma.Web.CommonAPI.Utils do end) end - def make_note_data(actor, to, context, content_html, attachments, inReplyTo, tags, cw \\ nil) do + 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, |