Issues (14)

src/channels/TelegramChannel.php (1 issue)

1
<?php
2
/**
3
 * @copyright Anton Tuyakhov <[email protected]>
4
 */
5
6
namespace tuyakhov\notifications\channels;
7
8
use tuyakhov\notifications\NotifiableInterface;
9
use tuyakhov\notifications\NotificationInterface;
10
use tuyakhov\notifications\messages\TelegramMessage;
11
use yii\base\Component;
12
use yii\base\InvalidArgumentException;
13
use yii\base\InvalidConfigException;
14
use yii\di\Instance;
15
use yii\helpers\Json;
16
use yii\httpclient\Client;
17
18
/**
19
 * See an example flow of sending notifications in Telegram
20
 * @see https://core.telegram.org/bots#deep-linking-example
21
 */
22
class TelegramChannel extends Component implements ChannelInterface
23
{
24
    /**
25
     * @var Client|array|string
26
     */
27
    public $httpClient;
28
29
    /**
30
     * @var string
31
     */
32
    public $apiUrl = "https://api.telegram.org/";
33
34
    /**
35
     * Each bot is given a unique authentication token when it is created.
36
     * The token looks something like 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
37
     * @var string
38
     */
39
    public $botToken;
40
41
    /**
42
     * @var string
43
     */
44
    public $parseMode = self::PARSE_MODE_MARKDOWN;
45
46
    const PARSE_MODE_HTML = "HTML";
47
48
    const PARSE_MODE_MARKDOWN = "Markdown";
49
50
    /**
51
     * @throws \yii\base\InvalidConfigException
52
     */
53
    public function init()
54
    {
55
        parent::init();
56
57
        if(!isset($this->botToken)){
58
            throw new InvalidConfigException('Bot token is undefined');
59
        }
60
61
        if (!isset($this->httpClient)) {
62
            $this->httpClient = [
63
                'class' => Client::className(),
64
                'baseUrl' => $this->apiUrl,
65
            ];
66
        }
67
        $this->httpClient = Instance::ensure($this->httpClient, Client::className());
68
    }
69
70
71
    /**
72
     * @inheritDoc
73
     */
74
    public function send(NotifiableInterface $recipient, NotificationInterface $notification)
75
    {
76
        /** @var TelegramMessage $message */
77
        $message = $notification->exportFor('telegram');
78
        $text = $message->body;
79
        if (!empty($message->subject)) {
80
            $text = "*{$message->subject}*\n{$message->body}";
81
        }
82
        $chatId = $recipient->routeNotificationFor('telegram');
83
        if(!$chatId){
84
            throw new InvalidArgumentException( 'No chat ID provided');
85
        }
86
87
        $data = [
88
            'chat_id' => $chatId,
89
            'text' => $text,
90
            'disable_notification' => $message->silentMode,
91
            'disable_web_page_preview' => $message->withoutPagePreview,
92
        ];
93
94
        if ($message->replyToMessageId) {
95
            $data['reply_to_message_id'] = $message->replyToMessageId;
96
        }
97
98
        if ($message->replyMarkup) {
0 ignored issues
show
Bug Best Practice introduced by Anton Tuyakhov
The expression $message->replyMarkup of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
99
            $data['reply_markup'] = Json::encode($message->replyMarkup);
100
        }
101
102
        if(isset($this->parseMode)){
103
            $data['parse_mode'] = $this->parseMode;
104
        }
105
106
        return $this->httpClient->createRequest()
107
            ->setUrl($this->createUrl())
108
            ->setData($data)
109
            ->send();
110
    }
111
112
    private function createUrl()
113
    {
114
        return "bot{$this->botToken}/sendMessage";
115
    }
116
}