Skip to content

Commit

Permalink
Add TelegramBotHandler topics support (#1802)
Browse files Browse the repository at this point in the history
  • Loading branch information
SamAsEnd authored Jun 20, 2023
1 parent 4356885 commit 1fd8e8c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
26 changes: 23 additions & 3 deletions src/Monolog/Handler/TelegramBotHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,18 @@ class TelegramBotHandler extends AbstractProcessingHandler
*/
private bool $delayBetweenMessages;

/**
* Telegram message thread id, unique identifier for the target message thread (topic) of the forum; for forum supergroups only
* See how to get the `message_thread_id` https://stackoverflow.com/a/75178418
*/
private int|null $topic;

/**
* @param string $apiKey Telegram bot access token provided by BotFather
* @param string $channel Telegram channel name
* @param bool $splitLongMessages Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages
* @param bool $delayBetweenMessages Adds delay between sending a split message according to Telegram API
* @param int $topic Telegram message thread id, unique identifier for the target message thread (topic) of the forum
* @throws MissingExtensionException If the curl extension is missing
*/
public function __construct(
Expand All @@ -104,7 +111,8 @@ public function __construct(
bool $disableWebPagePreview = null,
bool $disableNotification = null,
bool $splitLongMessages = false,
bool $delayBetweenMessages = false
bool $delayBetweenMessages = false,
int $topic = null
) {
if (!extension_loaded('curl')) {
throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler');
Expand All @@ -119,6 +127,7 @@ public function __construct(
$this->disableNotification($disableNotification);
$this->splitLongMessages($splitLongMessages);
$this->delayBetweenMessages($delayBetweenMessages);
$this->setTopic($topic);
}

public function setParseMode(string $parseMode = null): self
Expand Down Expand Up @@ -169,6 +178,13 @@ public function delayBetweenMessages(bool $delayBetweenMessages = false): self
return $this;
}

public function setTopic(int $topic = null): self
{
$this->topic = $topic;

return $this;
}

/**
* @inheritDoc
*/
Expand Down Expand Up @@ -224,13 +240,17 @@ protected function sendCurl(string $message): void
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
$params = [
'text' => $message,
'chat_id' => $this->channel,
'parse_mode' => $this->parseMode,
'disable_web_page_preview' => $this->disableWebPagePreview,
'disable_notification' => $this->disableNotification,
]));
];
if ($this->topic !== null) {
$params['message_thread_id'] = $this->topic;
}
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));

$result = Curl\Util::execute($ch);
if (!is_string($result)) {
Expand Down
5 changes: 3 additions & 2 deletions tests/Monolog/Handler/TelegramBotHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@ private function createHandler(
string $channel = 'testChannel',
string $parseMode = 'Markdown',
bool $disableWebPagePreview = false,
bool $disableNotification = true
bool $disableNotification = true,
int $topic = 1
): void {
$constructorArgs = [$apiKey, $channel, Level::Debug, true, $parseMode, $disableWebPagePreview, $disableNotification];
$constructorArgs = [$apiKey, $channel, Level::Debug, true, $parseMode, $disableWebPagePreview, $disableNotification, $topic];

$this->handler = $this->getMockBuilder(TelegramBotHandler::class)
->setConstructorArgs($constructorArgs)
Expand Down

0 comments on commit 1fd8e8c

Please sign in to comment.