| Server IP : 54.94.228.101 / Your IP : 172.28.1.13 Web Server : Apache System : Linux ip-172-28-29-189 6.5.0-1014-aws #14~22.04.1-Ubuntu SMP Thu Feb 15 15:27:06 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.2.34-43+ubuntu22.04.1+deb.sury.org+1 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/vinumday2_0/vendor/irazasyed/telegram-bot-sdk/src/ |
Upload File : |
<?php
namespace Telegram\Bot;
use Illuminate\Contracts\Container\Container;
use Telegram\Bot\Commands\CommandBus;
use Telegram\Bot\Commands\CommandInterface;
use Telegram\Bot\Exceptions\TelegramSDKException;
use Telegram\Bot\FileUpload\InputFile;
use Telegram\Bot\HttpClients\GuzzleHttpClient;
use Telegram\Bot\HttpClients\HttpClientInterface;
use Telegram\Bot\Objects\File;
use Telegram\Bot\Objects\Message;
use Telegram\Bot\Objects\Update;
use Telegram\Bot\Objects\User;
use Telegram\Bot\Objects\UserProfilePhotos;
/**
* Class Api.
*/
class Api
{
/**
* @var string Version number of the Telegram Bot PHP SDK.
*/
const VERSION = '2.0.0';
/**
* @var string The name of the environment variable that contains the Telegram Bot API Access Token.
*/
const BOT_TOKEN_ENV_NAME = 'TELEGRAM_BOT_TOKEN';
/**
* @var TelegramClient The Telegram client service.
*/
protected $client;
/**
* @var string Telegram Bot API Access Token.
*/
protected $accessToken = null;
/**
* @var TelegramResponse|null Stores the last request made to Telegram Bot API.
*/
protected $lastResponse;
/**
* @var bool Indicates if the request to Telegram will be asynchronous (non-blocking).
*/
protected $isAsyncRequest = false;
/**
* @var CommandBus|null Telegram Command Bus.
*/
protected $commandBus = null;
/**
* @var Container IoC Container
*/
protected static $container = null;
/**
* Timeout of the request in seconds.
*
* @var int
*/
protected $timeOut = 60;
/**
* Connection timeout of the request in seconds.
*
* @var int
*/
protected $connectTimeOut = 10;
/**
* Instantiates a new Telegram super-class object.
*
*
* @param string $token The Telegram Bot API Access Token.
* @param bool $async (Optional) Indicates if the request to Telegram
* will be asynchronous (non-blocking).
* @param string|HttpClientInterface $http_client_handler (Optional) Custom HTTP Client Handler.
*
* @throws TelegramSDKException
*/
public function __construct($token = null, $async = false, $http_client_handler = null)
{
$this->accessToken = isset($token) ? $token : getenv(static::BOT_TOKEN_ENV_NAME);
if (!$this->accessToken) {
throw new TelegramSDKException('Required "token" not supplied in config and could not find fallback environment variable "'.static::BOT_TOKEN_ENV_NAME.'"');
}
$httpClientHandler = null;
if (isset($http_client_handler)) {
if ($http_client_handler instanceof HttpClientInterface) {
$httpClientHandler = $http_client_handler;
} elseif ($http_client_handler === 'guzzle') {
$httpClientHandler = new GuzzleHttpClient();
} else {
throw new \InvalidArgumentException('The HTTP Client Handler must be set to "guzzle", or be an instance of Telegram\Bot\HttpClients\HttpClientInterface');
}
}
if (isset($async)) {
$this->setAsyncRequest($async);
}
$this->client = new TelegramClient($httpClientHandler);
}
/**
* Returns the TelegramClient service.
*
* @return TelegramClient
*/
public function getClient()
{
return $this->client;
}
/**
* Returns Telegram Bot API Access Token.
*
* @return string
*/
public function getAccessToken()
{
return $this->accessToken;
}
/**
* Returns the last response returned from API request.
*
* @return TelegramResponse
*/
public function getLastResponse()
{
return $this->lastResponse;
}
/**
* Sets the bot access token to use with API requests.
*
* @param string $accessToken The bot access token to save.
*
* @throws \InvalidArgumentException
*
* @return Api
*/
public function setAccessToken($accessToken)
{
if (is_string($accessToken)) {
$this->accessToken = $accessToken;
return $this;
}
throw new \InvalidArgumentException('The Telegram bot access token must be of type "string"');
}
/**
* Make this request asynchronous (non-blocking).
*
* @param bool $isAsyncRequest
*
* @return Api
*/
public function setAsyncRequest($isAsyncRequest)
{
$this->isAsyncRequest = $isAsyncRequest;
return $this;
}
/**
* Check if this is an asynchronous request (non-blocking).
*
* @return bool
*/
public function isAsyncRequest()
{
return $this->isAsyncRequest;
}
/**
* Returns SDK's Command Bus.
*
* @return CommandBus
*/
public function getCommandBus()
{
if (is_null($this->commandBus)) {
return $this->commandBus = new CommandBus($this);
}
return $this->commandBus;
}
/**
* Add Telegram Command to the Command Bus.
*
* @param CommandInterface|string $command
*
* @return CommandBus
*/
public function addCommand($command)
{
return $this->getCommandBus()->addCommand($command);
}
/**
* Add Telegram Commands to the Command Bus.
*
* @param array $commands
*
* @return CommandBus
*/
public function addCommands(array $commands)
{
return $this->getCommandBus()->addCommands($commands);
}
/**
* Remove Telegram Command to the Command Bus.
*
* @param string $name
*
* @return CommandBus
*/
public function removeCommand($name)
{
return $this->getCommandBus()->removeCommand($name);
}
/**
* Remove Telegram Commands from the Command Bus.
*
* @param array $names
*
* @return CommandBus
*/
public function removeCommands(array $names)
{
return $this->getCommandBus()->removeCommands($names);
}
/**
* Returns list of available commands.
*
* @return Commands\Command[]
*/
public function getCommands()
{
return $this->getCommandBus()->getCommands();
}
/**
* A simple method for testing your bot's auth token.
* Returns basic information about the bot in form of a User object.
*
* @link https://core.telegram.org/bots/api#getme
*
* @return User
*/
public function getMe()
{
$response = $this->post('getMe');
return new User($response->getDecodedBody());
}
/**
* Send text messages.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'text' => '',
* 'parse_mode' => '',
* 'disable_web_page_preview' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#sendmessage
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['text']
* @var string $params ['parse_mode']
* @var bool $params ['disable_web_page_preview']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @return Message
*/
public function sendMessage(array $params)
{
$response = $this->post('sendMessage', $params);
return new Message($response->getDecodedBody());
}
/**
* Forward messages of any kind.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'from_chat_id' => '',
* 'message_id' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#forwardmessage
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var int $params ['from_chat_id']
* @var int $params ['message_id']
*
* @return Message
*/
public function forwardMessage(array $params)
{
$response = $this->post('forwardMessage', $params);
return new Message($response->getDecodedBody());
}
/**
* Send Photos.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'photo' => '',
* 'caption' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#sendphoto
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['photo']
* @var string $params ['caption']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @return Message
*/
public function sendPhoto(array $params)
{
return $this->uploadFile('sendPhoto', $params);
}
/**
* Send regular audio files.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'audio' => '',
* 'duration' => '',
* 'performer' => '',
* 'title' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#sendaudio
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['audio']
* @var int $params ['duration']
* @var string $params ['performer']
* @var string $params ['title']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @return Message
*/
public function sendAudio(array $params)
{
return $this->uploadFile('sendAudio', $params);
}
/**
* Send general files.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'document' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#senddocument
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['document']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @return Message
*/
public function sendDocument(array $params)
{
return $this->uploadFile('sendDocument', $params);
}
/**
* Send .webp stickers.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'sticker' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#sendsticker
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['sticker']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @throws TelegramSDKException
*
* @return Message
*/
public function sendSticker(array $params)
{
if (is_file($params['sticker']) && (pathinfo($params['sticker'], PATHINFO_EXTENSION) !== 'webp')) {
throw new TelegramSDKException('Invalid Sticker Provided. Supported Format: Webp');
}
return $this->uploadFile('sendSticker', $params);
}
/**
* Send Video File, Telegram clients support mp4 videos (other formats may be sent as Document).
*
* <code>
* $params = [
* 'chat_id' => '',
* 'video' => '',
* 'duration' => '',
* 'caption' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @see sendDocument
* @link https://core.telegram.org/bots/api#sendvideo
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['video']
* @var int $params ['duration']
* @var string $params ['caption']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @return Message
*/
public function sendVideo(array $params)
{
return $this->uploadFile('sendVideo', $params);
}
/**
* Send voice audio files.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'voice' => '',
* 'duration' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#sendaudio
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['voice']
* @var int $params ['duration']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @return Message
*/
public function sendVoice(array $params)
{
return $this->uploadFile('sendVoice', $params);
}
/**
* Send point on the map.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'latitude' => '',
* 'longitude' => '',
* 'reply_to_message_id' => '',
* 'reply_markup' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#sendlocation
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var float $params ['latitude']
* @var float $params ['longitude']
* @var int $params ['reply_to_message_id']
* @var string $params ['reply_markup']
*
* @return Message
*/
public function sendLocation(array $params)
{
$response = $this->post('sendLocation', $params);
return new Message($response->getDecodedBody());
}
/**
* Broadcast a Chat Action.
*
* <code>
* $params = [
* 'chat_id' => '',
* 'action' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#sendchataction
*
* @param array $params
*
* @var int|string $params ['chat_id']
* @var string $params ['action']
*
* @throws TelegramSDKException
*
* @return TelegramResponse
*/
public function sendChatAction(array $params)
{
$validActions = [
'typing',
'upload_photo',
'record_video',
'upload_video',
'record_audio',
'upload_audio',
'upload_document',
'find_location',
];
if (isset($params['action']) && in_array($params['action'], $validActions)) {
return $this->post('sendChatAction', $params);
}
throw new TelegramSDKException('Invalid Action! Accepted value: '.implode(', ', $validActions));
}
/**
* Returns a list of profile pictures for a user.
*
* <code>
* $params = [
* 'user_id' => '',
* 'offset' => '',
* 'limit' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#getuserprofilephotos
*
* @param array $params
*
* @var int $params ['user_id']
* @var int $params ['offset']
* @var int $params ['limit']
*
* @return UserProfilePhotos
*/
public function getUserProfilePhotos(array $params)
{
$response = $this->post('getUserProfilePhotos', $params);
return new UserProfilePhotos($response->getDecodedBody());
}
/**
* Returns basic info about a file and prepare it for downloading.
*
* <code>
* $params = [
* 'file_id' => '',
* ];
* </code>
*
* The file can then be downloaded via the link
* https://api.telegram.org/file/bot<token>/<file_path>,
* where <file_path> is taken from the response.
*
* @link https://core.telegram.org/bots/api#getFile
*
* @param array $params
*
* @var string $params ['file_id']
*
* @return File
*/
public function getFile(array $params)
{
$response = $this->post('getFile', $params);
return new File($response->getDecodedBody());
}
/**
* Set a Webhook to receive incoming updates via an outgoing webhook.
*
* <code>
* $params = [
* 'url' => '',
* 'certificate' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#setwebhook
*
* @param array $params
*
* @var string $params ['url'] HTTPS url to send updates to.
* @var string $params ['certificate'] Upload your public key certificate so that the root certificate in
* use can be checked.
*
* @throws TelegramSDKException
*
* @return TelegramResponse
*/
public function setWebhook(array $params)
{
if (filter_var($params['url'], FILTER_VALIDATE_URL) === false) {
throw new TelegramSDKException('Invalid URL Provided');
}
if (parse_url($params['url'], PHP_URL_SCHEME) !== 'https') {
throw new TelegramSDKException('Invalid URL, should be a HTTPS url.');
}
return $this->uploadFile('setWebhook', $params);
}
/**
* Returns webhook updates sent by Telegram.
* Works only if you set a webhook.
*
* @see setWebhook
*
* @return Update
*/
public function getWebhookUpdates()
{
$body = json_decode(file_get_contents('php://input'), true);
return new Update($body);
}
/**
* Removes the outgoing webhook (if any).
*
* @return TelegramResponse
*/
public function removeWebhook()
{
$url = '';
return $this->post('setWebhook', compact('url'));
}
/**
* Use this method to receive incoming updates using long polling.
*
* <code>
* $params = [
* 'offset' => '',
* 'limit' => '',
* 'timeout' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#getupdates
*
* @param array $params
*
* @var int|null $params ['offset']
* @var int|null $params ['limit']
* @var int|null $params ['timeout']
*
* @return Update[]
*/
public function getUpdates(array $params = [])
{
$response = $this->post('getUpdates', $params);
$updates = $response->getDecodedBody();
$data = [];
if (isset($updates['result'])) {
foreach ($updates['result'] as $update) {
$data[] = new Update($update);
}
}
return $data;
}
/**
* Builds a custom keyboard markup.
*
* <code>
* $params = [
* 'keyboard' => '',
* 'resize_keyboard' => '',
* 'one_time_keyboard' => '',
* 'selective' => '',
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#replykeyboardmarkup
*
* @param array $params
*
* @var array $params ['keyboard']
* @var bool $params ['resize_keyboard']
* @var bool $params ['one_time_keyboard']
* @var bool $params ['selective']
*
* @return string
*/
public function replyKeyboardMarkup(array $params)
{
return json_encode($params);
}
/**
* Hide the current custom keyboard and display the default letter-keyboard.
*
* <code>
* $params = [
* 'hide_keyboard' => true,
* 'selective' => false,
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#replykeyboardhide
*
* @param array $params
*
* @var bool $params ['hide_keyboard']
* @var bool $params ['selective']
*
* @return string
*/
public static function replyKeyboardHide(array $params = [])
{
return json_encode(array_merge(['hide_keyboard' => true, 'selective' => false], $params));
}
/**
* Display a reply interface to the user (act as if the user has selected the bot‘s message and tapped ’Reply').
*
* <code>
* $params = [
* 'force_reply' => true,
* 'selective' => false,
* ];
* </code>
*
* @link https://core.telegram.org/bots/api#forcereply
*
* @param array $params
*
* @var bool $params ['force_reply']
* @var bool $params ['selective']
*
* @return string
*/
public static function forceReply(array $params = [])
{
return json_encode(array_merge(['force_reply' => true, 'selective' => false], $params));
}
/**
* Processes Inbound Commands.
*
* @param bool $webhook
*
* @return Update|Update[]
*/
public function commandsHandler($webhook = false)
{
if ($webhook) {
$update = $this->getWebhookUpdates();
$this->processCommand($update);
return $update;
}
$updates = $this->getUpdates();
$highestId = -1;
foreach ($updates as $update) {
$highestId = $update->getUpdateId();
$this->processCommand($update);
}
//An update is considered confirmed as soon as getUpdates is called with an offset higher than its update_id.
if ($highestId != -1) {
$params = [];
$params['offset'] = $highestId + 1;
$params['limit'] = 1;
$this->getUpdates($params);
}
return $updates;
}
/**
* Check update object for a command and process.
*
* @param Update $update
*/
protected function processCommand(Update $update)
{
$message = $update->getMessage();
if ($message !== null && $message->has('text')) {
$this->getCommandBus()->handler($message->getText(), $update);
}
}
/**
* Determine if a given type is the message.
*
* @param string $type
* @param Update|Message $object
*
* @return bool
*/
public function isMessageType($type, $object)
{
if ($object instanceof Update) {
$object = $object->getMessage();
}
if ($object->has(strtolower($type))) {
return true;
}
return $this->detectMessageType($object) === $type;
}
/**
* Detect Message Type Based on Update or Message Object.
*
* @param Update|Message $object
*
* @return string|null
*/
public function detectMessageType($object)
{
if ($object instanceof Update) {
$object = $object->getMessage();
}
$types = ['audio', 'document', 'photo', 'sticker', 'video', 'voice', 'contact', 'location', 'text'];
return $object->keys()
->intersect($types)
->pop();
}
/**
* Sends a GET request to Telegram Bot API and returns the result.
*
* @param string $endpoint
* @param array $params
*
* @throws TelegramSDKException
*
* @return TelegramResponse
*/
protected function get($endpoint, $params = [])
{
return $this->sendRequest(
'GET',
$endpoint,
$params
);
}
/**
* Sends a POST request to Telegram Bot API and returns the result.
*
* @param string $endpoint
* @param array $params
* @param bool $fileUpload Set true if a file is being uploaded.
*
* @return TelegramResponse
*/
protected function post($endpoint, array $params = [], $fileUpload = false)
{
if ($fileUpload) {
$params = ['multipart' => $params];
} else {
$params = ['form_params' => $params];
}
return $this->sendRequest(
'POST',
$endpoint,
$params
);
}
/**
* Sends a multipart/form-data request to Telegram Bot API and returns the result.
* Used primarily for file uploads.
*
* @param string $endpoint
* @param array $params
*
* @throws TelegramSDKException
*
* @return Message
*/
protected function uploadFile($endpoint, array $params = [])
{
$i = 0;
$multipart_params = [];
foreach ($params as $name => $contents) {
if (is_null($contents)) {
continue;
}
if (!is_resource($contents) && $name !== 'url') {
$validUrl = filter_var($contents, FILTER_VALIDATE_URL);
$contents = (is_file($contents) || $validUrl) ? (new InputFile($contents))->open() : (string)$contents;
}
$multipart_params[$i]['name'] = $name;
$multipart_params[$i]['contents'] = $contents;
++$i;
}
$response = $this->post($endpoint, $multipart_params, true);
return new Message($response->getDecodedBody());
}
/**
* Sends a request to Telegram Bot API and returns the result.
*
* @param string $method
* @param string $endpoint
* @param array $params
*
* @throws TelegramSDKException
*
* @return TelegramResponse
*/
protected function sendRequest(
$method,
$endpoint,
array $params = []
) {
$request = $this->request($method, $endpoint, $params);
return $this->lastResponse = $this->client->sendRequest($request);
}
/**
* Instantiates a new TelegramRequest entity.
*
* @param string $method
* @param string $endpoint
* @param array $params
*
* @return TelegramRequest
*/
protected function request(
$method,
$endpoint,
array $params = []
) {
return new TelegramRequest(
$this->getAccessToken(),
$method,
$endpoint,
$params,
$this->isAsyncRequest(),
$this->getTimeOut(),
$this->getConnectTimeOut()
);
}
/**
* Magic method to process any "get" requests.
*
* @param $method
* @param $arguments
*
* @return bool|TelegramResponse
*/
public function __call($method, $arguments)
{
$action = substr($method, 0, 3);
if ($action === 'get') {
/* @noinspection PhpUndefinedFunctionInspection */
$class_name = studly_case(substr($method, 3));
$class = 'Telegram\Bot\Objects\\'.$class_name;
$response = $this->post($method, $arguments[0] ?: []);
if (class_exists($class)) {
return new $class($response->getDecodedBody());
}
return $response;
}
return false;
}
/**
* Set the IoC Container.
*
* @param $container Container instance
*
* @return void
*/
public static function setContainer(Container $container)
{
self::$container = $container;
}
/**
* Get the IoC Container.
*
* @return Container
*/
public function getContainer()
{
return self::$container;
}
/**
* Check if IoC Container has been set.
*
* @return boolean
*/
public function hasContainer()
{
return self::$container !== null;
}
/**
* @return int
*/
public function getTimeOut()
{
return $this->timeOut;
}
/**
* @param int $timeOut
*
* @return $this
*/
public function setTimeOut($timeOut)
{
$this->timeOut = $timeOut;
return $this;
}
/**
* @return int
*/
public function getConnectTimeOut()
{
return $this->connectTimeOut;
}
/**
* @param int $connectTimeOut
*
* @return $this
*/
public function setConnectTimeOut($connectTimeOut)
{
$this->connectTimeOut = $connectTimeOut;
return $this;
}
}