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);
    }
}