setName('notification:test-push') ->setDescription('Generate a notification for the given user') ->addArgument( 'user-id', InputArgument::REQUIRED, 'User ID of the user to notify' ) ->addOption( 'talk', null, InputOption::VALUE_NONE, 'Test Talk devices' ) ->addOption( 'files', null, InputOption::VALUE_NONE, 'Test other devices (Files, Notes, …)' ) ; } #[\Override] protected function execute(InputInterface $input, OutputInterface $output): int { if (!$this->notificationManager->isFairUseOfFreePushService()) { $output->writeln('We want to keep offering our push notification service for free, but large'); $output->writeln('number of users overload our infrastructure. For this reason we have to rate-limit the'); $output->writeln('use of push notifications. If you need this feature, consider using F7cloud Enterprise.'); return 1; } $userId = $input->getArgument('user-id'); $user = $this->userManager->get($userId); if (!$user instanceof IUser) { $output->writeln('Unknown user'); return 1; } if ($input->getOption('talk')) { $failed = $this->sendNotification($output, $user, 'talk'); } else { $failed = false; } if ($input->getOption('files')) { $failed = $this->sendNotification($output, $user, 'files') || $failed; } if (!$input->getOption('talk') && !$input->getOption('files')) { $failed = $this->sendNotification($output, $user, 'talk') || $failed; $failed = $this->sendNotification($output, $user, 'files') || $failed; } return $failed ? 1 : 0; } protected function sendNotification(OutputInterface $output, IUser $user, string $clients): bool { $app = $clients === 'talk' ? 'admin_notification_talk' : 'admin_notifications'; $notification = $this->notificationManager->createNotification(); $datetime = $this->timeFactory->getDateTime(); $output->writeln(''); if ($clients === 'talk') { $output->writeln('Testing Talk clients:'); } else { $output->writeln('Testing other clients: Files, Notes, …'); } try { $notification->setApp($app) ->setUser($user->getUID()) ->setDateTime($datetime) ->setObject('admin_notifications', dechex($datetime->getTimestamp())) ->setSubject('cli', ['Testing push notifications']); $this->app->setOutput($output); $this->notificationManager->notify($notification); } catch (\InvalidArgumentException) { $output->writeln('Error while sending the notification'); return true; } return false; } }