Spaces:
No application file
No application file
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. '; | |
} | |