Merge branch 'develop' into activation-meta
[akkoma] / lib / pleroma / web / mastodon_api / views / instance_view.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.MastodonAPI.InstanceView do
6 use Pleroma.Web, :view
7
8 alias Pleroma.Config
9 alias Pleroma.Web.ActivityPub.MRF
10
11 @mastodon_api_level "2.7.2"
12
13 def render("show.json", _) do
14 instance = Config.get(:instance)
15
16 %{
17 uri: Pleroma.Web.base_url(),
18 title: Keyword.get(instance, :name),
19 description: Keyword.get(instance, :description),
20 version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
21 email: Keyword.get(instance, :email),
22 urls: %{
23 streaming_api: Pleroma.Web.Endpoint.websocket_url()
24 },
25 stats: Pleroma.Stats.get_stats(),
26 thumbnail: Keyword.get(instance, :instance_thumbnail),
27 languages: ["en"],
28 registrations: Keyword.get(instance, :registrations_open),
29 # Extra (not present in Mastodon):
30 max_toot_chars: Keyword.get(instance, :limit),
31 poll_limits: Keyword.get(instance, :poll_limits),
32 upload_limit: Keyword.get(instance, :upload_limit),
33 avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
34 background_upload_limit: Keyword.get(instance, :background_upload_limit),
35 banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
36 background_image: Keyword.get(instance, :background_image),
37 pleroma: %{
38 metadata: %{
39 account_activation_required: Keyword.get(instance, :account_activation_required),
40 features: features(),
41 federation: federation()
42 },
43 vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
44 }
45 }
46 end
47
48 def features do
49 [
50 "pleroma_api",
51 "mastodon_api",
52 "mastodon_api_streaming",
53 "polls",
54 "pleroma_explicit_addressing",
55 "shareable_emoji_packs",
56 "multifetch",
57 "pleroma:api/v1/notifications:include_types_filter",
58 if Config.get([:media_proxy, :enabled]) do
59 "media_proxy"
60 end,
61 if Config.get([:gopher, :enabled]) do
62 "gopher"
63 end,
64 if Config.get([:chat, :enabled]) do
65 "chat"
66 end,
67 if Config.get([:instance, :allow_relay]) do
68 "relay"
69 end,
70 if Config.get([:instance, :safe_dm_mentions]) do
71 "safe_dm_mentions"
72 end,
73 "pleroma_emoji_reactions",
74 "pleroma_chat_messages"
75 ]
76 |> Enum.filter(& &1)
77 end
78
79 def federation do
80 quarantined = Config.get([:instance, :quarantined_instances], [])
81
82 if Config.get([:mrf, :transparency]) do
83 {:ok, data} = MRF.describe()
84
85 data
86 |> Map.merge(%{quarantined_instances: quarantined})
87 else
88 %{}
89 end
90 |> Map.put(:enabled, Config.get([:instance, :federating]))
91 end
92 end