total rebase
[anni] / lib / pleroma / web / mastodon_api / views / instance_view.ex
old mode 100755 (executable)
new mode 100644 (file)
index abf7f29..890dd39
@@ -13,12 +13,11 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
   def render("show.json", _) do
     instance = Config.get(:instance)
 
-    %{
-      uri: Pleroma.Web.Endpoint.url(),
-      title: Keyword.get(instance, :name),
+    common_information(instance)
+    |> Map.merge(%{
+      uri: Pleroma.Web.WebFinger.host(),
       description: Keyword.get(instance, :description),
       short_description: Keyword.get(instance, :short_description),
-      version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
       email: Keyword.get(instance, :email),
       urls: %{
         streaming_api: Pleroma.Web.Endpoint.websocket_url()
@@ -27,9 +26,10 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
       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),
+      contact_account: contact_account(Keyword.get(instance, :contact_username)),
+      configuration: configuration(),
       # Extra (not present in Mastodon):
       max_toot_chars: Keyword.get(instance, :limit),
       max_media_attachments: Keyword.get(instance, :max_media_attachments),
@@ -41,19 +41,47 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
       background_image: Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
       shout_limit: Config.get([:shout, :limit]),
       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]),
-          birthday_required: Config.get([:instance, :birthday_required]),
-          birthday_min_age: Config.get([:instance, :birthday_min_age])
-        },
-        stats: %{mau: Pleroma.User.active_user_count()},
-        vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
-      }
+      chat_limit: Keyword.get(instance, :chat_limit),
+      pleroma: pleroma_configuration(instance)
+    })
+  end
+
+  def render("show2.json", _) do
+    instance = Config.get(:instance)
+
+    common_information(instance)
+    |> Map.merge(%{
+      domain: Pleroma.Web.WebFinger.host(),
+      source_url: Pleroma.Application.repository(),
+      description: Keyword.get(instance, :short_description),
+      usage: %{users: %{active_month: Pleroma.User.active_user_count()}},
+      thumbnail: %{
+        url:
+          URI.merge(Pleroma.Web.Endpoint.url(), Keyword.get(instance, :instance_thumbnail))
+          |> to_string
+      },
+      configuration: configuration2(),
+      registrations: %{
+        enabled: Keyword.get(instance, :registrations_open),
+        approval_required: Keyword.get(instance, :account_approval_required),
+        message: nil,
+        url: nil
+      },
+      contact: %{
+        email: Keyword.get(instance, :email),
+        account: contact_account(Keyword.get(instance, :contact_username))
+      },
+      # Extra (not present in Mastodon):
+      pleroma: pleroma_configuration2(instance)
+    })
+  end
+
+  defp common_information(instance) do
+    %{
+      title: Keyword.get(instance, :name),
+      version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
+      languages: Keyword.get(instance, :languages, ["en"]),
+      rules: []
     }
   end
 
@@ -69,6 +97,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
       "multifetch",
       "pleroma:api/v1/notifications:include_types_filter",
       "editing",
+      "quote_posting",
       if Config.get([:activitypub, :blockers_visible]) do
         "blockers_visible"
       end,
@@ -92,6 +121,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
         "safe_dm_mentions"
       end,
       "pleroma_emoji_reactions",
+      "pleroma_custom_emoji_reactions",
       "pleroma_chat_messages",
       if Config.get([:instance, :show_reactions]) do
         "exposable_reactions"
@@ -99,7 +129,9 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
       if Config.get([:instance, :profile_directory]) do
         "profile_directory"
       end,
-      "pleroma:get:main/ostatus"
+      "pleroma:get:main/ostatus",
+      "pleroma:group_actors",
+      "pleroma:bookmark_folders"
     ]
     |> Enum.filter(& &1)
   end
@@ -131,7 +163,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
     |> Map.put(:enabled, Config.get([:instance, :federating]))
   end
 
-  def fields_limits do
+  defp fields_limits do
     %{
       max_fields: Config.get([:instance, :max_account_fields]),
       max_remote_fields: Config.get([:instance, :max_remote_account_fields]),
@@ -139,4 +171,94 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
       value_length: Config.get([:instance, :account_field_value_length])
     }
   end
+
+  defp contact_account(nil), do: nil
+
+  defp contact_account("@" <> username) do
+    contact_account(username)
+  end
+
+  defp contact_account(username) do
+    user = Pleroma.User.get_cached_by_nickname(username)
+
+    if user do
+      Pleroma.Web.MastodonAPI.AccountView.render("show.json", %{user: user, for: nil})
+    else
+      nil
+    end
+  end
+
+  defp configuration do
+    %{
+      accounts: %{
+        max_featured_tags: 0
+      },
+      statuses: %{
+        max_characters: Config.get([:instance, :limit]),
+        max_media_attachments: Config.get([:instance, :max_media_attachments])
+      },
+      media_attachments: %{
+        image_size_limit: Config.get([:instance, :upload_limit]),
+        video_size_limit: Config.get([:instance, :upload_limit]),
+        supported_mime_types: ["application/octet-stream"]
+      },
+      polls: %{
+        max_options: Config.get([:instance, :poll_limits, :max_options]),
+        max_characters_per_option: Config.get([:instance, :poll_limits, :max_option_chars]),
+        min_expiration: Config.get([:instance, :poll_limits, :min_expiration]),
+        max_expiration: Config.get([:instance, :poll_limits, :max_expiration])
+      }
+    }
+  end
+
+  defp configuration2 do
+    configuration()
+    |> put_in([:accounts, :max_pinned_statuses], Config.get([:instance, :max_pinned_statuses], 0))
+    |> put_in([:statuses, :characters_reserved_per_url], 0)
+    |> Map.merge(%{
+      urls: %{
+        streaming: Pleroma.Web.Endpoint.websocket_url(),
+        status: Config.get([:instance, :status_page])
+      },
+      vapid: %{
+        public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
+      }
+    })
+  end
+
+  defp pleroma_configuration(instance) do
+    %{
+      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]),
+        birthday_required: Config.get([:instance, :birthday_required]),
+        birthday_min_age: Config.get([:instance, :birthday_min_age])
+      },
+      stats: %{mau: Pleroma.User.active_user_count()},
+      vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
+    }
+  end
+
+  defp pleroma_configuration2(instance) do
+    configuration = pleroma_configuration(instance)
+
+    configuration
+    |> Map.merge(%{
+      metadata:
+        configuration.metadata
+        |> Map.merge(%{
+          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),
+          chat_limit: Keyword.get(instance, :chat_limit),
+          description_limit: Keyword.get(instance, :description_limit),
+          shout_limit: Config.get([:shout, :limit])
+        })
+    })
+  end
 end