diff --git a/README.md b/README.md index 4e2d080..b7f1d78 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,16 @@ TgBotLib is a library for creating Telegram Bots in PHP, based on the [Telegram The approach taken by this library is to be as close as possible to the Telegram Bot API, while providing a simple and easy to use interface that is easy to understand and out of your way, allowing you to use the library as a simple -wrapper around the API. +native around the API. + +## Versioning + +The library's version is based on the version of the Telegram Bot API that it supports, for example, the version `6.5.0` +of the library supports the Telegram Bot API version `6.5` and patch version reflect the current patch version of the library. + +To clarify, for example `6.5.4` means the library is based on the Telegram Bot API version `6.5` and the library's patch +version is `4`. Library patches are used to fix bugs or add improvements in the library, and are not related to the +Telegram Bot API version. ## Installation @@ -37,7 +46,6 @@ ncc source add --name n64 --type gitlab --host git.n64.cc 3. Profit ```php - require 'ncc'; import('net.nosial.tgbotlib'); @@ -58,10 +66,14 @@ named parameters. For example, the `sendMessage` method requires the `chat_id` a of passing them as an array, you can pass them as named parameters: ```php -$bot->sendMessage('', 'Hello World!', [ - 'parse_mode' => 'Markdown', - 'disable_web_page_preview' => true, -]); +$bot->sendMessage( + chat_id: '', + text: 'Hello World!', + options: [ + 'parse_mode' => 'Markdown', + 'disable_web_page_preview' => true, + ] +); ``` ## Documentation diff --git a/project.json b/project.json index 77037e9..535d01d 100644 --- a/project.json +++ b/project.json @@ -10,7 +10,7 @@ "assembly": { "name": "TgBotLib", "package": "net.nosial.tgbotlib", - "version": "1.0.0", + "version": "6.5.0", "uuid": "b409e036-ab04-11ed-b32e-9d3f57a644ae" }, "build": { diff --git a/src/TgBotLib/Bot.php b/src/TgBotLib/Bot.php index 4b0830f..7b59959 100644 --- a/src/TgBotLib/Bot.php +++ b/src/TgBotLib/Bot.php @@ -8,9 +8,13 @@ use CurlHandle; use TgBotLib\Exceptions\TelegramException; use TgBotLib\Interfaces\ObjectTypeInterface; + use TgBotLib\Objects\Telegram\Chat; use TgBotLib\Objects\Telegram\ChatInviteLink; + use TgBotLib\Objects\Telegram\ChatMember; use TgBotLib\Objects\Telegram\File; + use TgBotLib\Objects\Telegram\ForumTopic; use TgBotLib\Objects\Telegram\Message; + use TgBotLib\Objects\Telegram\Sticker; use TgBotLib\Objects\Telegram\Update; use TgBotLib\Objects\Telegram\User; use TgBotLib\Objects\Telegram\UserProfilePhotos; @@ -340,7 +344,7 @@ * @link https://core.telegram.org/bots/api#sendmessage * @noinspection PhpUnused */ - public function sendMessage(string|int $chat_id, string $text, array ...$options): Message + public function sendMessage(string|int $chat_id, string $text, array $options): Message { return Message::fromArray($this->sendRequest('sendMessage', array_merge($options, [ 'chat_id' => $chat_id, @@ -1030,6 +1034,7 @@ * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) * @param array $options Optional parameters * @return ChatInviteLink + * @throws TelegramException * @link https://core.telegram.org/bots/api#createchatinvitelink * @noinspection PhpUnused */ @@ -1047,9 +1052,11 @@ * * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) * @param string $invite_link The invite link to edit - * @param array $options + * @param array $options Optional parameters * @return ChatInviteLink * @throws TelegramException + * @link https://core.telegram.org/bots/api#editchatinvitelink + * @noinspection PhpUnused */ public function editChatInviteLink(string|int $chat_id, string $invite_link, array $options=[]): ChatInviteLink { @@ -1064,6 +1071,8 @@ * @param string $invite_link * @return ChatInviteLink * @throws TelegramException + * @link https://core.telegram.org/bots/api#revokechatinvitelink + * @noinspection PhpUnused */ public function revokeChatInviteLink(string|int $chat_id, string $invite_link): ChatInviteLink { @@ -1073,4 +1082,592 @@ ])); } + /** + * Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work + * and must have the can_invite_users administrator right. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @param int $user_id Unique identifier of the target user + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#approvechatjoinrequest + * @noinspection PhpUnused + */ + public function approveChatJoinRequest(string|int $chat_id, int $user_id): bool + { + $this->sendRequest('approveChatJoinRequest', [ + 'chat_id' => $chat_id, + 'user_id' => $user_id + ]); + + return true; + } + + /** + * Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work + * and must have the can_invite_users administrator right. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @param int $user_id Unique identifier of the target user + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#declinechatjoinrequest + * @noinspection PhpUnused + */ + public function declineChatJoinRequest(string|int $chat_id, int $user_id): bool + { + $this->sendRequest('declineChatJoinRequest', [ + 'chat_id' => $chat_id, + 'user_id' => $user_id + ]); + + return true; + } + + /** + * Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot + * must be an administrator in the chat for this to work and must have the appropriate administrator rights. + * Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @param string $photo New chat photo, uploaded using multipart/form-data + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#setchatphoto + * @noinspection PhpUnused + */ + public function setChatPhoto(string|int $chat_id, string $photo): bool + { + if(file_exists($photo)) + { + $this->sendFileUpload('sendChatPhoto', 'photo', $photo, [ + 'chat_id' => $chat_id + ]); + + return true; + } + + $this->sendRequest('setChatPhoto', [ + 'chat_id' => $chat_id, + 'photo' => $photo + ]); + + return true; + } + + /** + * Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an + * administrator in the chat for this to work and must have the appropriate administrator rights. Returns True + * on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#deletechatphoto + * @noinspection PhpUnused + */ + public function deleteChatPhoto(string|int $chat_id): bool + { + $this->sendRequest('deleteChatPhoto', [ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an + * administrator in the chat for this to work and must have the appropriate administrator rights. Returns True + * on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @param string $title New chat title, 1-128 characters + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#setchattitle + * @noinspection PhpUnused + */ + public function setChatTitle(string|int $chat_id, string $title): bool + { + $this->sendRequest('setChatTitle', [ + 'chat_id' => $chat_id, + 'title' => $title + ]); + + return true; + } + + /** + * Use this method to change the description of a group, a supergroup or a channel. The bot must be an + * administrator in the chat for this to work and must have the appropriate administrator rights. Returns True + * on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @param string $description New chat description, 0-255 characters + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#setchatdescription + * @noinspection PhpUnused + */ + public function setChatDescription(string|int $chat_id, string $description): bool + { + $this->sendRequest('setChatDescription', [ + 'chat_id' => $chat_id, + 'description' => $description + ]); + + return true; + } + + /** + * Use this method to add a message to the list of pinned messages in a chat. If the chat is not a private chat, + * the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' + * administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns True on + * success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @param int $message_id Identifier of a message to pin + * @param bool $disable_notification Pass True if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats. + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#pinchatmessage + * @noinspection PhpUnused + */ + public function pinChatMessage(string|int $chat_id, int $message_id, bool $disable_notification=false): bool + { + $this->sendRequest('pinChatMessage', [ + 'chat_id' => $chat_id, + 'message_id' => $message_id, + 'disable_notification' => $disable_notification + ]); + + return true; + } + + /** + * Use this method to remove a message from the list of pinned messages in a chat. If the chat is not a private + * chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' + * administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns True on + * success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @param int $message_id Identifier of a message to unpin. If not specified, the most recent pinned message (by sending date) will be unpinned. + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#unpinchatmessage + * @noinspection PhpUnused + */ + public function unpinChatMessage(string|int $chat_id, int $message_id): bool + { + $this->sendRequest('unpinChatMessage', [ + 'chat_id' => $chat_id, + 'message_id' => $message_id + ]); + + return true; + } + + /** + * Use this method to clear the list of pinned messages in a chat. If the chat is not a private chat, the bot + * must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator + * right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target channel (in the format @channelusername) + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#unpinallchatmessages + * @noinspection PhpUnused + */ + public function unpinAllChatMessages(string|int $chat_id): bool + { + $this->sendRequest('unpinAllChatMessages', [ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * Use this method for your bot to leave a group, supergroup or channel. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername) + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#leavechat + * @noinspection PhpUnused + */ + public function leaveChat(string|int $chat_id): bool + { + $this->sendRequest('leaveChat', [ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * Use this method to get up-to-date information about the chat (current name of the user for one-on-one + * conversations, current username of a user, group or channel, etc.). Returns a Chat object on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername) + * @return Chat + * @throws TelegramException + * @link https://core.telegram.org/bots/api#getchat + * @noinspection PhpUnused + */ + public function getChat(string|int $chat_id): Chat + { + return Chat::fromArray($this->sendRequest('getChat', [ + 'chat_id' => $chat_id + ])); + } + + /** + * Use this method to get a list of administrators in a chat, which aren't bots. Returns an Array of ChatMember + * objects. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername) + * @return ChatMember[] + * @throws TelegramException + * @link https://core.telegram.org/bots/api#getchatadministrators + * @noinspection PhpUnused + */ + public function getChatAdministrators(string|int $chat_id): array + { + return array_map(function ($item) { + return ChatMember::fromArray($item); + }, $this->sendRequest('getChatAdministrators', [ + 'chat_id' => $chat_id + ])); + } + + /** + * Use this method to get the number of members in a chat. Returns Int on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername) + * @return int + * @throws TelegramException + * @link https://core.telegram.org/bots/api#getchatmembercount + * @noinspection PhpUnused + */ + public function getChatMemberCount(string|int $chat_id): int + { + return $this->sendRequest('getChatMemberCount', [ + 'chat_id' => $chat_id + ]); + } + + /** + * Use this method to get information about a member of a chat. The method is only guaranteed to work for other + * users if the bot is an administrator in the chat. Returns a ChatMember object on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername) + * @param int $user_id Unique identifier of the target user + * @return ChatMember + * @throws TelegramException + * @link https://core.telegram.org/bots/api#getchatmember + * @noinspection PhpUnused + */ + public function getChatMember(string|int $chat_id, int $user_id): ChatMember + { + return ChatMember::fromArray($this->sendRequest('getChatMember', [ + 'chat_id' => $chat_id, + 'user_id' => $user_id + ])); + } + + /** + * Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat + * for this to work and must have the appropriate administrator rights. Use the field can_set_sticker_set + * optionally returned in getChat requests to check if the bot can use this method. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param string $sticker_set_name Name of the sticker set to be set as the group sticker set + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#setchatstickerset + * @noinspection PhpUnused + */ + public function setChatStickerSet(string|int $chat_id, string $sticker_set_name): bool + { + $this->sendRequest('setChatStickerSet', [ + 'chat_id' => $chat_id, + 'sticker_set_name' => $sticker_set_name + ]); + + return true; + } + + /** + * Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat + * for this to work and must have the appropriate administrator rights. Use the field can_set_sticker_set + * optionally returned in getChat requests to check if the bot can use this method. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#deletechatstickerset + * @noinspection PhpUnused + */ + public function deleteChatStickerSet(string|int $chat_id): bool + { + $this->sendRequest('deleteChatStickerSet', [ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user. Requires + * no parameters. Returns an Array of Sticker objects. + * + * @return Sticker[] + * @throws TelegramException + * @link https://core.telegram.org/bots/api#getforumtopiciconstickers + * @noinspection PhpUnused + */ + public function getForumTopicIconStickers(): array + { + return array_map(function ($item) { + return Sticker::fromArray($item); + }, $this->sendRequest('getForumTopicIconStickers')); + } + + /** + * Use this method to create a topic in a forum supergroup chat. The bot must be an administrator in the chat + * for this to work and must have the can_manage_topics administrator rights. Returns information about the + * created topic as a ForumTopic object. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param string $name Topic name, 1-128 characters + * @param array $options Optional parameters + * @return ForumTopic + * @throws TelegramException + * @link https://core.telegram.org/bots/api#createforumtopic + * @noinspection PhpUnused + */ + public function createForumTopic(string|int $chat_id, string $name, array $options=[]): ForumTopic + { + return ForumTopic::fromArray($this->sendRequest('createForumTopic', array_merge([ + 'chat_id' => $chat_id, + 'name' => $name + ], $options))); + } + + /** + * Use this method to edit name and icon of a topic in a forum supergroup chat. The bot must be an administrator + * in the chat for this to work and must have can_manage_topics administrator rights, unless it is the creator + * of the topic. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param string $name Unique identifier for the target message thread of the forum topic + * @param array $options Optional parameters + * @return ForumTopic + * @throws TelegramException + * @link https://core.telegram.org/bots/api#editforumtopic + * @noinspection PhpUnused + */ + public function editForumTopic(string|int $chat_id, string $name, array $options=[]): ForumTopic + { + return ForumTopic::fromArray($this->sendRequest('editForumTopic', array_merge([ + 'chat_id' => $chat_id, + 'name' => $name + ], $options))); + } + + /** + * Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the + * chat for this to work and must have the can_manage_topics administrator rights, unless it is the creator of + * the topic. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param int $message_thread_id Unique identifier for the target message thread of the forum topic + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#closeforumtopic + * @noinspection PhpUnused + */ + public function closeForumTopic(string|int $chat_id, int $message_thread_id): bool + { + $this->sendRequest('closeForumTopic',[ + 'chat_id' => $chat_id, + 'message_thread_id' => $message_thread_id + ]); + + return true; + } + + /** + * Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the + * chat for this to work and must have the can_manage_topics administrator rights, unless it is the creator of + * the topic. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param int $message_thread_id Unique identifier for the target message thread of the forum topic + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#reopenforumtopic + * @noinspection PhpUnused + */ + public function reopenForumTopic(string|int $chat_id, int $message_thread_id): bool + { + $this->sendRequest('reopenForumTopic',[ + 'chat_id' => $chat_id, + 'message_thread_id' => $message_thread_id + ]); + + return true; + } + + /** + * Use this method to delete a forum topic along with all its messages in a forum supergroup chat. The bot must + * be an administrator in the chat for this to work and must have the can_delete_messages administrator rights. + * Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param int $message_thread_id Unique identifier for the target message thread of the forum topic + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#deleteforumtopic + * @noinspection PhpUnused + */ + public function deleteForumTopic(string|int $chat_id, int $message_thread_id): bool + { + $this->sendRequest('deleteForumTopic',[ + 'chat_id' => $chat_id, + 'message_thread_id' => $message_thread_id + ]); + + return true; + } + + /** + * Use this method to clear the list of pinned messages in a forum topic. The bot must be an administrator in + * the chat for this to work and must have the can_pin_messages administrator right in the supergroup. + * Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param int $message_thread_id Unique identifier for the target message thread of the forum topic + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#unpinallforumtopicmessages + * @noinspection PhpUnused + */ + public function unpinAllForumTopicMessages(string|int $chat_id, int $message_thread_id): bool + { + $this->sendRequest('unpinAllForumTopicMessages',[ + 'chat_id' => $chat_id, + 'message_thread_id' => $message_thread_id + ]); + + return true; + } + + /** + * Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot must be an + * administrator in the chat for this to work and must have can_manage_topics administrator rights. + * Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @param string $name New topic name, 1-128 characters + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#editgeneralforumtopic + * @noinspection PhpUnused + */ + public function editGeneralForumTopic(string|int $chat_id, string $name): bool + { + $this->sendRequest('editGeneralForumTopic',[ + 'chat_id' => $chat_id, + 'name' => $name + ]); + + return true; + } + + /** + * Use this method to close an open 'General' topic in a forum supergroup chat. The bot must be an administrator + * in the chat for this to work and must have the can_manage_topics administrator rights. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#closegeneralforumtopic + * @noinspection PhpUnused + */ + public function closeGeneralForumTopic(string|int $chat_id): bool + { + $this->sendRequest('closeGeneralForumTopic',[ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must be an + * administrator in the chat for this to work and must have the can_manage_topics administrator rights. + * The topic will be automatically unhidden if it was hidden. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#reopengeneralforumtopic + * @noinspection PhpUnused + */ + public function reopenGeneralForumTopic(string|int $chat_id): bool + { + $this->sendRequest('reopenGeneralForumTopic',[ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * @param string|int $chat_id + * @return bool + * @throws TelegramException + */ + public function hideGeneralForumTopic(string|int $chat_id): bool + { + $this->sendRequest('hideGeneralForumTopic',[ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must be an administrator in + * the chat for this to work and must have the can_manage_topics administrator rights. Returns True on success. + * + * @param string|int $chat_id Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername) + * @return bool + * @throws TelegramException + * @link https://core.telegram.org/bots/api#unhidegeneralforumtopic + * @noinspection PhpUnused + */ + public function unhideGeneralForumTopic(string|int $chat_id): bool + { + $this->sendRequest('unhideGeneralForumTopic',[ + 'chat_id' => $chat_id + ]); + + return true; + } + + /** + * @param string $callback_query_id + * @param array $options + * @return bool + * @throws TelegramException + */ + public function answerCallbackQuery(string $callback_query_id, array $options=[]): bool + { + $this->sendRequest('answerCallbackQuery', array_merge([ + 'callback_query_id' => $callback_query_id + ], $options)); + } } \ No newline at end of file diff --git a/tests/get_updates.php b/tests/get_updates.php index 3357c8d..da40fa5 100644 --- a/tests/get_updates.php +++ b/tests/get_updates.php @@ -4,16 +4,4 @@ import('net.nosial.tgbotlib'); $bot = new TgBotLib\Bot('5126030313:AAEn3QcwSvTJ2eAKUnSb_MkC5U0tlqkM1xw'); - - while(true) - { - foreach($bot->getUpdates() as $update) - { - if($update->getMessage() !== null && $update->getMessage()->getText() !== null) - { - print(sprintf("%s: %s", $update->getMessage()->getFrom()->getFirstName(), $update->getMessage()->getText()) . PHP_EOL); - $bot->sendMessage($update->getMessage()->getChat()->getId(), sprintf("Hello %s!", $update->getMessage()->getFrom()->getFirstName())); - $bot->sendPhoto($update->getMessage()->getChat()->getId(), 'https://git.n64.cc/uploads/-/system/appearance/header_logo/1/9d9bd13afce1a798d22ecfd9897730ed.gif'); - } - } - } \ No newline at end of file + $bot->sendMessage(chat_id: 570787098, text: 'Hello world!'); \ No newline at end of file