forked from AkkomaGang/akkoma
activitypub: add support for filtering broken threads out of timelines
This commit is contained in:
parent
ae7c79cfc2
commit
26eb11c172
3 changed files with 37 additions and 1 deletions
|
@ -787,4 +787,37 @@ def visible_for_user?(activity, user) do
|
||||||
y = activity.data["to"] ++ (activity.data["cc"] || [])
|
y = activity.data["to"] ++ (activity.data["cc"] || [])
|
||||||
visible_for_user?(activity, nil) || Enum.any?(x, &(&1 in y))
|
visible_for_user?(activity, nil) || Enum.any?(x, &(&1 in y))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# guard
|
||||||
|
def entire_thread_visible_for_user?(nil, user), do: false
|
||||||
|
|
||||||
|
# child
|
||||||
|
def entire_thread_visible_for_user?(
|
||||||
|
%Activity{data: %{"object" => %{"inReplyTo" => _parent_id}}} = tail,
|
||||||
|
user
|
||||||
|
) do
|
||||||
|
parent = Activity.get_in_reply_to_activity(tail)
|
||||||
|
visible_for_user?(tail, user) && entire_thread_visible_for_user?(parent, user)
|
||||||
|
end
|
||||||
|
|
||||||
|
# root
|
||||||
|
def entire_thread_visible_for_user?(tail, user), do: visible_for_user?(tail, user)
|
||||||
|
|
||||||
|
# filter out broken threads
|
||||||
|
def contain_broken_threads(%Activity{} = activity, %User{} = user) do
|
||||||
|
entire_thread_visible_for_user?(activity, user)
|
||||||
|
end
|
||||||
|
|
||||||
|
# do post-processing on a specific activity
|
||||||
|
def contain_activity(%Activity{} = activity, %User{} = user) do
|
||||||
|
contain_broken_threads(activity, user)
|
||||||
|
end
|
||||||
|
|
||||||
|
# do post-processing on a timeline
|
||||||
|
def contain_timeline(timeline, user) do
|
||||||
|
timeline
|
||||||
|
|> Enum.filter(fn activity ->
|
||||||
|
contain_activity(activity, user)
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -223,6 +223,7 @@ def home_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
|
|
||||||
activities =
|
activities =
|
||||||
ActivityPub.fetch_activities([user.ap_id | user.following], params)
|
ActivityPub.fetch_activities([user.ap_id | user.following], params)
|
||||||
|
|> ActivityPub.contain_timeline(user)
|
||||||
|> Enum.reverse()
|
|> Enum.reverse()
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -79,7 +79,9 @@ def friends_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|
|
||||||
activities = ActivityPub.fetch_activities([user.ap_id | user.following], params)
|
activities =
|
||||||
|
ActivityPub.fetch_activities([user.ap_id | user.following], params)
|
||||||
|
|> ActivityPub.contain_timeline(user)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> render(ActivityView, "index.json", %{activities: activities, for: user})
|
|> render(ActivityView, "index.json", %{activities: activities, for: user})
|
||||||
|
|
Loading…
Reference in a new issue