Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/admin_notifications.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2017-02-09 12:35:43 +0300
committerJoas Schilling <coding@schilljs.com>2017-02-09 12:35:43 +0300
commitef87c6770430da640a06d5669dc2cc2e60cc9e85 (patch)
tree73b2360b50b33dd392ab8dbca62d55e5cdd9895d
parentf2b5f010c669ce85688dc0b4aec45a3f3bb5fe28 (diff)
Allow to create notifications via occ
Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r--appinfo/app.php25
-rw-r--r--appinfo/info.xml29
-rw-r--r--img/app-dark.svg4
-rw-r--r--img/app.svg4
-rw-r--r--lib/AppInfo/Application.php52
-rw-r--r--lib/Command/Generate.php136
-rw-r--r--lib/Notification/Notifier.php79
7 files changed, 329 insertions, 0 deletions
diff --git a/appinfo/app.php b/appinfo/app.php
new file mode 100644
index 0000000..f39f84d
--- /dev/null
+++ b/appinfo/app.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+$app = new \OCA\AdminNotifications\AppInfo\Application();
+$app->register();
diff --git a/appinfo/info.xml b/appinfo/info.xml
new file mode 100644
index 0000000..7563ecc
--- /dev/null
+++ b/appinfo/info.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<info>
+ <id>admin_notifications</id>
+ <name>Admin notifications</name>
+ <description><![CDATA[Allows admins to generate notifications for users via the console or an HTTP endpoint]]></description>
+ <licence>AGPL</licence>
+ <author>Joas Schilling</author>
+ <version>1.0.0</version>
+ <namespace>AdminNotifications</namespace>
+
+ <category>organization</category>
+ <screenshot>https://github.com/nextcloud/admin_notifications/raw/master/docs/Screenshot.png</screenshot>
+
+ <website>https://github.com/nextcloud/admin_notifications</website>
+ <bugs>https://github.com/nextcloud/admin_notifications/issues</bugs>
+ <repository type="git">https://github.com/nextcloud/admin_notifications.git</repository>
+
+ <dependencies>
+ <nextcloud min-version="12" max-version="12" />
+ </dependencies>
+
+ <types>
+ <logging/>
+ </types>
+
+ <commands>
+ <command>OCA\AdminNotifications\Command\Generate</command>
+ </commands>
+</info>
diff --git a/img/app-dark.svg b/img/app-dark.svg
new file mode 100644
index 0000000..866a991
--- /dev/null
+++ b/img/app-dark.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="160" height="160" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160">
+ <path d="m141.875,20c-45.60087,44.65982 -69.01848,40.7999 -128.15625,45.34375l0,5.625l-8.71875,2.90625l0,12.25l8.71875,2.90625l0,6.6875c7.25059,0.82224 13.88388,1.32832 20.0625,1.71875c-9.31862,15.96011 -12.96732,29.8846 -9.65625,35.6875c0,0 31.86464,14.35229 30.25,1.5c-1.08624,-8.64642 1.87019,-23.57169 4.9375,-35.875c29.00855,1.68898 48.52722,6.05197 82.4375,41.125c3.25584,-16.68025 4.94737,-33.38225 5.34375,-50.0625l6.5,-1.46875c3.15773,-5.55194 2.54256,-11.10429 0,-16.65625l-6.625,-1.5c-0.58527,-16.73221 -2.36115,-33.45529 -5.09375,-50.1875z" id="path2818" fill="#000"/>
+</svg>
diff --git a/img/app.svg b/img/app.svg
new file mode 100644
index 0000000..94936d9
--- /dev/null
+++ b/img/app.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="160" height="160" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160">
+ <path d="m141.875,20c-45.60087,44.65982 -69.01848,40.7999 -128.15625,45.34375l0,5.625l-8.71875,2.90625l0,12.25l8.71875,2.90625l0,6.6875c7.25059,0.82224 13.88388,1.32832 20.0625,1.71875c-9.31862,15.96011 -12.96732,29.8846 -9.65625,35.6875c0,0 31.86464,14.35229 30.25,1.5c-1.08624,-8.64642 1.87019,-23.57169 4.9375,-35.875c29.00855,1.68898 48.52722,6.05197 82.4375,41.125c3.25584,-16.68025 4.94737,-33.38225 5.34375,-50.0625l6.5,-1.46875c3.15773,-5.55194 2.54256,-11.10429 0,-16.65625l-6.625,-1.5c-0.58527,-16.73221 -2.36115,-33.45529 -5.09375,-50.1875z" id="path2818" fill="#fff"/>
+</svg>
diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php
new file mode 100644
index 0000000..3c08909
--- /dev/null
+++ b/lib/AppInfo/Application.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\AdminNotifications\AppInfo;
+
+use OCA\AdminNotifications\Notification\Notifier;
+use OCP\AppFramework\App;
+
+class Application extends App {
+ const APP_ID = 'admin_notifications';
+
+ public function __construct() {
+ parent::__construct(self::APP_ID);
+ }
+
+ public function register() {
+ $this->registerNotifier();
+ }
+
+
+ protected function registerNotifier() {
+ $this->getContainer()->getServer()->getNotificationManager()->registerNotifier(function() {
+ return $this->getContainer()->query(Notifier::class);
+ }, function() {
+ $l = $this->getContainer()->getServer()->getL10NFactory()->get(self::APP_ID);
+ return [
+ 'id' => self::APP_ID,
+ 'name' => $l->t('Admin notifications'),
+ ];
+ });
+ }
+}
diff --git a/lib/Command/Generate.php b/lib/Command/Generate.php
new file mode 100644
index 0000000..27c4863
--- /dev/null
+++ b/lib/Command/Generate.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\AdminNotifications\Command;
+
+use OCA\AdminNotifications\AppInfo\Application;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\Notification\IManager;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Generate extends Command {
+
+ /** @var ITimeFactory */
+ protected $timeFactory;
+
+ /** @var IUserManager */
+ protected $userManager;
+
+ /** @var IManager */
+ protected $notificationManager;
+
+ /**
+ * @param ITimeFactory $timeFactory
+ * @param IUserManager $userManager
+ * @param IManager $notificationManager
+ */
+ public function __construct(ITimeFactory $timeFactory, IUserManager $userManager, IManager $notificationManager) {
+ parent::__construct();
+
+ $this->timeFactory = $timeFactory;
+ $this->userManager = $userManager;
+ $this->notificationManager = $notificationManager;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('notification:generate')
+ ->setDescription('Generate a notification for the given user')
+ ->addArgument(
+ 'user-id',
+ InputArgument::REQUIRED,
+ 'User ID of the user to notify'
+ )
+ ->addArgument(
+ 'short-message',
+ InputArgument::REQUIRED,
+ 'Short message to be sent to the user (max. 255 characters)'
+ )
+ ->addOption(
+ 'long-message',
+ 'l',
+ InputOption::VALUE_REQUIRED,
+ 'Long mesage to be sent to the user (max. 4000 characters)',
+ ''
+ )
+ ;
+ }
+
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ * @return int
+ */
+ protected function execute(InputInterface $input, OutputInterface $output) {
+
+ $userId = $input->getArgument('user-id');
+ $user = $this->userManager->get($userId);
+
+ if (!$user instanceof IUser) {
+ $output->writeln('Unknown user');
+ return 1;
+ }
+
+ $subject = $input->getArgument('short-message');
+ if ($subject === '' || strlen($subject) > 255) {
+ $output->writeln('Too long or empty short-message');
+ return 1;
+ }
+
+ $message = $input->getOption('long-message');
+ if ($message !== '' && strlen($message) > 4000) {
+ $output->writeln('Too long long-message');
+ return 1;
+ }
+
+ $notification = $this->notificationManager->createNotification();
+ $time = $this->timeFactory->getTime();
+ $datetime = new \DateTime();
+ $datetime->setTimestamp($time);
+
+ try {
+ $notification->setApp(Application::APP_ID)
+ ->setUser($user->getUID())
+ ->setDateTime($datetime)
+ ->setObject(Application::APP_ID, dechex($time))
+ ->setSubject('cli', [$subject]);
+
+ if ($message !== '') {
+ $notification->setMessage('cli', [$message]);
+ }
+
+ $this->notificationManager->notify($notification);
+ } catch (\InvalidArgumentException $e) {
+ $output->writeln('Error while sending the notification');
+ return 1;
+ }
+
+ return 0;
+ }
+}
diff --git a/lib/Notification/Notifier.php b/lib/Notification/Notifier.php
new file mode 100644
index 0000000..3c7c3f2
--- /dev/null
+++ b/lib/Notification/Notifier.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\AdminNotifications\Notification;
+
+
+use OCA\AdminNotifications\AppInfo\Application;
+use OCP\IURLGenerator;
+use OCP\L10N\IFactory;
+use OCP\Notification\INotification;
+use OCP\Notification\INotifier;
+
+class Notifier implements INotifier {
+
+ /** @var IFactory */
+ protected $l10nFactory;
+
+ /** @var IURLGenerator */
+ protected $urlGenerator;
+
+ /**
+ * @param IFactory $l10nFactory
+ * @param IURLGenerator $urlGenerator
+ */
+ public function __construct(IFactory $l10nFactory, IURLGenerator $urlGenerator) {
+ $this->l10nFactory = $l10nFactory;
+ $this->urlGenerator = $urlGenerator;
+ }
+
+ /**
+ * @param INotification $notification
+ * @param string $languageCode The code of the language that should be used to prepare the notification
+ * @return INotification
+ * @throws \InvalidArgumentException When the notification was not prepared by a notifier
+ */
+ public function prepare(INotification $notification, $languageCode) {
+ if ($notification->getApp() !== Application::APP_ID) {
+ throw new \InvalidArgumentException('Unknown app');
+ }
+
+ switch ($notification->getSubject()) {
+ // Deal with known subjects
+ case 'cli':
+ case 'ocs':
+ $subjectParams = $notification->getSubjectParameters();
+ $notification->setParsedSubject($subjectParams[0]);
+ $messageParams = $notification->getMessageParameters();
+ if (isset($messageParams[0]) && $messageParams[0] !== '') {
+ $notification->setParsedMessage($messageParams[0]);
+ }
+
+ $notification->setIcon($this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath(Application::APP_ID, 'app-dark.svg')));
+ return $notification;
+
+ default:
+ throw new \InvalidArgumentException('Unknown subject');
+ }
+ }
+}