forked from AkkomaGang/akkoma
Merge branch '1907-fix-announce-streaming' into 'develop'
Resolve "Streaming API: Repeats of your posts from random people are pushed to the timeline" Closes #1907 See merge request pleroma/pleroma!2714
This commit is contained in:
commit
b0439df1b5
5 changed files with 40 additions and 3 deletions
|
@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
<summary>API Changes</summary>
|
<summary>API Changes</summary>
|
||||||
|
|
||||||
- **Breaking:** Emoji API: changed methods and renamed routes.
|
- **Breaking:** Emoji API: changed methods and renamed routes.
|
||||||
|
- Streaming: Repeats of a user's posts will no longer be pushed to the user's stream.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
|
@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
|
||||||
collection, and so on.
|
collection, and so on.
|
||||||
"""
|
"""
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Activity.Ir.Topics
|
||||||
alias Pleroma.Chat
|
alias Pleroma.Chat
|
||||||
alias Pleroma.Chat.MessageReference
|
alias Pleroma.Chat.MessageReference
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
|
@ -97,7 +98,10 @@ def handle(%{data: %{"type" => "Announce"}} = object, meta) do
|
||||||
|
|
||||||
if !User.is_internal_user?(user) do
|
if !User.is_internal_user?(user) do
|
||||||
Notification.create_notifications(object)
|
Notification.create_notifications(object)
|
||||||
ActivityPub.stream_out(object)
|
|
||||||
|
object
|
||||||
|
|> Topics.get_activity_topics()
|
||||||
|
|> Streamer.stream(object)
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok, object, meta}
|
{:ok, object, meta}
|
||||||
|
|
|
@ -116,6 +116,7 @@ def filtered_by_user?(%User{} = user, %Activity{} = item) do
|
||||||
true <-
|
true <-
|
||||||
Enum.all?([blocked_ap_ids, muted_ap_ids], &(item.actor not in &1)),
|
Enum.all?([blocked_ap_ids, muted_ap_ids], &(item.actor not in &1)),
|
||||||
true <- item.data["type"] != "Announce" || item.actor not in reblog_muted_ap_ids,
|
true <- item.data["type"] != "Announce" || item.actor not in reblog_muted_ap_ids,
|
||||||
|
true <- !(item.data["type"] == "Announce" && parent.data["actor"] == user.ap_id),
|
||||||
true <- Enum.all?([blocked_ap_ids, muted_ap_ids], &(parent.data["actor"] not in &1)),
|
true <- Enum.all?([blocked_ap_ids, muted_ap_ids], &(parent.data["actor"] not in &1)),
|
||||||
true <- MapSet.disjoint?(recipients, recipient_blocks),
|
true <- MapSet.disjoint?(recipients, recipient_blocks),
|
||||||
%{host: item_host} <- URI.parse(item.actor),
|
%{host: item_host} <- URI.parse(item.actor),
|
||||||
|
|
|
@ -589,10 +589,29 @@ test "creates a notification", %{announce: announce, poster: poster} do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it streams out the announce", %{announce: announce} do
|
test "it streams out the announce", %{announce: announce} do
|
||||||
with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], stream_out: fn _ -> nil end do
|
with_mocks([
|
||||||
|
{
|
||||||
|
Pleroma.Web.Streamer,
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
stream: fn _, _ -> nil end
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Pleroma.Web.Push,
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
send: fn _ -> nil end
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]) do
|
||||||
{:ok, announce, _} = SideEffects.handle(announce)
|
{:ok, announce, _} = SideEffects.handle(announce)
|
||||||
|
|
||||||
assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(announce))
|
assert called(
|
||||||
|
Pleroma.Web.Streamer.stream(["user", "list", "public", "public:local"], announce)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert called(Pleroma.Web.Push.send(:_))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -116,6 +116,18 @@ test "it streams boosts of the user in the 'user' stream", %{user: user} do
|
||||||
refute Streamer.filtered_by_user?(user, announce)
|
refute Streamer.filtered_by_user?(user, announce)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it does not stream announces of the user's own posts in the 'user' stream", %{
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
Streamer.get_topic_and_add_socket("user", user)
|
||||||
|
|
||||||
|
other_user = insert(:user)
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{status: "hey"})
|
||||||
|
{:ok, announce} = CommonAPI.repeat(activity.id, other_user)
|
||||||
|
|
||||||
|
assert Streamer.filtered_by_user?(user, announce)
|
||||||
|
end
|
||||||
|
|
||||||
test "it streams boosts of mastodon user in the 'user' stream", %{user: user} do
|
test "it streams boosts of mastodon user in the 'user' stream", %{user: user} do
|
||||||
Streamer.get_topic_and_add_socket("user", user)
|
Streamer.get_topic_and_add_socket("user", user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue