activitypub: implement IR-level considerations for Listen activities
This commit is contained in:
parent
b7877e9b1c
commit
1f9de2a8cd
3 changed files with 72 additions and 1 deletions
|
@ -248,6 +248,26 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def listen(%{to: to, actor: actor, context: context, object: object} = params) do
|
||||||
|
additional = params[:additional] || %{}
|
||||||
|
# only accept false as false value
|
||||||
|
local = !(params[:local] == false)
|
||||||
|
published = params[:published]
|
||||||
|
|
||||||
|
with listen_data <-
|
||||||
|
make_listen_data(
|
||||||
|
%{to: to, actor: actor, published: published, context: context, object: object},
|
||||||
|
additional
|
||||||
|
),
|
||||||
|
{:ok, activity} <- insert(listen_data, local),
|
||||||
|
:ok <- maybe_federate(activity) do
|
||||||
|
{:ok, activity}
|
||||||
|
else
|
||||||
|
{:error, message} ->
|
||||||
|
{:error, message}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def accept(%{to: to, actor: actor, object: object} = params) do
|
def accept(%{to: to, actor: actor, object: object} = params) do
|
||||||
# only accept false as false value
|
# only accept false as false value
|
||||||
local = !(params[:local] == false)
|
local = !(params[:local] == false)
|
||||||
|
|
|
@ -20,7 +20,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
|
||||||
require Logger
|
require Logger
|
||||||
require Pleroma.Constants
|
require Pleroma.Constants
|
||||||
|
|
||||||
@supported_object_types ["Article", "Note", "Video", "Page", "Question", "Answer"]
|
@supported_object_types ["Article", "Note", "Video", "Page", "Question", "Answer", "Audio"]
|
||||||
@supported_report_states ~w(open closed resolved)
|
@supported_report_states ~w(open closed resolved)
|
||||||
@valid_visibilities ~w(public unlisted private direct)
|
@valid_visibilities ~w(public unlisted private direct)
|
||||||
|
|
||||||
|
@ -581,6 +581,21 @@ defmodule Pleroma.Web.ActivityPub.Utils do
|
||||||
|> Map.merge(additional)
|
|> Map.merge(additional)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#### Listen-related helpers
|
||||||
|
def make_listen_data(params, additional) do
|
||||||
|
published = params.published || make_date()
|
||||||
|
|
||||||
|
%{
|
||||||
|
"type" => "Listen",
|
||||||
|
"to" => params.to |> Enum.uniq(),
|
||||||
|
"actor" => params.actor.ap_id,
|
||||||
|
"object" => params.object,
|
||||||
|
"published" => published,
|
||||||
|
"context" => params.context
|
||||||
|
}
|
||||||
|
|> Map.merge(additional)
|
||||||
|
end
|
||||||
|
|
||||||
#### Flag-related helpers
|
#### Flag-related helpers
|
||||||
@spec make_flag_data(map(), map()) :: map()
|
@spec make_flag_data(map(), map()) :: map()
|
||||||
def make_flag_data(%{actor: actor, context: context, content: content} = params, additional) do
|
def make_flag_data(%{actor: actor, context: context, content: content} = params, additional) do
|
||||||
|
|
|
@ -257,6 +257,42 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "listen activities" do
|
||||||
|
test "does not increase user note count" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} =
|
||||||
|
ActivityPub.listen(%{
|
||||||
|
to: ["https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
actor: user,
|
||||||
|
context: "",
|
||||||
|
object: %{
|
||||||
|
"actor" => user.ap_id,
|
||||||
|
"to" => ["https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
"artist" => "lain",
|
||||||
|
"title" => "lain radio episode 1",
|
||||||
|
"length" => 180_000,
|
||||||
|
"type" => "Audio"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
assert activity.actor == user.ap_id
|
||||||
|
|
||||||
|
user = User.get_cached_by_id(user.id)
|
||||||
|
assert user.info.note_count == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
test "can be fetched into a timeline" do
|
||||||
|
_listen_activity_1 = insert(:listen)
|
||||||
|
_listen_activity_2 = insert(:listen)
|
||||||
|
_listen_activity_3 = insert(:listen)
|
||||||
|
|
||||||
|
timeline = ActivityPub.fetch_activities([], %{"type" => ["Listen"]})
|
||||||
|
|
||||||
|
assert length(timeline) == 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "create activities" do
|
describe "create activities" do
|
||||||
test "removes doubled 'to' recipients" do
|
test "removes doubled 'to' recipients" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue