Merge branch 'shortening-modules-name' into 'develop'
[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: Pleroma.Web.base_url() <> "/instance/thumbnail.jpeg",
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 pleroma: %{
37 metadata: %{
38 features: features(),
39 federation: federation()
40 },
41 vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
42 }
43 }
44 end
45
46 def features do
47 [
48 "pleroma_api",
49 "mastodon_api",
50 "mastodon_api_streaming",
51 "polls",
52 "pleroma_explicit_addressing",
53 "shareable_emoji_packs",
54 "multifetch",
55 "pleroma:api/v1/notifications:include_types_filter",
56 if Config.get([:media_proxy, :enabled]) do
57 "media_proxy"
58 end,
59 if Config.get([:gopher, :enabled]) do
60 "gopher"
61 end,
62 if Config.get([:chat, :enabled]) do
63 "chat"
64 end,
65 if Config.get([:instance, :allow_relay]) do
66 "relay"
67 end,
68 if Config.get([:instance, :safe_dm_mentions]) do
69 "safe_dm_mentions"
70 end,
71 "pleroma_emoji_reactions"
72 ]
73 |> Enum.filter(& &1)
74 end
75
76 def federation do
77 quarantined = Config.get([:instance, :quarantined_instances], [])
78
79 if Config.get([:instance, :mrf_transparency]) do
80 {:ok, data} = MRF.describe()
81
82 data
83 |> Map.merge(%{quarantined_instances: quarantined})
84 else
85 %{}
86 end
87 |> Map.put(:enabled, Config.get([:instance, :federating]))
88 end
89 end