pleroma/lib/pleroma/web/common_api/common_api.ex

258 lines
7.8 KiB
Elixir
Raw Normal View History

# Pleroma: A lightweight social networking server
2018-12-31 16:41:47 +01:00
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
2017-09-09 13:56:51 +02:00
defmodule Pleroma.Web.CommonAPI do
2019-02-09 16:16:26 +01:00
alias Pleroma.User
alias Pleroma.Repo
alias Pleroma.Activity
alias Pleroma.Object
alias Pleroma.ThreadMute
2017-09-09 13:56:51 +02:00
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Formatter
import Pleroma.Web.CommonAPI.Utils
2017-09-09 13:56:51 +02:00
def follow(follower, followed) do
with {:ok, follower} <- User.maybe_direct_follow(follower, followed),
{:ok, activity} <- ActivityPub.follow(follower, followed),
{:ok, follower, followed} <-
User.wait_and_refresh(
Pleroma.Config.get([:activitypub, :follow_handshake_timeout]),
follower,
followed
) do
{:ok, follower, followed, activity}
end
end
2017-09-09 13:56:51 +02:00
def delete(activity_id, user) do
with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id),
%Object{} = object <- Object.normalize(object_id),
2018-11-20 19:15:28 +01:00
true <- user.info.is_moderator || user.ap_id == object.data["actor"],
2019-01-11 06:31:31 +01:00
{:ok, _} <- unpin(activity_id, user),
{:ok, delete} <- ActivityPub.delete(object) do
2017-09-09 13:56:51 +02:00
{:ok, delete}
end
end
2017-09-09 17:48:57 +02:00
def repeat(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
object <- Object.normalize(activity.data["object"]["id"]),
nil <- Utils.get_existing_announce(user.ap_id, object) do
2017-09-09 17:48:57 +02:00
ActivityPub.announce(user, object)
else
_ ->
{:error, "Could not repeat"}
end
end
2018-04-14 09:39:16 +02:00
def unrepeat(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
object <- Object.normalize(activity.data["object"]["id"]) do
2018-04-14 09:39:16 +02:00
ActivityPub.unannounce(user, object)
else
_ ->
{:error, "Could not unrepeat"}
end
end
2017-09-09 18:09:37 +02:00
def favorite(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
object <- Object.normalize(activity.data["object"]["id"]),
nil <- Utils.get_existing_like(user.ap_id, object) do
2017-09-09 18:09:37 +02:00
ActivityPub.like(user, object)
else
_ ->
{:error, "Could not favorite"}
end
end
2017-09-09 18:30:02 +02:00
def unfavorite(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
object <- Object.normalize(activity.data["object"]["id"]) do
2017-09-09 18:30:02 +02:00
ActivityPub.unlike(user, object)
else
_ ->
{:error, "Could not unfavorite"}
end
end
2018-03-30 15:01:53 +02:00
def get_visibility(%{"visibility" => visibility})
when visibility in ~w{public unlisted private direct},
do: visibility
2018-03-30 12:19:57 +02:00
def get_visibility(%{"in_reply_to_status_id" => status_id}) when not is_nil(status_id) do
case get_replied_to_activity(status_id) do
nil ->
"public"
inReplyTo ->
Pleroma.Web.MastodonAPI.StatusView.get_visibility(inReplyTo.data["object"])
end
end
2018-03-30 15:01:53 +02:00
def get_visibility(_), do: "public"
def post(user, %{"status" => status} = data) do
visibility = get_visibility(data)
limit = Pleroma.Config.get([:instance, :limit])
2018-03-30 15:01:53 +02:00
with status <- String.trim(status),
attachments <- attachments_from_ids(data),
inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]),
2019-02-27 00:32:26 +01:00
{content_html, mentions, tags} <-
make_content_html(
status,
attachments,
2019-02-27 00:32:26 +01:00
data
),
2019-02-27 00:32:26 +01:00
{to, cc} <- to_for_user_and_mentions(user, mentions, inReplyTo, visibility),
2017-09-17 15:21:44 +02:00
context <- make_context(inReplyTo),
2017-10-31 19:44:36 +01:00
cw <- data["spoiler_text"],
full_payload <- String.trim(status <> (data["spoiler_text"] || "")),
length when length in 1..limit <- String.length(full_payload),
2018-03-30 15:01:53 +02:00
object <-
make_note_data(
user.ap_id,
to,
context,
content_html,
attachments,
inReplyTo,
tags,
cw,
cc
),
object <-
Map.put(
object,
"emoji",
2019-01-05 18:35:39 +01:00
(Formatter.get_emoji(status) ++ Formatter.get_emoji(data["spoiler_text"]))
2018-03-30 15:01:53 +02:00
|> Enum.reduce(%{}, fn {name, file}, acc ->
Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}")
end)
) do
res =
ActivityPub.create(%{
to: to,
actor: user,
context: context,
object: object,
additional: %{"cc" => cc, "directMessage" => visibility == "direct"}
2018-03-30 15:01:53 +02:00
})
res
2017-09-09 17:48:57 +02:00
end
end
2018-02-25 21:02:44 +01:00
2018-11-20 20:12:39 +01:00
# Updates the emojis for a user based on their profile
2018-02-25 21:02:44 +01:00
def update(user) do
user =
with emoji <- emoji_from_profile(user),
2018-11-20 20:12:39 +01:00
source_data <- (user.info.source_data || %{}) |> Map.put("tag", emoji),
info_cng <- Pleroma.User.Info.set_source_data(user.info, source_data),
change <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng),
{:ok, user} <- User.update_and_set_cache(change) do
user
else
_e ->
user
end
2018-03-30 15:01:53 +02:00
ActivityPub.update(%{
local: true,
to: [user.follower_address],
cc: [],
actor: user.ap_id,
object: Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user})
})
2018-02-25 21:02:44 +01:00
end
2019-01-07 14:45:33 +01:00
def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do
2019-01-30 20:05:27 +01:00
with {_,
%Activity{
actor: ^user_ap_id,
data: %{
"type" => "Create"
}
} = activity} <- {:user_error, get_by_id_or_ap_id(id_or_ap_id)},
2019-01-29 18:48:04 +01:00
%Object{data: %{"actor" => ^user_ap_id, "type" => "Note"}} = object <-
Refactor pinned posts to use objects instead of activities. Despacito lyrics in the description don't open Ay Fonsi DY Oh Oh no, oh no Oh yeah Diridiri, dirididi Daddy Go Sí, sabes que ya llevo un rato mirándote Tengo que bailar contigo hoy (DY) Vi que tu mirada ya estaba llamándome Muéstrame el camino que yo voy (Oh) Tú, tú eres el imán y yo soy el metal Me voy acercando y voy armando el plan Solo con pensarlo se acelera el pulso (Oh yeah) Ya, ya me está gustando más de lo normal Todos mis sentidos van pidiendo más Esto hay que tomarlo sin ningún apuro Despacito Quiero respirar tu cuello despacito Deja que te diga cosas al oído Para que te acuerdes si no estás conmigo Despacito Quiero desnudarte a besos despacito Firmo en las paredes de tu laberinto Y hacer de tu cuerpo todo un manuscrito (sube, sube, sube) (Sube, sube) Quiero ver bailar tu pelo Quiero ser tu ritmo Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Déjame sobrepasar tus zonas de peligro Hasta provocar tus gritos Y que olvides tu apellido (Diridiri, dirididi Daddy) Si te pido un beso ven dámelo Yo sé que estás pensándolo Llevo tiempo intentándolo Mami, esto es dando y dándolo Sabes que tu corazón conmigo te hace bom, bom Sabes que esa beba está buscando de mi bom, bom Ven prueba de mi boca para ver cómo te sabe Quiero, quiero, quiero ver cuánto amor a ti te cabe Yo no tengo prisa, yo me quiero dar el viaje Empecemos lento, después salvaje Pasito a pasito, suave suavecito Nos vamos pegando poquito a poquito Cuando tú me besas con esa destreza Veo que eres malicia con delicadeza Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Y es que esa belleza es un rompecabezas Pero pa montarlo aquí tengo la pieza Despacito Quiero respirar tu cuello despacito Deja que te diga cosas al oído Para que te acuerdes si no estás conmigo Despacito Quiero desnudarte a besos despacito Firmo en las paredes de tu laberinto Y hacer de tu cuerpo todo un manuscrito (sube, sube, sube) (Sube, sube) Quiero ver bailar tu pelo Quiero ser tu ritmo Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Déjame sobrepasar tus zonas de peligro Hasta provocar tus gritos Y que olvides tu apellido Despacito Vamos a hacerlo en una playa en Puerto Rico Hasta que las olas griten "¡ay, bendito!" Para que mi sello se quede contigo Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Hasta provocar tus gritos Y que olvides tu apellido (DY) Despacito
2019-01-26 16:29:43 +01:00
Object.normalize(activity.data["object"]),
{:ok, _activity, _object} <- ActivityPub.pin(user, object) do
2019-01-07 14:45:33 +01:00
{:ok, activity}
else
2019-01-30 20:05:27 +01:00
{:user_error, _} ->
{:error, "Could not pin"}
e ->
e
2019-01-07 14:45:33 +01:00
end
end
def unpin(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
Refactor pinned posts to use objects instead of activities. Despacito lyrics in the description don't open Ay Fonsi DY Oh Oh no, oh no Oh yeah Diridiri, dirididi Daddy Go Sí, sabes que ya llevo un rato mirándote Tengo que bailar contigo hoy (DY) Vi que tu mirada ya estaba llamándome Muéstrame el camino que yo voy (Oh) Tú, tú eres el imán y yo soy el metal Me voy acercando y voy armando el plan Solo con pensarlo se acelera el pulso (Oh yeah) Ya, ya me está gustando más de lo normal Todos mis sentidos van pidiendo más Esto hay que tomarlo sin ningún apuro Despacito Quiero respirar tu cuello despacito Deja que te diga cosas al oído Para que te acuerdes si no estás conmigo Despacito Quiero desnudarte a besos despacito Firmo en las paredes de tu laberinto Y hacer de tu cuerpo todo un manuscrito (sube, sube, sube) (Sube, sube) Quiero ver bailar tu pelo Quiero ser tu ritmo Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Déjame sobrepasar tus zonas de peligro Hasta provocar tus gritos Y que olvides tu apellido (Diridiri, dirididi Daddy) Si te pido un beso ven dámelo Yo sé que estás pensándolo Llevo tiempo intentándolo Mami, esto es dando y dándolo Sabes que tu corazón conmigo te hace bom, bom Sabes que esa beba está buscando de mi bom, bom Ven prueba de mi boca para ver cómo te sabe Quiero, quiero, quiero ver cuánto amor a ti te cabe Yo no tengo prisa, yo me quiero dar el viaje Empecemos lento, después salvaje Pasito a pasito, suave suavecito Nos vamos pegando poquito a poquito Cuando tú me besas con esa destreza Veo que eres malicia con delicadeza Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Y es que esa belleza es un rompecabezas Pero pa montarlo aquí tengo la pieza Despacito Quiero respirar tu cuello despacito Deja que te diga cosas al oído Para que te acuerdes si no estás conmigo Despacito Quiero desnudarte a besos despacito Firmo en las paredes de tu laberinto Y hacer de tu cuerpo todo un manuscrito (sube, sube, sube) (Sube, sube) Quiero ver bailar tu pelo Quiero ser tu ritmo Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Déjame sobrepasar tus zonas de peligro Hasta provocar tus gritos Y que olvides tu apellido Despacito Vamos a hacerlo en una playa en Puerto Rico Hasta que las olas griten "¡ay, bendito!" Para que mi sello se quede contigo Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Hasta provocar tus gritos Y que olvides tu apellido (DY) Despacito
2019-01-26 16:29:43 +01:00
%Object{} = object <- Object.normalize(activity.data["object"]),
2019-01-29 18:48:04 +01:00
ActivityPub.unpin(user, object) do
2019-01-07 14:45:33 +01:00
{:ok, activity}
else
Refactor pinned posts to use objects instead of activities. Despacito lyrics in the description don't open Ay Fonsi DY Oh Oh no, oh no Oh yeah Diridiri, dirididi Daddy Go Sí, sabes que ya llevo un rato mirándote Tengo que bailar contigo hoy (DY) Vi que tu mirada ya estaba llamándome Muéstrame el camino que yo voy (Oh) Tú, tú eres el imán y yo soy el metal Me voy acercando y voy armando el plan Solo con pensarlo se acelera el pulso (Oh yeah) Ya, ya me está gustando más de lo normal Todos mis sentidos van pidiendo más Esto hay que tomarlo sin ningún apuro Despacito Quiero respirar tu cuello despacito Deja que te diga cosas al oído Para que te acuerdes si no estás conmigo Despacito Quiero desnudarte a besos despacito Firmo en las paredes de tu laberinto Y hacer de tu cuerpo todo un manuscrito (sube, sube, sube) (Sube, sube) Quiero ver bailar tu pelo Quiero ser tu ritmo Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Déjame sobrepasar tus zonas de peligro Hasta provocar tus gritos Y que olvides tu apellido (Diridiri, dirididi Daddy) Si te pido un beso ven dámelo Yo sé que estás pensándolo Llevo tiempo intentándolo Mami, esto es dando y dándolo Sabes que tu corazón conmigo te hace bom, bom Sabes que esa beba está buscando de mi bom, bom Ven prueba de mi boca para ver cómo te sabe Quiero, quiero, quiero ver cuánto amor a ti te cabe Yo no tengo prisa, yo me quiero dar el viaje Empecemos lento, después salvaje Pasito a pasito, suave suavecito Nos vamos pegando poquito a poquito Cuando tú me besas con esa destreza Veo que eres malicia con delicadeza Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Y es que esa belleza es un rompecabezas Pero pa montarlo aquí tengo la pieza Despacito Quiero respirar tu cuello despacito Deja que te diga cosas al oído Para que te acuerdes si no estás conmigo Despacito Quiero desnudarte a besos despacito Firmo en las paredes de tu laberinto Y hacer de tu cuerpo todo un manuscrito (sube, sube, sube) (Sube, sube) Quiero ver bailar tu pelo Quiero ser tu ritmo Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Déjame sobrepasar tus zonas de peligro Hasta provocar tus gritos Y que olvides tu apellido Despacito Vamos a hacerlo en una playa en Puerto Rico Hasta que las olas griten "¡ay, bendito!" Para que mi sello se quede contigo Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Que le enseñes a mi boca Tus lugares favoritos (favoritos, favoritos baby) Pasito a pasito, suave suavecito Nos vamos pegando, poquito a poquito Hasta provocar tus gritos Y que olvides tu apellido (DY) Despacito
2019-01-26 16:29:43 +01:00
%{errors: [pinned_objects: {err, _}]} ->
2019-01-07 14:45:33 +01:00
{:error, err}
_ ->
{:error, "Could not unpin"}
end
end
def add_mute(user, activity) do
with {:ok, _} <- ThreadMute.add_mute(user.id, activity.data["context"]) do
{:ok, activity}
else
{:error, _} -> {:error, "conversation is already muted"}
end
end
def remove_mute(user, activity) do
ThreadMute.remove_mute(user.id, activity.data["context"])
{:ok, activity}
end
def thread_muted?(%{id: nil} = _user, _activity), do: false
def thread_muted?(user, activity) do
with [] <- ThreadMute.check_muted(user.id, activity.data["context"]) do
false
else
_ -> true
end
end
2019-02-20 17:51:25 +01:00
def report(user, data) do
with {:account_id, %{"account_id" => account_id}} <- {:account_id, data},
{:account, %User{} = account} <- {:account, User.get_by_id(account_id)},
2019-02-27 00:32:26 +01:00
{:ok, {content_html, _, _}} <- make_report_content_html(data["comment"]),
2019-02-20 17:51:25 +01:00
{:ok, statuses} <- get_report_statuses(account, data),
{:ok, activity} <-
ActivityPub.flag(%{
context: Utils.generate_context_id(),
actor: user,
account: account,
statuses: statuses,
content: content_html
}) do
Enum.each(User.all_superusers(), fn superuser ->
superuser
|> Pleroma.AdminEmail.report(user, account, statuses, content_html)
|> Pleroma.Mailer.deliver_async()
end)
{:ok, activity}
else
{:error, err} -> {:error, err}
{:account_id, %{}} -> {:error, "Valid `account_id` required"}
{:account, nil} -> {:error, "Account not found"}
end
end
2017-09-09 13:56:51 +02:00
end