From 0e0e0d19e8d57f9840348adde5a84d0e690dcebe Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Tue, 4 Aug 2020 19:34:55 +0200 Subject: Provide a PHP Api for UserStatus Signed-off-by: Georg Ehrke --- lib/composer/composer/autoload_classmap.php | 4 ++ lib/composer/composer/autoload_static.php | 4 ++ lib/private/Server.php | 2 + lib/private/UserStatus/Manager.php | 105 ++++++++++++++++++++++++++++ lib/public/UserStatus/IManager.php | 44 ++++++++++++ lib/public/UserStatus/IProvider.php | 44 ++++++++++++ lib/public/UserStatus/IUserStatus.php | 105 ++++++++++++++++++++++++++++ 7 files changed, 308 insertions(+) create mode 100644 lib/private/UserStatus/Manager.php create mode 100644 lib/public/UserStatus/IManager.php create mode 100644 lib/public/UserStatus/IProvider.php create mode 100644 lib/public/UserStatus/IUserStatus.php (limited to 'lib') diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 854ef66f23a..c82fbc271cb 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -495,6 +495,9 @@ return array( 'OCP\\Template' => $baseDir . '/lib/public/Template.php', 'OCP\\User' => $baseDir . '/lib/public/User.php', 'OCP\\UserInterface' => $baseDir . '/lib/public/UserInterface.php', + 'OCP\\UserStatus\\IManager' => $baseDir . '/lib/public/UserStatus/IManager.php', + 'OCP\\UserStatus\\IProvider' => $baseDir . '/lib/public/UserStatus/IProvider.php', + 'OCP\\UserStatus\\IUserStatus' => $baseDir . '/lib/public/UserStatus/IUserStatus.php', 'OCP\\User\\Backend\\ABackend' => $baseDir . '/lib/public/User/Backend/ABackend.php', 'OCP\\User\\Backend\\ICheckPasswordBackend' => $baseDir . '/lib/public/User/Backend/ICheckPasswordBackend.php', 'OCP\\User\\Backend\\ICountUsersBackend' => $baseDir . '/lib/public/User/Backend/ICountUsersBackend.php', @@ -1344,6 +1347,7 @@ return array( 'OC\\Updater\\ChangesMapper' => $baseDir . '/lib/private/Updater/ChangesMapper.php', 'OC\\Updater\\ChangesResult' => $baseDir . '/lib/private/Updater/ChangesResult.php', 'OC\\Updater\\VersionCheck' => $baseDir . '/lib/private/Updater/VersionCheck.php', + 'OC\\UserStatus\\Manager' => $baseDir . '/lib/private/UserStatus/Manager.php', 'OC\\User\\Backend' => $baseDir . '/lib/private/User/Backend.php', 'OC\\User\\Database' => $baseDir . '/lib/private/User/Database.php', 'OC\\User\\LoginException' => $baseDir . '/lib/private/User/LoginException.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 4a857abae35..545444e7cc6 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -524,6 +524,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Template' => __DIR__ . '/../../..' . '/lib/public/Template.php', 'OCP\\User' => __DIR__ . '/../../..' . '/lib/public/User.php', 'OCP\\UserInterface' => __DIR__ . '/../../..' . '/lib/public/UserInterface.php', + 'OCP\\UserStatus\\IManager' => __DIR__ . '/../../..' . '/lib/public/UserStatus/IManager.php', + 'OCP\\UserStatus\\IProvider' => __DIR__ . '/../../..' . '/lib/public/UserStatus/IProvider.php', + 'OCP\\UserStatus\\IUserStatus' => __DIR__ . '/../../..' . '/lib/public/UserStatus/IUserStatus.php', 'OCP\\User\\Backend\\ABackend' => __DIR__ . '/../../..' . '/lib/public/User/Backend/ABackend.php', 'OCP\\User\\Backend\\ICheckPasswordBackend' => __DIR__ . '/../../..' . '/lib/public/User/Backend/ICheckPasswordBackend.php', 'OCP\\User\\Backend\\ICountUsersBackend' => __DIR__ . '/../../..' . '/lib/public/User/Backend/ICountUsersBackend.php', @@ -1373,6 +1376,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Updater\\ChangesMapper' => __DIR__ . '/../../..' . '/lib/private/Updater/ChangesMapper.php', 'OC\\Updater\\ChangesResult' => __DIR__ . '/../../..' . '/lib/private/Updater/ChangesResult.php', 'OC\\Updater\\VersionCheck' => __DIR__ . '/../../..' . '/lib/private/Updater/VersionCheck.php', + 'OC\\UserStatus\\Manager' => __DIR__ . '/../../..' . '/lib/private/UserStatus/Manager.php', 'OC\\User\\Backend' => __DIR__ . '/../../..' . '/lib/private/User/Backend.php', 'OC\\User\\Database' => __DIR__ . '/../../..' . '/lib/private/User/Database.php', 'OC\\User\\LoginException' => __DIR__ . '/../../..' . '/lib/private/User/LoginException.php', diff --git a/lib/private/Server.php b/lib/private/Server.php index 09bb7336785..e054d8230d9 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -1370,6 +1370,8 @@ class Server extends ServerContainer implements IServerContainer { $this->registerAlias(IInitialStateService::class, InitialStateService::class); + $this->registerAlias(\OCP\UserStatus\IManager::class, \OC\UserStatus\Manager::class); + $this->connectDispatcher(); } diff --git a/lib/private/UserStatus/Manager.php b/lib/private/UserStatus/Manager.php new file mode 100644 index 00000000000..c7726a88028 --- /dev/null +++ b/lib/private/UserStatus/Manager.php @@ -0,0 +1,105 @@ + + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + +namespace OC\UserStatus; + +use OCP\ILogger; +use OCP\IServerContainer; +use OCP\UserStatus\IManager; +use OCP\UserStatus\IProvider; +use Psr\Container\ContainerExceptionInterface; + +class Manager implements IManager { + + /** @var IServerContainer */ + private $container; + + /** @var ILogger */ + private $logger; + + /** @var null */ + private $providerClass; + + /** @var IProvider */ + private $provider; + + /** + * Manager constructor. + * + * @param IServerContainer $container + * @param ILogger $logger + */ + public function __construct(IServerContainer $container, + ILogger $logger) { + $this->container = $container; + $this->logger = $logger; + } + + /** + * @inheritDoc + */ + public function getUserStatuses(array $userIds): array { + $this->setupProvider(); + if (!$this->provider) { + return []; + } + + return $this->provider->getUserStatuses($userIds); + } + + /** + * @param string $class + * @since 20.0.0 + * @internal + */ + public function registerProvider(string $class): void { + $this->providerClass = $class; + $this->provider = null; + } + + /** + * Lazily set up provider + */ + private function setupProvider(): void { + if ($this->provider !== null) { + return; + } + if ($this->providerClass === null) { + return; + } + + try { + $provider = $this->container->get($this->providerClass); + } catch (ContainerExceptionInterface $e) { + $this->logger->logException($e, [ + 'message' => 'Could not load user-status provider dynamically: ' . $e->getMessage(), + 'level' => ILogger::ERROR, + ]); + return; + } + + $this->provider = $provider; + } +} diff --git a/lib/public/UserStatus/IManager.php b/lib/public/UserStatus/IManager.php new file mode 100644 index 00000000000..7ef1fdf2396 --- /dev/null +++ b/lib/public/UserStatus/IManager.php @@ -0,0 +1,44 @@ + + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCP\UserStatus; + +/** + * Interface IManager + * + * @package OCP\UserStatus + * @since 20.0.0 + */ +interface IManager { + + /** + * Gets the statuses for all users in $users + * + * @param string[] $userIds + * @return IUserStatus[] + * @since 20.0.0 + */ + public function getUserStatuses(array $userIds):array; +} diff --git a/lib/public/UserStatus/IProvider.php b/lib/public/UserStatus/IProvider.php new file mode 100644 index 00000000000..10269502969 --- /dev/null +++ b/lib/public/UserStatus/IProvider.php @@ -0,0 +1,44 @@ + + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCP\UserStatus; + +/** + * Interface IManager + * + * @package OCP\UserStatus + * @since 20.0.0 + */ +interface IProvider { + + /** + * Gets the statuses for all users in $users + * + * @param string[] $userIds + * @return IUserStatus[] + * @since 20.0.0 + */ + public function getUserStatuses(array $userIds):array; +} diff --git a/lib/public/UserStatus/IUserStatus.php b/lib/public/UserStatus/IUserStatus.php new file mode 100644 index 00000000000..e892203aeca --- /dev/null +++ b/lib/public/UserStatus/IUserStatus.php @@ -0,0 +1,105 @@ + + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCP\UserStatus; + +use DateTimeImmutable; + +/** + * Interface IUserStatus + * + * @package OCP\UserStatus + * @since 20.0.0 + */ +interface IUserStatus { + + /** + * @var string + * @since 20.0.0 + */ + public const ONLINE = 'online'; + + /** + * @var string + * @since 20.0.0 + */ + public const AWAY = 'away'; + + /** + * @var string + * @since 20.0.0 + */ + public const DND = 'dnd'; + + /** + * @var string + * @since 20.0.0 + */ + public const OFFLINE = 'offline'; + + /** + * Get the user this status is connected to + * + * @return string + * @since 20.0.0 + */ + public function getUserId():string; + + /** + * Get the status + * + * It will return one of the constants defined above. + * It will never return invisible. In case a user marked + * themselves as invisible, it will return offline. + * + * @return string See IUserStatus constants + * @since 20.0.0 + */ + public function getStatus():string; + + /** + * Get a custom message provided by the user + * + * @return string|null + * @since 20.0.0 + */ + public function getMessage():?string; + + /** + * Get a custom icon provided by the user + * + * @return string|null + * @since 20.0.0 + */ + public function getIcon():?string; + + /** + * Gets the time that the custom status will be cleared at + * + * @return DateTimeImmutable|null + * @since 20.0.0 + */ + public function getClearAt():?DateTimeImmutable; +} -- cgit v1.2.3