Spaces:
No application file
No application file
| namespace MauticPlugin\MauticSocialBundle\Command; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Translation\Translator; | |
| use Mautic\PluginBundle\Helper\IntegrationHelper; | |
| use MauticPlugin\MauticSocialBundle\Entity\Monitoring; | |
| use MauticPlugin\MauticSocialBundle\Event\SocialMonitorEvent; | |
| use MauticPlugin\MauticSocialBundle\Helper\TwitterCommandHelper; | |
| use MauticPlugin\MauticSocialBundle\Integration\TwitterIntegration; | |
| use MauticPlugin\MauticSocialBundle\SocialEvents; | |
| use Symfony\Component\Console\Command\Command; | |
| use Symfony\Component\Console\Input\InputInterface; | |
| use Symfony\Component\Console\Input\InputOption; | |
| use Symfony\Component\Console\Output\OutputInterface; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| abstract class MonitorTwitterBaseCommand extends Command | |
| { | |
| /** | |
| * @var TwitterIntegration | |
| */ | |
| protected $twitter; | |
| /** | |
| * @var InputInterface | |
| */ | |
| protected $input; | |
| /** | |
| * @var OutputInterface | |
| */ | |
| protected $output; | |
| /** | |
| * @var int | |
| */ | |
| protected $maxRuns = 5; | |
| /** | |
| * @var int | |
| */ | |
| protected $runCount = 0; | |
| /** | |
| * @var int | |
| */ | |
| protected $queryCount = 100; | |
| public function __construct( | |
| protected EventDispatcherInterface $dispatcher, | |
| protected Translator $translator, | |
| protected IntegrationHelper $integrationHelper, | |
| private TwitterCommandHelper $twitterCommandHelper, | |
| CoreParametersHelper $coreParametersHelper | |
| ) { | |
| $this->translator->setLocale($coreParametersHelper->get('locale', 'en_US')); | |
| parent::__construct(); | |
| } | |
| /** | |
| * Command configuration. Set the name, description, and options here. | |
| */ | |
| protected function configure() | |
| { | |
| $this | |
| ->addOption( | |
| 'mid', | |
| 'i', | |
| InputOption::VALUE_REQUIRED, | |
| 'The id of the monitor record' | |
| ) | |
| ->addOption( | |
| 'max-runs', | |
| null, | |
| InputOption::VALUE_REQUIRED, | |
| 'The maximum number of recursive iterations permitted', | |
| 5 | |
| ) | |
| ->addOption( | |
| 'query-count', | |
| null, | |
| InputOption::VALUE_OPTIONAL, | |
| 'The number of records to search for per iteration.', | |
| 100 | |
| ) | |
| ->addOption( | |
| 'show-posts', | |
| null, | |
| InputOption::VALUE_NONE, | |
| 'Use this option to display the posts retrieved' | |
| ) | |
| ->addOption( | |
| 'show-stats', | |
| null, | |
| InputOption::VALUE_NONE, | |
| 'Use this option to display the stats of the tweets fetched' | |
| ); | |
| } | |
| /** | |
| * Used in various areas to set name of the network being searched. | |
| * | |
| * @return string twitter|facebook etc.. | |
| */ | |
| abstract public function getNetworkName(); | |
| /** | |
| * Search for tweets by creating your own search criteria. | |
| * | |
| * @param Monitoring $monitor | |
| * | |
| * @return array The results of makeRequest | |
| */ | |
| abstract protected function getTweets($monitor); | |
| /** | |
| * Main execution method. Gets the integration settings, processes the search criteria. | |
| */ | |
| protected function execute(InputInterface $input, OutputInterface $output): int | |
| { | |
| $this->input = $input; | |
| $this->output = $output; | |
| $this->maxRuns = $this->input->getOption('max-runs'); | |
| $this->queryCount = $this->input->getOption('query-count'); | |
| $twitterIntegration = $this->integrationHelper->getIntegrationObject('Twitter'); | |
| if (false === $twitterIntegration || false === $twitterIntegration->getIntegrationSettings()->getIsPublished()) { | |
| $this->output->writeln($this->translator->trans('mautic.social.monitoring.twitter.not.published')); | |
| return Command::FAILURE; | |
| } | |
| \assert($twitterIntegration instanceof TwitterIntegration); | |
| $this->twitter = $twitterIntegration; | |
| if (!$this->twitter->isAuthorized()) { | |
| $this->output->writeln($this->translator->trans('mautic.social.monitoring.twitter.not.configured')); | |
| return Command::FAILURE; | |
| } | |
| // get the mid from the cli | |
| $mid = $input->getOption('mid'); | |
| if (!$mid) { | |
| $this->output->writeln($this->translator->trans('mautic.social.monitoring.twitter.mid.empty')); | |
| return Command::FAILURE; | |
| } | |
| $this->twitterCommandHelper->setOutput($output); | |
| $monitor = $this->twitterCommandHelper->getMonitor($mid); | |
| if (!$monitor || !$monitor->getId()) { | |
| $this->output->writeln($this->translator->trans('mautic.social.monitoring.twitter.monitor.does.not.exist', ['%id%' => $mid])); | |
| return Command::FAILURE; | |
| } | |
| // process the monitor | |
| $this->processMonitor($monitor); | |
| $this->dispatcher->dispatch( | |
| new SocialMonitorEvent($this->getNetworkName(), $monitor, $this->twitterCommandHelper->getManipulatedLeads(), $this->twitterCommandHelper->getNewLeadsCount(), $this->twitterCommandHelper->getUpdatedLeadsCount()), | |
| SocialEvents::MONITOR_POST_PROCESS | |
| ); | |
| return Command::SUCCESS; | |
| } | |
| /** | |
| * Process the monitor record. | |
| * | |
| * @Note: Keeping this method here instead of in the twitterCommandHelper | |
| * so that the hashtag and mention commands can easily extend it. | |
| * | |
| * @param Monitoring $monitor | |
| * | |
| * @return bool | |
| */ | |
| protected function processMonitor($monitor) | |
| { | |
| $results = $this->getTweets($monitor); | |
| if (false === $results || !isset($results['statuses'])) { | |
| $this->output->writeln('No statuses found'); | |
| if (!empty($results['errors'])) { | |
| foreach ($results['errors'] as $error) { | |
| $this->output->writeln($error['code'].': '.$error['message']); | |
| } | |
| } | |
| return 0; | |
| } | |
| if (count($results['statuses'])) { | |
| $this->twitterCommandHelper->createLeadsFromStatuses($results['statuses'], $monitor); | |
| } else { | |
| $this->output->writeln($this->translator->trans('mautic.social.monitoring.twitter.no.new.tweets')); | |
| } | |
| $this->twitterCommandHelper->setMonitorStats($monitor, $results['search_metadata']); | |
| $this->printInformation($monitor, $results); | |
| // get stats after being updated | |
| $stats = $monitor->getStats(); | |
| ++$this->runCount; | |
| // if we have stats and a next results request, process it here | |
| // @todo add a check for max iterations | |
| if (is_array($stats) && array_key_exists('max_id_str', $stats) | |
| && ($this->runCount < $this->maxRuns) | |
| && count($results['statuses']) | |
| ) { | |
| // recursive | |
| $this->processMonitor($monitor); | |
| } | |
| return 0; | |
| } | |
| /** | |
| * Prints all the returned tweets. | |
| * | |
| * @param array $statuses | |
| */ | |
| protected function printTweets($statuses) | |
| { | |
| if (!$this->input->getOption('show-posts') && $this->output->getVerbosity() < OutputInterface::VERBOSITY_VERY_VERBOSE) { | |
| return; | |
| } | |
| foreach ($statuses as $status) { | |
| $this->output->writeln('-- tweet -- '); | |
| $this->output->writeln('ID: '.$status['id']); | |
| $this->output->writeln('Message: '.$status['text']); | |
| $this->output->writeln('Handle: '.$status['user']['screen_name']); | |
| $this->output->writeln('Name: '.$status['user']['name']); | |
| $this->output->writeln('Location: '.$status['user']['location']); | |
| $this->output->writeln('Profile Img: '.$status['user']['profile_image_url']); | |
| $this->output->writeln('Profile Description: '.$status['user']['description']); | |
| $this->output->writeln('// tweet // '); | |
| } | |
| } | |
| /** | |
| * Prints the search query metadata from twitter. | |
| * Only shows stats if explicitly requested or if we're in verbose mode. | |
| * | |
| * @param array $metadata | |
| */ | |
| protected function printQueryMetadata($metadata) | |
| { | |
| if (!$this->input->getOption('show-stats') && $this->output->getVerbosity() < OutputInterface::VERBOSITY_VERBOSE) { | |
| return; | |
| } | |
| $this->output->writeln('-- search meta -- '); | |
| $this->output->writeln('max_id_str: '.$metadata['max_id_str']); | |
| $this->output->writeln('since_id_str: '.$metadata['since_id_str']); | |
| $this->output->writeln('Page Count: '.$metadata['count']); | |
| $this->output->writeln('query: '.$metadata['query']); | |
| if (array_key_exists('next_results', $metadata)) { | |
| $this->output->writeln('next results: '.$metadata['next_results']); | |
| } | |
| $this->output->writeln('// search meta // '); | |
| } | |
| /** | |
| * Prints a summary of the search query. | |
| * Only shows stats if explicitly requested or if we're in verbose mode. | |
| * | |
| * @param Monitoring $monitor | |
| * @param array $results | |
| */ | |
| protected function printInformation($monitor, $results) | |
| { | |
| if (!$this->input->getOption('show-stats') && $this->output->getVerbosity() < OutputInterface::VERBOSITY_VERBOSE) { | |
| return; | |
| } | |
| $this->output->writeln('------------------------'); | |
| $this->output->writeln($monitor->getTitle()); | |
| $this->output->writeln('Published '.$monitor->isPublished()); | |
| $this->output->writeln($monitor->getNetworkType()); | |
| $this->output->writeln('New Leads '.$this->twitterCommandHelper->getNewLeadsCount()); | |
| $this->output->writeln('Updated Leads '.$this->twitterCommandHelper->getUpdatedLeadsCount()); | |
| $this->printQueryMetadata($results['search_metadata']); | |
| $this->printTweets($results['statuses']); | |
| $this->output->writeln('------------------------'); | |
| } | |
| } | |