From 4ebb99450ade2ebff2bd2b63be5983f7db07c24c Mon Sep 17 00:00:00 2001 From: Nsbx <8930930+Nsbx@users.noreply.github.com> Date: Wed, 12 Apr 2023 18:09:36 +0200 Subject: [PATCH] [Notifier] Add options to Telegram Bridge --- .../Notifier/Bridge/Telegram/CHANGELOG.md | 1 + .../Notifier/Bridge/Telegram/README.md | 29 +++++++ .../Bridge/Telegram/TelegramOptions.php | 32 ++++++++ .../Bridge/Telegram/TelegramTransport.php | 6 ++ .../Telegram/Tests/TelegramTransportTest.php | 81 +++++++++++++++++++ 5 files changed, 149 insertions(+) diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/Telegram/CHANGELOG.md index ec7a2a9e8ba35..760d2bb44036a 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * Add support to answer callback queries +* Add support for `sendPhoto` API method 5.3 --- diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/README.md b/src/Symfony/Component/Notifier/Bridge/Telegram/README.md index a142a59dd7fe3..333b536c454a2 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/README.md +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/README.md @@ -47,6 +47,35 @@ $chatMessage->options($telegramOptions); $chatter->send($chatMessage); ``` +Adding Photo to a Message +------------------------- + +With a Telegram message, you can use the `TelegramOptions` class to add +[message options](https://core.telegram.org/bots/api). + +```php +use Symfony\Component\Notifier\Bridge\Telegram\Reply\Markup\Button\InlineKeyboardButton; +use Symfony\Component\Notifier\Bridge\Telegram\Reply\Markup\InlineKeyboardMarkup; +use Symfony\Component\Notifier\Bridge\Telegram\TelegramOptions; +use Symfony\Component\Notifier\Message\ChatMessage; + +$chatMessage = new ChatMessage('Photo Caption'); + +// Create Telegram options +$telegramOptions = (new TelegramOptions()) + ->chatId('@symfonynotifierdev') + ->parseMode('MarkdownV2') + ->disableWebPagePreview(true) + ->hasSpoiler(true) + ->protectContent(true) + ->photo('https://symfony.com/favicons/android-chrome-192x192.png'); + +// Add the custom options to the chat message and send the message +$chatMessage->options($telegramOptions); + +$chatter->send($chatMessage); +``` + Updating Messages ----------------- diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramOptions.php b/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramOptions.php index aa4604d378fb5..f794620de4a00 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramOptions.php +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramOptions.php @@ -80,6 +80,38 @@ public function disableNotification(bool $bool): static return $this; } + /** + * @return $this + */ + public function protectContent(bool $bool): static + { + $this->options['protect_content'] = $bool; + + return $this; + } + + /** + * Work only when photo option is defined. + * + * @return $this + */ + public function hasSpoiler(bool $bool): static + { + $this->options['has_spoiler'] = $bool; + + return $this; + } + + /** + * @return $this + */ + public function photo(string $url): static + { + $this->options['photo'] = $url; + + return $this; + } + /** * @return $this */ diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php b/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php index a3f60009f30e9..ad8763371d5ad 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php @@ -84,6 +84,11 @@ protected function doSend(MessageInterface $message): SentMessage $options['text'] = preg_replace('/([_*\[\]()~`>#+\-=|{}.!])/', '\\\\$1', $message->getSubject()); } + if (isset($options['photo'])) { + $options['caption'] = $options['text']; + unset($options['text']); + } + $endpoint = sprintf('https://%s/bot%s/%s', $this->getEndpoint(), $this->token, $this->getPath($options)); $response = $this->client->request('POST', $endpoint, [ @@ -117,6 +122,7 @@ private function getPath(array $options): string return match (true) { isset($options['message_id']) => 'editMessageText', isset($options['callback_query_id']) => 'answerCallbackQuery', + isset($options['photo']) => 'sendPhoto', default => 'sendMessage', }; } diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php index bdefee4a79c0e..83251aa4f9c29 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php @@ -330,4 +330,85 @@ public function testSendWithMarkdownShouldEscapeSpecialCharacters() $transport->send(new ChatMessage('I contain special characters _ * [ ] ( ) ~ ` > # + - = | { } . ! to send.')); } + + public function testSendPhotoWithOptions() + { + $response = $this->createMock(ResponseInterface::class); + $response->expects($this->exactly(2)) + ->method('getStatusCode') + ->willReturn(200); + + $content = <<expects($this->once()) + ->method('getContent') + ->willReturn($content) + ; + + $expectedBody = [ + 'photo' => 'https://image.ur.l/', + 'has_spoiler' => true, + 'chat_id' => 'testChannel', + 'parse_mode' => 'MarkdownV2', + 'caption' => 'testMessage', + ]; + + $client = new MockHttpClient(function (string $method, string $url, array $options = []) use ($response, $expectedBody): ResponseInterface { + $this->assertStringEndsWith('/sendPhoto', $url); + $this->assertSame($expectedBody, json_decode($options['body'], true)); + + return $response; + }); + + $transport = self::createTransport($client, 'testChannel'); + + $messageOptions = new TelegramOptions(); + $messageOptions + ->photo('https://image.ur.l/') + ->hasSpoiler(true) + ; + + $sentMessage = $transport->send(new ChatMessage('testMessage', $messageOptions)); + + $this->assertEquals(1, $sentMessage->getMessageId()); + $this->assertEquals('telegram://api.telegram.org?channel=testChannel', $sentMessage->getTransport()); + } }