Spaces:
No application file
No application file
File size: 4,046 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
<?php
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);
}
}
|