if activity.data["type"] in ["Create", "Announce"] do
Pleroma.Web.Streamer.stream("user", activity)
- if Enum.member?(activity.data["to"], "https://www.w3.org/ns/activitystreams#Public") do
- Pleroma.Web.Streamer.stream("public", activity)
+ visibility = Pleroma.Web.MastodonAPI.StatusView.get_visibility(activity.data["object"])
- if activity.local do
- Pleroma.Web.Streamer.stream("public:local", activity)
- end
+ case visibility do
+ "public" ->
+ Pleroma.Web.Streamer.stream("public", activity)
+ if activity.local, do: Pleroma.Web.Streamer.stream("public:local", activity)
+
+ "direct" ->
+ Pleroma.Web.Streamer.stream("direct", activity)
end
end
end
|> Enum.reverse()
end
+ @valid_visibilities ~w[direct unlisted public private]
+
+ defp restrict_visibility(query, %{visibility: "direct"}) do
+ public = "https://www.w3.org/ns/activitystreams#Public"
+
+ from(
+ activity in query,
+ join: sender in User,
+ on: sender.ap_id == activity.actor,
+ where:
+ fragment("not data->'to' \\? ?", ^public) and fragment("not data->'cc' \\? ?", ^public) and
+ fragment("not data->'to' \\? ?", sender.follower_address)
+ )
+ end
+
+ defp restrict_visibility(_query, %{visibility: visibility})
+ when visibility not in @valid_visibilities do
+ Logger.error("Could not restrict visibility to #{visibility}")
+ end
+
+ defp restrict_visibility(query, _visibility), do: query
+
defp restrict_since(query, %{"since_id" => since_id}) do
from(activity in query, where: activity.id > ^since_id)
end
|> restrict_recent(opts)
|> restrict_blocked(opts)
|> restrict_media(opts)
+ |> restrict_visibility(opts)
end
def fetch_activities(recipients, opts \\ %{}) do