diff --git a/appinfo/info.xml b/appinfo/info.xml index 89a2f45b..6eeb233f 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -65,6 +65,10 @@ OCA\Social\Command\QueueProcess + + OCA\Social\Providers\ContactsMenuProvider + + Social diff --git a/img/social-dark.svg b/img/social-dark.svg new file mode 100644 index 00000000..8bfbf968 --- /dev/null +++ b/img/social-dark.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/lib/Providers/ContactsMenuProvider.php b/lib/Providers/ContactsMenuProvider.php new file mode 100644 index 00000000..b09de3c3 --- /dev/null +++ b/lib/Providers/ContactsMenuProvider.php @@ -0,0 +1,140 @@ + + * @copyright 2018, Maxence Lange + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + + +namespace OCA\Social\Providers; + + +use Exception; +use OC\User\NoUserException; +use OCA\Social\Service\AccountService; +use OCP\Contacts\ContactsMenu\IActionFactory; +use OCP\Contacts\ContactsMenu\IEntry; +use OCP\Contacts\ContactsMenu\IProvider; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserManager; + + +/** + * Class ContactsMenuProvider + * + * @package OCA\Social\Providers + */ +class ContactsMenuProvider implements IProvider { + + + /** @var IActionFactory */ + private $actionFactory; + + /** @var IURLGenerator */ + private $urlGenerator; + + /** @var IUserManager */ + private $userManager; + + /** @var IL10N */ + private $l10n; + + /** @var AccountService */ + private $accountService; + + + /** + * ContactsMenuProvider constructor. + * + * @param IActionFactory $actionFactory + * @param IURLGenerator $urlGenerator + * @param IUserManager $userManager + * @param IL10N $l10n + * @param AccountService $accountService + */ + public function __construct( + IActionFactory $actionFactory, IURLGenerator $urlGenerator, IUserManager $userManager, IL10N $l10n, + AccountService $accountService + ) { + $this->actionFactory = $actionFactory; + $this->urlGenerator = $urlGenerator; + $this->userManager = $userManager; + $this->l10n = $l10n; + $this->accountService = $accountService; + } + + + /** + * @param IEntry $entry + */ + public function process(IEntry $entry): void { + try { + $user = $this->getUserFromEntry($entry); + $actor = $this->accountService->getActorFromUserId($user->getUID()); + + $action = $this->l10n->t('Follow %s on Social', [$user->getDisplayName()]); + $icon = $this->urlGenerator->getAbsoluteURL( + $this->urlGenerator->imagePath('social', 'social-dark.svg') + ); + $link = $this->urlGenerator->linkToRouteAbsolute( + 'social.ActivityPub.actorAlias', ['username' => $actor->getPreferredUsername()] + ); + + $action = $this->actionFactory->newLinkAction($icon, $action, $link); + $entry->addAction($action); + } catch (Exception $e) { + return; + } + + } + + + /** + * @param IEntry $entry + * + * @return IUser + * @throws NoUserException + */ + private function getUserFromEntry(IEntry $entry): IUser { + $userId = $entry->getProperty('UID'); + if ($userId === null) { + throw new NoUserException(); + } + + if ($entry->getProperty('isLocalSystemBook') !== true) { + throw new NoUserException(); + } + + $user = $this->userManager->get($userId); + if (!$user instanceof IUser) { + throw new NoUserException(); + } + + return $user; + } + +}