From bd910342df78dc5736b97e6b065873ac2ca44074 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 27 Jan 2020 21:33:51 -0500 Subject: [PATCH] Add custom emojis Mastodon API endpoint --- doc/API-Mastodon.md | 4 +++ src/Collection/Api/Mastodon/Emojis.php | 10 ++++++ src/DI.php | 8 +++++ src/Factory/Api/Mastodon/Emoji.php | 45 ++++++++++++------------ src/Module/Api/Mastodon/CustomEmojis.php | 28 +++++++++++++++ src/Object/Api/Mastodon/Emoji.php | 44 ++++++++++++++++++++--- static/routes.config.php | 5 +-- 7 files changed, 114 insertions(+), 30 deletions(-) create mode 100644 src/Collection/Api/Mastodon/Emojis.php create mode 100644 src/Module/Api/Mastodon/CustomEmojis.php diff --git a/doc/API-Mastodon.md b/doc/API-Mastodon.md index e34ec4cc95..d9e6f22b66 100644 --- a/doc/API-Mastodon.md +++ b/doc/API-Mastodon.md @@ -15,6 +15,10 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en ## Implemented endpoints +- [`GET /api/v1/custom_emojis`](https://docs.joinmastodon.org/methods/instance/custom_emojis/) + - Doesn't return unicode emojis since they aren't using an image URL + + - [`GET /api/v1/follow_requests`](https://docs.joinmastodon.org/methods/accounts/follow_requests#pending-follows) - Returned IDs are specific to follow requests - [`POST /api/v1/follow_requests/:id/authorize`](https://docs.joinmastodon.org/methods/accounts/follow_requests#accept-follow) diff --git a/src/Collection/Api/Mastodon/Emojis.php b/src/Collection/Api/Mastodon/Emojis.php new file mode 100644 index 0000000000..235b3dfbbf --- /dev/null +++ b/src/Collection/Api/Mastodon/Emojis.php @@ -0,0 +1,10 @@ +create(Factory\Api\Mastodon\Account::class); } + /** + * @return Factory\Api\Mastodon\Emoji + */ + public static function mstdnEmoji() + { + return self::$dice->create(Factory\Api\Mastodon\Emoji::class); + } + /** * @return Factory\Api\Mastodon\FollowRequest */ diff --git a/src/Factory/Api/Mastodon/Emoji.php b/src/Factory/Api/Mastodon/Emoji.php index 770966a776..42c500d424 100644 --- a/src/Factory/Api/Mastodon/Emoji.php +++ b/src/Factory/Api/Mastodon/Emoji.php @@ -4,6 +4,7 @@ namespace Friendica\Factory\Api\Mastodon; use Friendica\App\BaseURL; use Friendica\BaseFactory; +use Friendica\Collection\Api\Mastodon\Emojis; use Friendica\Model\APContact; use Friendica\Model\Contact; use Friendica\Network\HTTPException; @@ -11,36 +12,34 @@ use Psr\Log\LoggerInterface; class Emoji extends BaseFactory { - /** @var BaseURL */ - protected $baseUrl; - - public function __construct(LoggerInterface $logger, BaseURL $baseURL) + public function create(string $shortcode, string $url) { - parent::__construct($logger); - - $this->baseUrl = $baseURL; + return new \Friendica\Object\Api\Mastodon\Emoji($shortcode, $url); } /** - * @param int $contactId - * @param int $uid User Id - * @return \Friendica\Api\Entity\Mastodon\Account - * @throws HTTPException\InternalServerErrorException - * @throws \ImagickException + * @param array $smilies + * @return Emojis */ - public function createFromContactId(int $contactId, $uid = 0) + public function createCollectionFromSmilies(array $smilies) { - $cdata = Contact::getPublicAndUserContacID($contactId, $uid); - if (!empty($cdata)) { - $publicContact = Contact::getById($cdata['public']); - $userContact = Contact::getById($cdata['user']); - } else { - $publicContact = Contact::getById($contactId); - $userContact = []; + $prototype = null; + + $emojis = []; + + foreach ($smilies['texts'] as $key => $shortcode) { + if (preg_match('/src="(.+?)"/', $smilies['icons'][$key], $matches)) { + $url = $matches[1]; + + if ($prototype === null) { + $prototype = $this->create($shortcode, $url); + $emojis[] = $prototype; + } else { + $emojis[] = \Friendica\Object\Api\Mastodon\Emoji::createFromPrototype($prototype, $shortcode, $url); + } + }; } - $apcontact = APContact::getByURL($publicContact['url'], false); - - return new \Friendica\Api\Entity\Mastodon\Account($this->baseUrl, $publicContact, $apcontact, $userContact); + return new Emojis($emojis); } } diff --git a/src/Module/Api/Mastodon/CustomEmojis.php b/src/Module/Api/Mastodon/CustomEmojis.php new file mode 100644 index 0000000000..58b0c96ee8 --- /dev/null +++ b/src/Module/Api/Mastodon/CustomEmojis.php @@ -0,0 +1,28 @@ +createCollectionFromSmilies(Smilies::getList()); + + System::jsonExit($emojis->getArrayCopy()); + } +} diff --git a/src/Object/Api/Mastodon/Emoji.php b/src/Object/Api/Mastodon/Emoji.php index 725a72a68c..658ce282f9 100644 --- a/src/Object/Api/Mastodon/Emoji.php +++ b/src/Object/Api/Mastodon/Emoji.php @@ -7,16 +7,50 @@ use Friendica\BaseEntity; /** * Class Emoji * - * @see https://docs.joinmastodon.org/api/entities/#emoji + * @see https://docs.joinmastodon.org/entities/emoji/ */ class Emoji extends BaseEntity { + //Required attributes /** @var string */ protected $shortcode; - /** @var string (URL) */ + /** @var string (URL)*/ protected $static_url; - /** @var string (URL) */ + /** @var string (URL)*/ protected $url; - /** @var bool */ - protected $visible_in_picker; + /** + * Unsupported + * @var bool + */ + protected $visible_in_picker = true; + + // Optional attributes + /** + * Unsupported + * @var string + */ + //protected $category; + + public function __construct(string $shortcode, string $url) + { + $this->shortcode = $shortcode; + $this->url = $url; + $this->static_url = $url; + } + + /** + * @param Emoji $prototype + * @param string $shortcode + * @param string $url + * @return Emoji + */ + public static function createFromPrototype(Emoji $prototype, string $shortcode, string $url) + { + $emoji = clone $prototype; + $emoji->shortcode = $shortcode; + $emoji->url = $url; + $emoji->static_url = $url; + + return $emoji; + } } diff --git a/static/routes.config.php b/static/routes.config.php index 17a2b5bf58..c081dba66a 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -29,10 +29,11 @@ return [ '/api' => [ '/v1' => [ + '/custom_emojis' => [Module\Api\Mastodon\CustomEmojis::class, [R::GET ]], '/follow_requests' => [Module\Api\Mastodon\FollowRequests::class, [R::GET ]], '/follow_requests/{id:\d+}/{action}' => [Module\Api\Mastodon\FollowRequests::class, [ R::POST]], - '/instance' => [Module\Api\Mastodon\Instance::class, [R::GET]], - '/instance/peers' => [Module\Api\Mastodon\Instance\Peers::class, [R::GET]], + '/instance' => [Module\Api\Mastodon\Instance::class, [R::GET ]], + '/instance/peers' => [Module\Api\Mastodon\Instance\Peers::class, [R::GET ]], ], ],