setName('mautic:broadcasts:send') ->setHelp( <<<'EOT' The %command.name% command is send a channel broadcast to pending contacts. php %command.full_name% --channel=email --id=3 EOT ) ->setDefinition( [ new InputOption( 'channel', 'c', InputOption::VALUE_OPTIONAL, 'A specific channel to process broadcasts for pending contacts.' ), new InputOption( 'id', 'i', InputOption::VALUE_OPTIONAL, 'The ID for a specifc channel to process broadcasts for pending contacts.' ), new InputOption( 'min-contact-id', null, InputOption::VALUE_OPTIONAL, 'Min contact ID to filter recipients.' ), new InputOption( 'max-contact-id', null, InputOption::VALUE_OPTIONAL, 'Max contact ID to filter recipients.' ), new InputOption( 'limit', 'l', InputOption::VALUE_OPTIONAL, 'Limit how many contacts to load from database to process.' ), new InputOption( 'batch', 'b', InputOption::VALUE_OPTIONAL, 'Limit how many messages to send at once.' ), ] )->addOption( '--thread-id', null, InputOption::VALUE_OPTIONAL, 'The number of this current process if running multiple in parallel.' ) ->addOption( '--max-threads', null, InputOption::VALUE_OPTIONAL, 'The maximum number of processes you intend to run in parallel.' ); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output): int { $channel = $input->getOption('channel'); $channelId = $input->getOption('id'); $limit = $input->getOption('limit'); $batch = $input->getOption('batch'); $minContactId = $input->getOption('min-contact-id'); $maxContactId = $input->getOption('max-contact-id'); $threadId = $input->getOption('thread-id'); $maxThreads = $input->getOption('max-threads'); $key = sprintf('%s-%s-%s-%s', $channel, $channelId, $threadId, $maxThreads); if ($threadId && $maxThreads) { if ((int) $threadId > (int) $maxThreads) { $output->writeln('--thread-id cannot be larger than --max-thread'); return \Symfony\Component\Console\Command\Command::FAILURE; } } if (!$this->checkRunStatus($input, $output, $key)) { return \Symfony\Component\Console\Command\Command::SUCCESS; } $event = new ChannelBroadcastEvent($channel, $channelId, $output); if ($limit) { $event->setLimit((int) $limit); } if ($batch) { $event->setBatch((int) $batch); } if ($minContactId) { $event->setMinContactIdFilter((int) $minContactId); } if ($maxContactId) { $event->setMaxContactIdFilter((int) $maxContactId); } if ($threadId) { $event->setThreadId((int) $threadId); } if ($maxThreads) { $event->setMaxThreads((int) $maxThreads); } $this->dispatcher->dispatch($event, ChannelEvents::CHANNEL_BROADCAST); $results = $event->getResults(); $rows = []; foreach ($results as $channel => $counts) { $rows[] = [$channel, $counts['success'], $counts['failed']]; } // Put a blank line after anything the event spits out $output->writeln(''); $output->writeln(''); $table = new Table($output); $table ->setHeaders([$this->translator->trans('mautic.core.channel'), $this->translator->trans('mautic.core.channel.broadcast_success_count'), $this->translator->trans('mautic.core.channel.broadcast_failed_count')]) ->setRows($rows); $table->render(); $this->completeRun(); return \Symfony\Component\Console\Command\Command::SUCCESS; } protected static $defaultDescription = 'Process contacts pending to receive a channel broadcast.'; }