Show bubble_timeline in the api if any instances are set in it, do not show if none...
[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.Endpoint.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.Endpoint.url(), Keyword.get(instance, :instance_thumbnail))
28 |> to_string,
29 languages: Keyword.get(instance, :languages, ["en"]),
30 registrations: Keyword.get(instance, :registrations_open),
31 approval_required: Keyword.get(instance, :account_approval_required),
32 # Extra (not present in Mastodon):
33 max_toot_chars: Keyword.get(instance, :limit),
34 poll_limits: Keyword.get(instance, :poll_limits),
35 upload_limit: Keyword.get(instance, :upload_limit),
36 avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
37 background_upload_limit: Keyword.get(instance, :background_upload_limit),
38 banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
39 background_image: Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
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 privileged_staff: Config.get([:instance, :privileged_staff])
49 },
50 stats: %{mau: Pleroma.User.active_user_count()},
51 vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
52 }
53 }
54 end
55
56 def features do
57 [
58 "pleroma_api",
59 "akkoma_api",
60 "mastodon_api",
61 "mastodon_api_streaming",
62 "polls",
63 "v2_suggestions",
64 "pleroma_explicit_addressing",
65 "shareable_emoji_packs",
66 "multifetch",
67 "pleroma:api/v1/notifications:include_types_filter",
68 "quote_posting",
69 "editing",
70 if Config.get([:instance, :local_bubble], []) != [] do
71 "bubble_timeline"
72 end,
73 if Config.get([:media_proxy, :enabled]) do
74 "media_proxy"
75 end,
76 if Config.get([:instance, :allow_relay]) do
77 "relay"
78 end,
79 if Config.get([:instance, :safe_dm_mentions]) do
80 "safe_dm_mentions"
81 end,
82 "pleroma_emoji_reactions",
83 if Config.get([:instance, :show_reactions]) do
84 "exposable_reactions"
85 end,
86 if Config.get([:instance, :profile_directory]) do
87 "profile_directory"
88 end,
89 if Config.get([:translator, :enabled], false) do
90 "akkoma:machine_translation"
91 end,
92 "custom_emoji_reactions",
93 "pleroma:get:main/ostatus"
94 ]
95 |> Enum.filter(& &1)
96 end
97
98 def federation do
99 quarantined = Config.get([:instance, :quarantined_instances], [])
100
101 if Config.get([:mrf, :transparency]) do
102 {:ok, data} = MRF.describe()
103
104 data
105 |> Map.put(
106 :quarantined_instances,
107 Enum.map(quarantined, fn {instance, _reason} -> instance end)
108 )
109 # This is for backwards compatibility. We originally didn't sent
110 # extra info like a reason why an instance was rejected/quarantined/etc.
111 # Because we didn't want to break backwards compatibility it was decided
112 # to add an extra "info" key.
113 |> Map.put(:quarantined_instances_info, %{
114 "quarantined_instances" =>
115 quarantined
116 |> Enum.map(fn {instance, reason} -> {instance, %{"reason" => reason}} end)
117 |> Map.new()
118 })
119 else
120 %{}
121 end
122 |> Map.put(:enabled, Config.get([:instance, :federating]))
123 end
124
125 def fields_limits do
126 %{
127 max_fields: Config.get([:instance, :max_account_fields]),
128 max_remote_fields: Config.get([:instance, :max_remote_account_fields]),
129 name_length: Config.get([:instance, :account_field_name_length]),
130 value_length: Config.get([:instance, :account_field_value_length])
131 }
132 end
133 end