Spaces:
No application file
No application file
namespace Mautic\SmsBundle\Helper; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\LeadBundle\Tracker\ContactTracker; | |
use Mautic\SmsBundle\Callback\CallbackInterface; | |
use Mautic\SmsBundle\Event\ReplyEvent; | |
use Mautic\SmsBundle\Exception\NumberNotFoundException; | |
use Mautic\SmsBundle\SmsEvents; | |
use Psr\Log\LoggerInterface; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; | |
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | |
class ReplyHelper | |
{ | |
public function __construct( | |
private EventDispatcherInterface $eventDispatcher, | |
private LoggerInterface $logger, | |
private ContactTracker $contactTracker | |
) { | |
} | |
/** | |
* @param string $pattern | |
* @param string $replyBody | |
*/ | |
public static function matches($pattern, $replyBody): bool | |
{ | |
return fnmatch($pattern, $replyBody, FNM_CASEFOLD); | |
} | |
/** | |
* @return Response | |
* | |
* @throws \Exception | |
*/ | |
public function handleRequest(CallbackInterface $handler, Request $request) | |
{ | |
// Set the default response | |
$response = new Response(); | |
try { | |
$message = $handler->getMessage($request); | |
$contacts = $handler->getContacts($request); | |
$this->logger->debug(sprintf('SMS REPLY: Processing message "%s"', $message)); | |
$this->logger->debug(sprintf('SMS REPLY: Found IDs %s', implode(',', $contacts->getKeys()))); | |
foreach ($contacts as $contact) { | |
// Set the contact for campaign decisions | |
$this->contactTracker->setSystemContact($contact); | |
$eventResponse = $this->dispatchReplyEvent($contact, $message); | |
if ($eventResponse instanceof Response) { | |
// Last one wins | |
$response = $eventResponse; | |
} | |
} | |
} catch (BadRequestHttpException) { | |
return new Response('invalid request', 400); | |
} catch (NotFoundHttpException) { | |
return new Response('', 404); | |
} catch (NumberNotFoundException $exception) { | |
$this->logger->debug( | |
sprintf( | |
'%s: %s was not found. The message sent was "%s"', | |
$handler->getTransportName(), | |
$exception->getNumber(), | |
!empty($message) ? $message : 'unknown' | |
) | |
); | |
} | |
return $response; | |
} | |
private function dispatchReplyEvent(Lead $contact, string $message): ?Response | |
{ | |
$replyEvent = new ReplyEvent($contact, trim($message)); | |
$this->eventDispatcher->dispatch($replyEvent, SmsEvents::ON_REPLY); | |
return $replyEvent->getResponse(); | |
} | |
} | |