X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fpleroma%2Fweb%2Fmastodon_api%2Fviews%2Faccount_view.ex;h=af56c41498be8a604d318597ec7eb6eb6d950aa6;hb=73df3046e014ae16e03f16a9c82921652cefcb54;hp=85cce754a7859865126a5f5ceaa4026cc4969448;hpb=44a650235bcb49900a84f50b2ee4d75593231c38;p=akkoma diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 85cce754a..af56c4149 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -1,41 +1,144 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Pleroma.Web.MastodonAPI.AccountView do use Pleroma.Web, :view + + alias Pleroma.HTML alias Pleroma.User + alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.MediaProxy + + def render("accounts.json", %{users: users} = opts) do + users + |> render_many(AccountView, "account.json", opts) + |> Enum.filter(&Enum.any?/1) + end + + def render("account.json", %{user: user} = opts) do + if User.visible_for?(user, opts[:for]), + do: do_render("account.json", opts), + else: %{} + end + + def render("mention.json", %{user: user}) do + %{ + id: to_string(user.id), + acct: user.nickname, + username: username_from_nickname(user.nickname), + url: user.ap_id + } + end - defp image_url(%{"url" => [ %{ "href" => href } | t ]}), do: href - defp image_url(_), do: nil + def render("relationship.json", %{user: nil, target: _target}) do + %{} + end - def render("account.json", %{user: user}) do - image = User.avatar_url(user) + def render("relationship.json", %{user: %User{} = user, target: %User{} = target}) do + follow_activity = Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(user, target) + + requested = + if follow_activity do + follow_activity.data["state"] == "pending" + else + false + end + + %{ + id: to_string(target.id), + following: User.following?(user, target), + followed_by: User.following?(target, user), + blocking: User.blocks?(user, target), + muting: User.mutes?(user, target), + muting_notifications: false, + subscribing: User.subscribed_to?(user, target), + requested: requested, + domain_blocking: false, + showing_reblogs: User.showing_reblogs?(user, target), + endorsed: false + } + end + + def render("relationships.json", %{user: user, targets: targets}) do + render_many(targets, AccountView, "relationship.json", user: user, as: :target) + end + + defp do_render("account.json", %{user: user} = opts) do + image = User.avatar_url(user) |> MediaProxy.url() + header = User.banner_url(user) |> MediaProxy.url() user_info = User.user_info(user) + bot = (user.info.source_data["type"] || "Person") in ["Application", "Service"] + + emojis = + (user.info.source_data["tag"] || []) + |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) + |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> + %{ + "shortcode" => String.trim(name, ":"), + "url" => MediaProxy.url(url), + "static_url" => MediaProxy.url(url), + "visible_in_picker" => false + } + end) - header = image_url(user.info["banner"]) || "https://placehold.it/700x335" + fields = + (user.info.source_data["attachment"] || []) + |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end) + |> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end) + + bio = HTML.filter_tags(user.bio, User.html_filter_policy(opts[:for])) + + relationship = render("relationship.json", %{user: opts[:for], target: user}) %{ - id: user.id, - username: hd(String.split(user.nickname, "@")), + id: to_string(user.id), + username: username_from_nickname(user.nickname), acct: user.nickname, - display_name: user.name, - locked: false, - created_at: user.inserted_at, + display_name: user.name || user.nickname, + locked: user_info.locked, + created_at: Utils.to_masto_date(user.inserted_at), followers_count: user_info.follower_count, following_count: user_info.following_count, statuses_count: user_info.note_count, - note: user.bio, + note: bio || "", url: user.ap_id, avatar: image, avatar_static: image, header: header, - header_static: header + header_static: header, + emojis: emojis, + fields: fields, + bot: bot, + source: %{ + note: "", + privacy: user_info.default_scope, + sensitive: false + }, + + # Pleroma extension + pleroma: + %{ + confirmation_pending: user_info.confirmation_pending, + tags: user.tags, + is_moderator: user.info.is_moderator, + is_admin: user.info.is_admin, + relationship: relationship + } + |> with_notification_settings(user, opts[:for]) } end - def render("mention.json", %{user: user}) do - %{ - id: user.id, - acct: user.nickname, - username: hd(String.split(user.nickname, "@")), - url: user.ap_id - } + defp username_from_nickname(string) when is_binary(string) do + hd(String.split(string, "@")) end + + defp username_from_nickname(_), do: nil + + defp with_notification_settings(data, %User{id: user_id} = user, %User{id: user_id}) do + Map.put(data, :notification_settings, user.info.notification_settings) + end + + defp with_notification_settings(data, _, _), do: data end