![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/plugins/MauticSocialBundle/Command/ |
<?php namespace MauticPlugin\MauticSocialBundle\Command; use MauticPlugin\MauticSocialBundle\Entity\MonitoringRepository; use MauticPlugin\MauticSocialBundle\Model\MonitoringModel; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class MauticSocialMonitoringCommand extends Command { public function __construct( private MonitoringModel $monitoringModel ) { parent::__construct(); } protected function configure() { $this->setName('mautic:social:monitoring') ->addOption('mid', 'i', InputOption::VALUE_OPTIONAL, 'The id of a specific monitor record to process') ->addOption( 'batch-size', null, InputOption::VALUE_REQUIRED, 'The maximum number of iterations the cron runs per cycle. This value gets distributed by the number of monitor records published' ) ->addOption('query-count', null, InputOption::VALUE_OPTIONAL, 'The number of records to search for per iteration. Default is 100.', 100); } protected function execute(InputInterface $input, OutputInterface $output): int { // get the mid from the cli $batchSize = $input->getOption('batch-size'); // monitor record $monitorId = $input->getOption('mid'); $monitorList = $this->getMonitors($monitorId); // no mid found, quit now if (!$monitorList->count()) { $output->writeln('No published monitors found. Make sure the id you supplied is published'); return Command::SUCCESS; } // max iterations $maxPerIterations = ceil($batchSize / count($monitorList)); foreach ($monitorList as $monitor) { $output->writeln('Executing Monitor Item '.$monitor->getId()); $resultCode = $this->processMonitorListItem($monitor, $maxPerIterations, $input, $output); $output->writeln('Result Code: '.$resultCode); } return Command::SUCCESS; } /** * @return \Doctrine\ORM\Tools\Pagination\Paginator */ protected function getMonitors($id = null) { $filter = [ 'start' => 0, 'limit' => 100, ]; /** @var MonitoringRepository $repository */ $repository = $this->monitoringModel->getRepository(); if (null !== $id) { $filter['filter'] = [ 'force' => [ [ 'column' => $repository->getTableAlias().'.id', 'expr' => 'eq', 'value' => (int) $id, ], ], ]; } return $repository->getPublishedEntities($filter); } /** * @return bool|int * * @throws \Exception */ protected function processMonitorListItem($listItem, float $maxPerIterations, InputInterface $input, OutputInterface $output) { // @todo set this up to use the command type per-monitor record. $networkType = $listItem->getNetworkType(); $commandName = ''; // hashtag command if ('twitter_hashtag' == $networkType) { $commandName = 'social:monitor:twitter:hashtags'; } // mention command if ('twitter_handle' == $networkType) { $commandName = 'social:monitor:twitter:mentions'; } if ('' == $commandName) { $output->writeln('Matching command not found.'); return 1; } // monitor hash command $command = $this->getApplication()->find($commandName); // create command options $cliArgs = [ 'command' => $commandName, '--mid' => $listItem->getId(), '--max-runs' => $maxPerIterations, '--query-count' => $input->getOption('query-count'), ]; // execute the command $returnCode = $command->run(new ArrayInput($cliArgs), $output); return $returnCode; } protected static $defaultDescription = 'Looks at the records of monitors and iterates through them. '; }