Spaces:
No application file
No application file
namespace MauticPlugin\MauticSocialBundle\Helper; | |
use Mautic\AssetBundle\Helper\TokenHelper as AssetTokenHelper; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\LeadBundle\Helper\TokenHelper; | |
use Mautic\PageBundle\Entity\Trackable; | |
use Mautic\PageBundle\Helper\TokenHelper as PageTokenHelper; | |
use Mautic\PageBundle\Model\TrackableModel; | |
use Mautic\PluginBundle\Helper\IntegrationHelper; | |
use MauticPlugin\MauticSocialBundle\Model\TweetModel; | |
class CampaignEventHelper | |
{ | |
/** | |
* @var array | |
*/ | |
protected $clickthrough = []; | |
public function __construct( | |
protected IntegrationHelper $integrationHelper, | |
protected TrackableModel $trackableModel, | |
protected PageTokenHelper $pageTokenHelper, | |
protected AssetTokenHelper $assetTokenHelper, | |
protected TweetModel $tweetModel | |
) { | |
} | |
/** | |
* @return array|false | |
*/ | |
public function sendTweetAction(Lead $lead, array $event) | |
{ | |
$tweetSent = false; | |
$tweetEntity = $this->tweetModel->getEntity($event['channelId']); | |
if (!$tweetEntity) { | |
return ['failed' => 1, 'response' => 'Tweet entity '.$event['channelId'].' not found']; | |
} | |
/** @var \MauticPlugin\MauticSocialBundle\Integration\TwitterIntegration $twitterIntegration */ | |
$twitterIntegration = $this->integrationHelper->getIntegrationObject('Twitter'); | |
// Setup clickthrough for URLs in tweet | |
$this->clickthrough = [ | |
'source' => ['campaign', $event['campaign']['id']], | |
]; | |
$leadArray = $lead->getProfileFields(); | |
if (empty($leadArray['twitter'])) { | |
return false; | |
} | |
$tweetText = $tweetEntity->getText(); | |
$tweetText = $this->parseTweetText($tweetText, $leadArray, $tweetEntity->getId()); | |
$tweetUrl = $twitterIntegration->getApiUrl('statuses/update'); | |
$status = ['status' => $tweetText]; | |
// fire the tweet | |
$sendResponse = $twitterIntegration->makeRequest($tweetUrl, $status, 'POST', ['append_callback' => false]); | |
// verify the tweet was sent by checking for a tweet id | |
if (is_array($sendResponse) && array_key_exists('id_str', $sendResponse)) { | |
$tweetSent = true; | |
} | |
if ($tweetSent) { | |
$this->tweetModel->registerSend($tweetEntity, $lead, $sendResponse, 'campaign.event', $event['id']); | |
return ['timeline' => $tweetText, 'response' => $sendResponse]; | |
} | |
$response = ['failed' => 1, 'response' => $sendResponse]; | |
if (!empty($sendResponse['error']['message'])) { | |
$response['reason'] = $sendResponse['error']['message']; | |
} | |
return $response; | |
} | |
/** | |
* PreParse the twitter message and replace placeholders with values. | |
* | |
* @param string $text | |
* @param array $lead | |
* @param int $channelId | |
* | |
* @return string|string[] | |
*/ | |
protected function parseTweetText($text, $lead, $channelId = -1): array|string | |
{ | |
$tweetHandle = $lead['twitter']; | |
$tokens = [ | |
'{twitter_handle}' => (str_contains($tweetHandle, '@')) ? $tweetHandle : "@$tweetHandle", | |
]; | |
$tokens = array_merge( | |
$tokens, | |
TokenHelper::findLeadTokens($text, $lead), | |
$this->pageTokenHelper->findPageTokens($text, $this->clickthrough), | |
$this->assetTokenHelper->findAssetTokens($text, $this->clickthrough) | |
); | |
[$text, $trackables] = $this->trackableModel->parseContentForTrackables( | |
$text, | |
$tokens, | |
'social_twitter', | |
$channelId | |
); | |
/** | |
* @var string $token | |
* @var Trackable $trackable | |
*/ | |
foreach ($trackables as $token => $trackable) { | |
$tokens[$token] = $this->trackableModel->generateTrackableUrl($trackable, $this->clickthrough); | |
} | |
return str_replace(array_keys($tokens), array_values($tokens), $text); | |
} | |
} | |