]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Api/Mastodon/InstanceV2.php
Replace remaining references to default banner image by api.mastodon_banner configura...
[friendica.git] / src / Module / Api / Mastodon / InstanceV2.php
index e5af34b67a68b9f463841c4ad62002756e7f4e94..bf5cbcfb5575dfc2d858af772493d285517afa93 100644 (file)
 
 namespace Friendica\Module\Api\Mastodon;
 
+use Exception;
 use Friendica\App;
+use Friendica\Contact\Header;
 use Friendica\Core\Config\Capability\IManageConfigValues;
 use Friendica\Core\L10n;
 use Friendica\Core\System;
 use Friendica\Database\Database;
+use Friendica\DI;
+use Friendica\Model\User;
 use Friendica\Module\Api\ApiResponse;
 use Friendica\Module\BaseApi;
+use Friendica\Module\Register;
 use Friendica\Object\Api\Mastodon\InstanceV2 as InstanceEntity;
+use Friendica\Util\Images;
 use Friendica\Util\Profiler;
+use Friendica\Util\Strings;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -43,6 +50,9 @@ class InstanceV2 extends BaseApi
        /** @var IManageConfigValues */
        private $config;
 
+       /** @var Header */
+       private $contactHeader;
+
        public function __construct(
                App $app,
                L10n $l10n,
@@ -58,8 +68,9 @@ class InstanceV2 extends BaseApi
        ) {
                parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
 
-               $this->database = $database;
-               $this->config = $config;
+               $this->database      = $database;
+               $this->config        = $config;
+               $this->contactHeader = new Header($config);
        }
 
        /**
@@ -67,9 +78,98 @@ class InstanceV2 extends BaseApi
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \Friendica\Network\HTTPException\NotFoundException
         * @throws \ImagickException
+        * @throws Exception
         */
        protected function rawContent(array $request = [])
        {
-               System::jsonExit(new InstanceEntity($this->config, $this->baseUrl, $this->database, System::getRules()));
+               $domain               = $this->baseUrl->getHost();
+               $title                = $this->config->get('config', 'sitename');
+               $version              = '2.8.0 (compatible; Friendica ' . App::VERSION . ')';
+               $description          = $this->config->get('config', 'info');
+               $usage                = $this->buildUsageInfo();
+               $thumbnail            = new InstanceEntity\Thumbnail($this->baseUrl . $this->contactHeader->getMastodonBannerPath());
+               $languages            = [$this->config->get('system', 'language')];
+               $configuration        = $this->buildConfigurationInfo();
+               $registration         = $this->buildRegistrationsInfo();
+               $contact              = $this->buildContactInfo();
+               $friendica_extensions = $this->buildFriendicaExtensionInfo();
+               $rules                = System::getRules();
+               System::jsonExit(new InstanceEntity(
+                       $domain,
+                       $title,
+                       $version,
+                       $description,
+                       $usage,
+                       $thumbnail,
+                       $languages,
+                       $configuration,
+                       $registration,
+                       $contact,
+                       $friendica_extensions,
+                       $rules
+               ));
+       }
+
+       private function buildConfigurationInfo(): InstanceEntity\Configuration
+       {
+               $statuses_config = new InstanceEntity\StatusesConfig((int)$this->config->get(
+                       'config',
+                       'api_import_size',
+                       $this->config->get('config', 'max_import_size')
+               ));
+
+               $image_size_limit = Strings::getBytesFromShorthand($this->config->get('system', 'maximagesize'));
+
+               return new InstanceEntity\Configuration(
+                       $statuses_config,
+                       new InstanceEntity\MediaAttachmentsConfig(Images::supportedTypes(), $image_size_limit),
+               );
+       }
+
+       private function buildContactInfo(): InstanceEntity\Contact
+       {
+               $email         = implode(',', User::getAdminEmailList());
+               $administrator = User::getFirstAdmin();
+               $account       = null;
+
+               if ($administrator) {
+                       $adminContact = $this->database->selectFirst(
+                               'contact',
+                               ['uri-id'],
+                               ['nick' => $administrator['nickname'], 'self' => true]
+                       );
+                       $account = DI::mstdnAccount()->createFromUriId($adminContact['uri-id']);
+               }
+
+               return new InstanceEntity\Contact($email, $account);
+       }
+
+       private function buildFriendicaExtensionInfo(): InstanceEntity\FriendicaExtensions
+       {
+               return new InstanceEntity\FriendicaExtensions(
+                       App::VERSION,
+                       App::CODENAME,
+                       $this->config->get('system', 'build')
+               );
+       }
+
+       private function buildRegistrationsInfo(): InstanceEntity\Registrations
+       {
+               $register_policy   = intval($this->config->get('config', 'register_policy'));
+               $enabled           = ($register_policy != Register::CLOSED);
+               $approval_required = ($register_policy == Register::APPROVE);
+
+               return new InstanceEntity\Registrations($enabled, $approval_required);
+       }
+
+       private function buildUsageInfo(): InstanceEntity\Usage
+       {
+               if (!empty($this->config->get('system', 'nodeinfo'))) {
+                       $active_monthly = intval(DI::keyValue()->get('nodeinfo_active_users_monthly'));
+               } else {
+                       $active_monthly = 0;
+               }
+
+               return new InstanceEntity\Usage(new InstanceEntity\UserStats($active_monthly));
        }
 }