964a855319
Expose quote posting in the api as a feature. Copies what the quote post PR for pleroma does to allow external clients to enable and disable features based on the feature-set of the instance. As far as I am aware, akkoma doesn't allow you to disable quote posting, so this doesn't need anything fancy and it's just a hard on switch. I tried to get one for the bubble tl to work also, but I'm not quite sure how to do it so that it switches off the feature when the bubble tl is disabled. I would argue that it could and ideally should be done as well though. I also discovered a pretty tame bug in the testing of it, that deleting the DB entry for the bubble tl does not stop the bubble TL from actually working and it will continue to display the panel on the about page, I'll just leave it as a note here. Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/496 Co-authored-by: foxing <foxing@noreply.akkoma> Co-committed-by: foxing <foxing@noreply.akkoma>
131 lines
4.4 KiB
Elixir
131 lines
4.4 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.MastodonAPI.InstanceView do
|
|
use Pleroma.Web, :view
|
|
|
|
alias Pleroma.Config
|
|
alias Pleroma.Web.ActivityPub.MRF
|
|
|
|
@mastodon_api_level "2.7.2"
|
|
|
|
def render("show.json", _) do
|
|
instance = Config.get(:instance)
|
|
|
|
%{
|
|
uri: Pleroma.Web.Endpoint.url(),
|
|
title: Keyword.get(instance, :name),
|
|
description: Keyword.get(instance, :description),
|
|
version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
|
|
email: Keyword.get(instance, :email),
|
|
urls: %{
|
|
streaming_api: Pleroma.Web.Endpoint.websocket_url()
|
|
},
|
|
stats: Pleroma.Stats.get_stats(),
|
|
thumbnail:
|
|
URI.merge(Pleroma.Web.Endpoint.url(), Keyword.get(instance, :instance_thumbnail))
|
|
|> to_string,
|
|
languages: Keyword.get(instance, :languages, ["en"]),
|
|
registrations: Keyword.get(instance, :registrations_open),
|
|
approval_required: Keyword.get(instance, :account_approval_required),
|
|
# Extra (not present in Mastodon):
|
|
max_toot_chars: Keyword.get(instance, :limit),
|
|
poll_limits: Keyword.get(instance, :poll_limits),
|
|
upload_limit: Keyword.get(instance, :upload_limit),
|
|
avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
|
|
background_upload_limit: Keyword.get(instance, :background_upload_limit),
|
|
banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
|
|
background_image: Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
|
|
description_limit: Keyword.get(instance, :description_limit),
|
|
pleroma: %{
|
|
metadata: %{
|
|
account_activation_required: Keyword.get(instance, :account_activation_required),
|
|
features: features(),
|
|
federation: federation(),
|
|
fields_limits: fields_limits(),
|
|
post_formats: Config.get([:instance, :allowed_post_formats]),
|
|
privileged_staff: Config.get([:instance, :privileged_staff])
|
|
},
|
|
stats: %{mau: Pleroma.User.active_user_count()},
|
|
vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
|
|
}
|
|
}
|
|
end
|
|
|
|
def features do
|
|
[
|
|
"pleroma_api",
|
|
"akkoma_api",
|
|
"mastodon_api",
|
|
"mastodon_api_streaming",
|
|
"polls",
|
|
"v2_suggestions",
|
|
"pleroma_explicit_addressing",
|
|
"shareable_emoji_packs",
|
|
"multifetch",
|
|
"pleroma:api/v1/notifications:include_types_filter",
|
|
"quote_posting",
|
|
"editing",
|
|
if Config.get([:media_proxy, :enabled]) do
|
|
"media_proxy"
|
|
end,
|
|
if Config.get([:instance, :allow_relay]) do
|
|
"relay"
|
|
end,
|
|
if Config.get([:instance, :safe_dm_mentions]) do
|
|
"safe_dm_mentions"
|
|
end,
|
|
"pleroma_emoji_reactions",
|
|
if Config.get([:instance, :show_reactions]) do
|
|
"exposable_reactions"
|
|
end,
|
|
if Config.get([:instance, :profile_directory]) do
|
|
"profile_directory"
|
|
end,
|
|
if Config.get([:translator, :enabled], false) do
|
|
"akkoma:machine_translation"
|
|
end,
|
|
"custom_emoji_reactions",
|
|
"pleroma:get:main/ostatus"
|
|
]
|
|
|> Enum.filter(& &1)
|
|
end
|
|
|
|
def federation do
|
|
quarantined = Config.get([:instance, :quarantined_instances], [])
|
|
|
|
if Config.get([:mrf, :transparency]) do
|
|
{:ok, data} = MRF.describe()
|
|
|
|
data
|
|
|> Map.put(
|
|
:quarantined_instances,
|
|
Enum.map(quarantined, fn {instance, _reason} -> instance end)
|
|
)
|
|
# This is for backwards compatibility. We originally didn't sent
|
|
# extra info like a reason why an instance was rejected/quarantined/etc.
|
|
# Because we didn't want to break backwards compatibility it was decided
|
|
# to add an extra "info" key.
|
|
|> Map.put(:quarantined_instances_info, %{
|
|
"quarantined_instances" =>
|
|
quarantined
|
|
|> Enum.map(fn {instance, reason} -> {instance, %{"reason" => reason}} end)
|
|
|> Map.new()
|
|
})
|
|
else
|
|
%{}
|
|
end
|
|
|> Map.put(:enabled, Config.get([:instance, :federating]))
|
|
end
|
|
|
|
def fields_limits do
|
|
%{
|
|
max_fields: Config.get([:instance, :max_account_fields]),
|
|
max_remote_fields: Config.get([:instance, :max_remote_account_fields]),
|
|
name_length: Config.get([:instance, :account_field_name_length]),
|
|
value_length: Config.get([:instance, :account_field_value_length])
|
|
}
|
|
end
|
|
end
|