Merge branch 'develop' of https://git.pleroma.social/pleroma/pleroma into develop
[akkoma] / lib / pleroma / web / mastodon_api / views / instance_view.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 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:
27 URI.merge(Pleroma.Web.base_url(), Keyword.get(instance, :instance_thumbnail)) |> to_string,
28 languages: ["en"],
29 registrations: Keyword.get(instance, :registrations_open),
30 approval_required: Keyword.get(instance, :account_approval_required),
31 # Extra (not present in Mastodon):
32 max_toot_chars: Keyword.get(instance, :limit),
33 poll_limits: Keyword.get(instance, :poll_limits),
34 upload_limit: Keyword.get(instance, :upload_limit),
35 avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
36 background_upload_limit: Keyword.get(instance, :background_upload_limit),
37 banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
38 background_image: Pleroma.Web.base_url() <> Keyword.get(instance, :background_image),
39 chat_limit: Keyword.get(instance, :chat_limit),
40 description_limit: Keyword.get(instance, :description_limit),
41 pleroma: %{
42 metadata: %{
43 account_activation_required: Keyword.get(instance, :account_activation_required),
44 features: features(),
45 federation: federation(),
46 fields_limits: fields_limits(),
47 post_formats: Config.get([:instance, :allowed_post_formats])
48 },
49 stats: %{mau: Pleroma.User.active_user_count()},
50 vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
51 }
52 }
53 end
54
55 def features do
56 [
57 "pleroma_api",
58 "mastodon_api",
59 "mastodon_api_streaming",
60 "polls",
61 "pleroma_explicit_addressing",
62 "shareable_emoji_packs",
63 "multifetch",
64 "pleroma:api/v1/notifications:include_types_filter",
65 if Config.get([:media_proxy, :enabled]) do
66 "media_proxy"
67 end,
68 if Config.get([:gopher, :enabled]) do
69 "gopher"
70 end,
71 if Config.get([:chat, :enabled]) do
72 "chat"
73 end,
74 if Config.get([:instance, :allow_relay]) do
75 "relay"
76 end,
77 if Config.get([:instance, :safe_dm_mentions]) do
78 "safe_dm_mentions"
79 end,
80 "pleroma_emoji_reactions",
81 "pleroma_chat_messages"
82 ]
83 |> Enum.filter(& &1)
84 end
85
86 def federation do
87 quarantined = Config.get([:instance, :quarantined_instances], [])
88
89 if Config.get([:mrf, :transparency]) do
90 {:ok, data} = MRF.describe()
91
92 data
93 |> Map.merge(%{quarantined_instances: quarantined})
94 else
95 %{}
96 end
97 |> Map.put(:enabled, Config.get([:instance, :federating]))
98 end
99
100 def fields_limits do
101 %{
102 max_fields: Config.get([:instance, :max_account_fields]),
103 max_remote_fields: Config.get([:instance, :max_remote_account_fields]),
104 name_length: Config.get([:instance, :account_field_name_length]),
105 value_length: Config.get([:instance, :account_field_value_length])
106 }
107 end
108 end