Implement muting, add it to the mastodon API
This commit is contained in:
parent
1dd718e83c
commit
f41f017bbc
5 changed files with 58 additions and 2 deletions
|
@ -888,6 +888,28 @@ def blocks_import(%User{} = blocker, blocked_identifiers) when is_list(blocked_i
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def mute(muter, %User{ap_id: ap_id} = muted) do
|
||||||
|
if following?(muter, muter) do
|
||||||
|
unfollow(muter, muter)
|
||||||
|
end
|
||||||
|
|
||||||
|
mutes = muter.info["mutes"] || []
|
||||||
|
new_mutes = Enum.uniq([ap_id | mutes])
|
||||||
|
new_info = Map.put(muter.info, "mutes", new_mutes)
|
||||||
|
|
||||||
|
cs = User.info_changeset(muter, %{info: new_info})
|
||||||
|
update_and_set_cache(cs)
|
||||||
|
end
|
||||||
|
|
||||||
|
def unmute(user, %{ap_id: ap_id}) do
|
||||||
|
mutes = user.info["mutes"] || []
|
||||||
|
new_mutes = List.delete(mutes, ap_id)
|
||||||
|
new_info = Map.put(user.info, "mutes", new_mutes)
|
||||||
|
|
||||||
|
cs = User.info_changeset(user, %{info: new_info})
|
||||||
|
update_and_set_cache(cs)
|
||||||
|
end
|
||||||
|
|
||||||
def block(blocker, %User{ap_id: ap_id} = blocked) do
|
def block(blocker, %User{ap_id: ap_id} = blocked) do
|
||||||
# sever any follow relationships to prevent leaks per activitypub (Pleroma issue #213)
|
# sever any follow relationships to prevent leaks per activitypub (Pleroma issue #213)
|
||||||
blocker =
|
blocker =
|
||||||
|
@ -930,6 +952,8 @@ def unblock(blocker, %{ap_id: ap_id}) do
|
||||||
update_and_set_cache(cng)
|
update_and_set_cache(cng)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def mutes?(user, %{ap_id: ap_id}), do: Enum.member?(user.info["mutes"] || [], ap_id)
|
||||||
|
|
||||||
def blocks?(user, %{ap_id: ap_id}) do
|
def blocks?(user, %{ap_id: ap_id}) do
|
||||||
blocks = user.info.blocks
|
blocks = user.info.blocks
|
||||||
domain_blocks = user.info.domain_blocks
|
domain_blocks = user.info.domain_blocks
|
||||||
|
|
|
@ -576,6 +576,18 @@ defp restrict_reblogs(query, %{"exclude_reblogs" => val}) when val == "true" or
|
||||||
|
|
||||||
defp restrict_reblogs(query, _), do: query
|
defp restrict_reblogs(query, _), do: query
|
||||||
|
|
||||||
|
defp restrict_muted(query, %{"muting_user" => %User{info: info}}) do
|
||||||
|
mutes = info["mutes"] || []
|
||||||
|
|
||||||
|
from(
|
||||||
|
activity in query,
|
||||||
|
where: fragment("not (? = ANY(?))", activity.actor, ^mutes),
|
||||||
|
where: fragment("not (?->'to' \\?| ?)", activity.data, ^mutes)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp restrict_muted(query, _), do: query
|
||||||
|
|
||||||
defp restrict_blocked(query, %{"blocking_user" => %User{info: info}}) do
|
defp restrict_blocked(query, %{"blocking_user" => %User{info: info}}) do
|
||||||
blocks = info.blocks || []
|
blocks = info.blocks || []
|
||||||
domain_blocks = info.domain_blocks || []
|
domain_blocks = info.domain_blocks || []
|
||||||
|
@ -629,6 +641,7 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
|> restrict_type(opts)
|
|> restrict_type(opts)
|
||||||
|> restrict_favorited_by(opts)
|
|> restrict_favorited_by(opts)
|
||||||
|> restrict_blocked(opts)
|
|> restrict_blocked(opts)
|
||||||
|
|> restrict_muted(opts)
|
||||||
|> restrict_media(opts)
|
|> restrict_media(opts)
|
||||||
|> restrict_visibility(opts)
|
|> restrict_visibility(opts)
|
||||||
|> restrict_replies(opts)
|
|> restrict_replies(opts)
|
||||||
|
|
|
@ -232,6 +232,7 @@ def home_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
params
|
params
|
||||||
|> Map.put("type", ["Create", "Announce"])
|
|> Map.put("type", ["Create", "Announce"])
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|
|
||||||
activities =
|
activities =
|
||||||
|
@ -254,6 +255,7 @@ def public_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> Map.put("type", ["Create", "Announce"])
|
|> Map.put("type", ["Create", "Announce"])
|
||||||
|> Map.put("local_only", local_only)
|
|> Map.put("local_only", local_only)
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|
|> Map.put("muting_user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|> Enum.reverse()
|
|> Enum.reverse()
|
||||||
|
|
||||||
|
@ -620,6 +622,7 @@ def hashtag_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> Map.put("type", "Create")
|
|> Map.put("type", "Create")
|
||||||
|> Map.put("local_only", local_only)
|
|> Map.put("local_only", local_only)
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("tag", tags)
|
|> Map.put("tag", tags)
|
||||||
|> Map.put("tag_all", tag_all)
|
|> Map.put("tag_all", tag_all)
|
||||||
|> Map.put("tag_reject", tag_reject)
|
|> Map.put("tag_reject", tag_reject)
|
||||||
|
@ -763,6 +766,20 @@ def unfollow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def mute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
|
||||||
|
with %User{} = muted <- Repo.get(User, id),
|
||||||
|
{:ok, muter} <- User.mute(muter, muted) do
|
||||||
|
render(conn, AccountView, "relationship.json", %{user: muter, target: muted})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def unmute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
|
||||||
|
with %User{} = muted <- Repo.get(User, id),
|
||||||
|
{:ok, muter} <- User.unmute(muter, muted) do
|
||||||
|
render(conn, AccountView, "relationship.json", %{user: muter, target: muted})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def block(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
|
def block(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
|
||||||
with %User{} = blocked <- Repo.get(User, id),
|
with %User{} = blocked <- Repo.get(User, id),
|
||||||
{:ok, blocker} <- User.block(blocker, blocked),
|
{:ok, blocker} <- User.block(blocker, blocked),
|
||||||
|
@ -1018,6 +1035,7 @@ def list_timeline(%{assigns: %{user: user}} = conn, %{"list_id" => id} = params)
|
||||||
params
|
params
|
||||||
|> Map.put("type", "Create")
|
|> Map.put("type", "Create")
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|
|> Map.put("muting_user", user)
|
||||||
|
|
||||||
# we must filter the following list for the user to avoid leaking statuses the user
|
# we must filter the following list for the user to avoid leaking statuses the user
|
||||||
# does not actually have permission to see (for more info, peruse security issue #270).
|
# does not actually have permission to see (for more info, peruse security issue #270).
|
||||||
|
|
|
@ -47,6 +47,7 @@ def render("relationship.json", %{user: user, target: target}) do
|
||||||
following: User.following?(user, target),
|
following: User.following?(user, target),
|
||||||
followed_by: User.following?(target, user),
|
followed_by: User.following?(target, user),
|
||||||
blocking: User.blocks?(user, target),
|
blocking: User.blocks?(user, target),
|
||||||
|
muting: User.mutes?(user, target),
|
||||||
muting: false,
|
muting: false,
|
||||||
muting_notifications: false,
|
muting_notifications: false,
|
||||||
requested: requested,
|
requested: requested,
|
||||||
|
|
|
@ -166,8 +166,8 @@ defmodule Pleroma.Web.Router do
|
||||||
post("/accounts/:id/unfollow", MastodonAPIController, :unfollow)
|
post("/accounts/:id/unfollow", MastodonAPIController, :unfollow)
|
||||||
post("/accounts/:id/block", MastodonAPIController, :block)
|
post("/accounts/:id/block", MastodonAPIController, :block)
|
||||||
post("/accounts/:id/unblock", MastodonAPIController, :unblock)
|
post("/accounts/:id/unblock", MastodonAPIController, :unblock)
|
||||||
post("/accounts/:id/mute", MastodonAPIController, :relationship_noop)
|
post("/accounts/:id/mute", MastodonAPIController, :mute)
|
||||||
post("/accounts/:id/unmute", MastodonAPIController, :relationship_noop)
|
post("/accounts/:id/unmute", MastodonAPIController, :unmute)
|
||||||
get("/accounts/:id/lists", MastodonAPIController, :account_lists)
|
get("/accounts/:id/lists", MastodonAPIController, :account_lists)
|
||||||
|
|
||||||
get("/follow_requests", MastodonAPIController, :follow_requests)
|
get("/follow_requests", MastodonAPIController, :follow_requests)
|
||||||
|
|
Loading…
Reference in a new issue