forked from LIERLIER/telegram-bot-base
LIERLIER
1 year ago
commit
197a7949bd
55 changed files with 3702 additions and 0 deletions
-
4.gitignore
-
245Commands/Config/DateCommand.php
-
28Commands/Config/README.md
-
156Commands/Config/WeatherCommand.php
-
105Commands/Conversation/CancelCommand.php
-
85Commands/Conversation/GenericmessageCommand.php
-
9Commands/Conversation/README.md
-
258Commands/Conversation/SurveyCommand.php
-
61Commands/GenericCommand.php
-
82Commands/Group/GenericmessageCommand.php
-
58Commands/Group/LeftchatmemberCommand.php
-
67Commands/Group/NewchatmembersCommand.php
-
6Commands/Group/README.md
-
54Commands/InlineMode/ChoseninlineresultCommand.php
-
100Commands/InlineMode/InlinequeryCommand.php
-
7Commands/InlineMode/README.md
-
61Commands/Keyboard/CallbackqueryCommand.php
-
60Commands/Keyboard/ForcereplyCommand.php
-
61Commands/Keyboard/HidekeyboardCommand.php
-
72Commands/Keyboard/InlinekeyboardCommand.php
-
102Commands/Keyboard/KeyboardCommand.php
-
13Commands/Keyboard/README.md
-
53Commands/Message/ChannelpostCommand.php
-
53Commands/Message/EditedchannelpostCommand.php
-
52Commands/Message/EditedmessageCommand.php
-
82Commands/Message/EditmessageCommand.php
-
61Commands/Message/GenericmessageCommand.php
-
15Commands/Message/README.md
-
64Commands/Other/EchoCommand.php
-
133Commands/Other/HelpCommand.php
-
110Commands/Other/ImageCommand.php
-
68Commands/Other/MarkdownCommand.php
-
5Commands/Other/README.md
-
67Commands/Other/SlapCommand.php
-
115Commands/Other/UploadCommand.php
-
124Commands/Other/WhoamiCommand.php
-
60Commands/Payments/GenericmessageCommand.php
-
125Commands/Payments/PaymentCommand.php
-
57Commands/Payments/PrecheckoutqueryCommand.php
-
39Commands/Payments/README.md
-
80Commands/Payments/ShippingqueryCommand.php
-
25Commands/README.MD
-
74Commands/ServiceMessages/GenericmessageCommand.php
-
72Commands/StartCommand.php
-
13CustomCommands/README.md
-
13README.md
-
31composer.json
-
92config.php
-
50cron.php
-
53getUpdatesCLI.php
-
78hook.php
-
42manager.php
-
26phpcs.xml.dist
-
42set.php
-
34unset.php
@ -0,0 +1,4 @@ |
|||||
|
composer.phar |
||||
|
composer.lock |
||||
|
#config.php |
||||
|
vendor |
@ -0,0 +1,245 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/date" command |
||||
|
* |
||||
|
* Shows the date and time of the location passed as the parameter. |
||||
|
* |
||||
|
* A Google API key is required for this command! |
||||
|
* You can be set in your config.php file: |
||||
|
* ['commands']['configs']['date'] => ['google_api_key' => 'your_google_api_key_here'] |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use GuzzleHttp\Client; |
||||
|
use GuzzleHttp\Exception\RequestException; |
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
use Longman\TelegramBot\TelegramLog; |
||||
|
|
||||
|
class DateCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'date'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Show date/time by location'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/date <location>'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.5.0'; |
||||
|
|
||||
|
/** |
||||
|
* Guzzle Client object |
||||
|
* |
||||
|
* @var Client |
||||
|
*/ |
||||
|
private $client; |
||||
|
|
||||
|
/** |
||||
|
* Base URI for Google Maps API |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
private $google_api_base_uri = 'https://maps.googleapis.com/maps/api/'; |
||||
|
|
||||
|
/** |
||||
|
* The Google API Key from the command config |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
private $google_api_key; |
||||
|
|
||||
|
/** |
||||
|
* Date format |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
private $date_format = 'd-m-Y H:i:s'; |
||||
|
|
||||
|
/** |
||||
|
* Get coordinates of passed location |
||||
|
* |
||||
|
* @param string $location |
||||
|
* |
||||
|
* @return array |
||||
|
*/ |
||||
|
private function getCoordinates($location): array |
||||
|
{ |
||||
|
$path = 'geocode/json'; |
||||
|
$query = ['address' => urlencode($location)]; |
||||
|
|
||||
|
if ($this->google_api_key !== null) { |
||||
|
$query['key'] = $this->google_api_key; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
$response = $this->client->get($path, ['query' => $query]); |
||||
|
} catch (RequestException $e) { |
||||
|
TelegramLog::error($e->getMessage()); |
||||
|
|
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
if (!($data = $this->validateResponseData($response->getBody()))) { |
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
$result = $data['results'][0]; |
||||
|
$lat = $result['geometry']['location']['lat']; |
||||
|
$lng = $result['geometry']['location']['lng']; |
||||
|
$acc = $result['geometry']['location_type']; |
||||
|
$types = $result['types']; |
||||
|
|
||||
|
return [$lat, $lng, $acc, $types]; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get date for location passed via coordinates |
||||
|
* |
||||
|
* @param string $lat |
||||
|
* @param string $lng |
||||
|
* |
||||
|
* @return array |
||||
|
* @throws \Exception |
||||
|
*/ |
||||
|
private function getDate($lat, $lng): array |
||||
|
{ |
||||
|
$path = 'timezone/json'; |
||||
|
|
||||
|
$date_utc = new \DateTimeImmutable(null, new \DateTimeZone('UTC')); |
||||
|
$timestamp = $date_utc->format('U'); |
||||
|
|
||||
|
$query = [ |
||||
|
'location' => urlencode($lat) . ',' . urlencode($lng), |
||||
|
'timestamp' => urlencode($timestamp), |
||||
|
]; |
||||
|
|
||||
|
if ($this->google_api_key !== null) { |
||||
|
$query['key'] = $this->google_api_key; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
$response = $this->client->get($path, ['query' => $query]); |
||||
|
} catch (RequestException $e) { |
||||
|
TelegramLog::error($e->getMessage()); |
||||
|
|
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
if (!($data = $this->validateResponseData($response->getBody()))) { |
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
$local_time = $timestamp + $data['rawOffset'] + $data['dstOffset']; |
||||
|
|
||||
|
return [$local_time, $data['timeZoneId']]; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Evaluate the response data and see if the request was successful |
||||
|
* |
||||
|
* @param string $data |
||||
|
* |
||||
|
* @return array |
||||
|
*/ |
||||
|
private function validateResponseData($data): array |
||||
|
{ |
||||
|
if (empty($data)) { |
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
$data = json_decode($data, true); |
||||
|
if (empty($data)) { |
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
if (isset($data['status']) && $data['status'] !== 'OK') { |
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
return $data; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get formatted date at the passed location |
||||
|
* |
||||
|
* @param string $location |
||||
|
* |
||||
|
* @return string |
||||
|
* @throws \Exception |
||||
|
*/ |
||||
|
private function getFormattedDate($location): string |
||||
|
{ |
||||
|
if ($location === null || $location === '') { |
||||
|
return 'The time in nowhere is never'; |
||||
|
} |
||||
|
|
||||
|
[$lat, $lng] = $this->getCoordinates($location); |
||||
|
if (empty($lat) || empty($lng)) { |
||||
|
return 'It seems that in "' . $location . '" they do not have a concept of time.'; |
||||
|
} |
||||
|
|
||||
|
[$local_time, $timezone_id] = $this->getDate($lat, $lng); |
||||
|
|
||||
|
$date_utc = new \DateTimeImmutable(gmdate('Y-m-d H:i:s', $local_time), new \DateTimeZone($timezone_id)); |
||||
|
|
||||
|
return 'The local time in ' . $timezone_id . ' is: ' . $date_utc->format($this->date_format); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// First we set up the necessary member variables.
|
||||
|
$this->client = new Client(['base_uri' => $this->google_api_base_uri]); |
||||
|
if (($this->google_api_key = trim($this->getConfig('google_api_key'))) === '') { |
||||
|
$this->google_api_key = null; |
||||
|
} |
||||
|
|
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
$chat_id = $message->getChat()->getId(); |
||||
|
$location = $message->getText(true); |
||||
|
|
||||
|
$text = 'You must specify location in format: /date <city>'; |
||||
|
|
||||
|
if ($location !== '') { |
||||
|
$text = $this->getFormattedDate($location); |
||||
|
} |
||||
|
|
||||
|
$data = [ |
||||
|
'chat_id' => $chat_id, |
||||
|
'text' => $text, |
||||
|
]; |
||||
|
|
||||
|
return Request::sendMessage($data); |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
# Config |
||||
|
|
||||
|
Custom configurations can be passed to commands that support them. |
||||
|
|
||||
|
This feature is mainly used to pass secrets or special values to the commands. |
||||
|
|
||||
|
## Adding configurations to your config |
||||
|
|
||||
|
It is very easy to add configurations to `config.php`: |
||||
|
```php |
||||
|
'commands' => [ |
||||
|
'configs' => [ |
||||
|
'yourcommand' => ['your_config_key' => 'your_config_value'], |
||||
|
], |
||||
|
], |
||||
|
``` |
||||
|
|
||||
|
Alternatively, you can set them directly via code in your `hook.php`: |
||||
|
```php |
||||
|
$telegram->setCommandConfig('yourcommand', ['your_config_key' => 'your_config_value']); |
||||
|
``` |
||||
|
|
||||
|
## Reading configurations in your command |
||||
|
|
||||
|
To read any command configurations, you can fetch them from within your command like this: |
||||
|
```php |
||||
|
$my_config = $this->getConfig('your_config_key'); // 'your_config_value' |
||||
|
``` |
@ -0,0 +1,156 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/weather" command |
||||
|
* |
||||
|
* Get weather info for the location passed as the parameter.. |
||||
|
* |
||||
|
* A OpenWeatherMap.org API key is required for this command! |
||||
|
* You can be set in your config.php file: |
||||
|
* ['commands']['configs']['weather'] => ['owm_api_key' => 'your_owm_api_key_here'] |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Exception; |
||||
|
use GuzzleHttp\Client; |
||||
|
use GuzzleHttp\Exception\RequestException; |
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\TelegramLog; |
||||
|
|
||||
|
class WeatherCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'weather'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Show weather by location'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/weather <location>'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.3.0'; |
||||
|
|
||||
|
/** |
||||
|
* Base URI for OpenWeatherMap API |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
private $owm_api_base_uri = 'http://api.openweathermap.org/data/2.5/'; |
||||
|
|
||||
|
/** |
||||
|
* Get weather data using HTTP request |
||||
|
* |
||||
|
* @param string $location |
||||
|
* |
||||
|
* @return string |
||||
|
*/ |
||||
|
private function getWeatherData($location): string |
||||
|
{ |
||||
|
$client = new Client(['base_uri' => $this->owm_api_base_uri]); |
||||
|
$path = 'weather'; |
||||
|
$query = [ |
||||
|
'q' => $location, |
||||
|
'units' => 'metric', |
||||
|
'APPID' => trim($this->getConfig('owm_api_key')), |
||||
|
]; |
||||
|
|
||||
|
try { |
||||
|
$response = $client->get($path, ['query' => $query]); |
||||
|
} catch (RequestException $e) { |
||||
|
TelegramLog::error($e->getMessage()); |
||||
|
|
||||
|
return ''; |
||||
|
} |
||||
|
|
||||
|
return (string) $response->getBody(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get weather string from weather data |
||||
|
* |
||||
|
* @param array $data |
||||
|
* |
||||
|
* @return string |
||||
|
*/ |
||||
|
private function getWeatherString(array $data): string |
||||
|
{ |
||||
|
try { |
||||
|
if (!(isset($data['cod']) && $data['cod'] === 200)) { |
||||
|
return ''; |
||||
|
} |
||||
|
|
||||
|
//http://openweathermap.org/weather-conditions
|
||||
|
$conditions = [ |
||||
|
'clear' => ' ☀️', |
||||
|
'clouds' => ' ☁️', |
||||
|
'rain' => ' ☔', |
||||
|
'drizzle' => ' ☔', |
||||
|
'thunderstorm' => ' ⚡️', |
||||
|
'snow' => ' ❄️', |
||||
|
]; |
||||
|
$conditions_now = strtolower($data['weather'][0]['main']); |
||||
|
|
||||
|
return sprintf( |
||||
|
'The temperature in %s (%s) is %s°C' . PHP_EOL . |
||||
|
'Current conditions are: %s%s', |
||||
|
$data['name'], //city
|
||||
|
$data['sys']['country'], //country
|
||||
|
$data['main']['temp'], //temperature
|
||||
|
$data['weather'][0]['description'], //description of weather
|
||||
|
$conditions[$conditions_now] ?? '' |
||||
|
); |
||||
|
} catch (Exception $e) { |
||||
|
TelegramLog::error($e->getMessage()); |
||||
|
|
||||
|
return ''; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Check to make sure the required OWM API key has been defined.
|
||||
|
$owm_api_key = $this->getConfig('owm_api_key'); |
||||
|
if (empty($owm_api_key)) { |
||||
|
return $this->replyToChat('OpenWeatherMap API key not defined.'); |
||||
|
} |
||||
|
|
||||
|
$location = trim($this->getMessage()->getText(true)); |
||||
|
if ($location === '') { |
||||
|
return $this->replyToChat('You must specify a location as: ' . $this->getUsage()); |
||||
|
} |
||||
|
|
||||
|
$text = 'Cannot find weather for location: ' . $location; |
||||
|
if ($weather_data = json_decode($this->getWeatherData($location), true)) { |
||||
|
$text = $this->getWeatherString($weather_data); |
||||
|
} |
||||
|
return $this->replyToChat($text); |
||||
|
} |
||||
|
} |
@ -0,0 +1,105 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/cancel" command |
||||
|
* |
||||
|
* This command cancels the currently active conversation and |
||||
|
* returns a message to let the user know which conversation it was. |
||||
|
* |
||||
|
* If no conversation is active, the returned message says so. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Conversation; |
||||
|
use Longman\TelegramBot\Entities\Keyboard; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class CancelCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'cancel'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Cancel the currently active conversation'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/cancel'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.3.0'; |
||||
|
|
||||
|
/** |
||||
|
* @var bool |
||||
|
*/ |
||||
|
protected $need_mysql = true; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution if no DB connection is available |
||||
|
* |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function executeNoDb(): ServerResponse |
||||
|
{ |
||||
|
return $this->removeKeyboard('Nothing to cancel.'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$text = 'No active conversation!'; |
||||
|
|
||||
|
// Cancel current conversation if any
|
||||
|
$conversation = new Conversation( |
||||
|
$this->getMessage()->getFrom()->getId(), |
||||
|
$this->getMessage()->getChat()->getId() |
||||
|
); |
||||
|
|
||||
|
if ($conversation_command = $conversation->getCommand()) { |
||||
|
$conversation->cancel(); |
||||
|
$text = 'Conversation "' . $conversation_command . '" cancelled!'; |
||||
|
} |
||||
|
|
||||
|
return $this->removeKeyboard($text); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Remove the keyboard and output a text. |
||||
|
* |
||||
|
* @param string $text |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
private function removeKeyboard(string $text): ServerResponse |
||||
|
{ |
||||
|
return $this->replyToChat($text, [ |
||||
|
'reply_markup' => Keyboard::remove(['selective' => true]), |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,85 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Generic message command |
||||
|
* |
||||
|
* Gets executed when any type of message is sent. |
||||
|
* |
||||
|
* In this conversation-related context, we must ensure that active conversations get executed correctly. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Conversation; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class GenericmessageCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'genericmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle generic message'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.0.0'; |
||||
|
|
||||
|
/** |
||||
|
* @var bool |
||||
|
*/ |
||||
|
protected $need_mysql = true; |
||||
|
|
||||
|
/** |
||||
|
* Command execute method if MySQL is required but not available |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function executeNoDb(): ServerResponse |
||||
|
{ |
||||
|
// Do nothing
|
||||
|
return Request::emptyResponse(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
// If a conversation is busy, execute the conversation command after handling the message.
|
||||
|
$conversation = new Conversation( |
||||
|
$message->getFrom()->getId(), |
||||
|
$message->getChat()->getId() |
||||
|
); |
||||
|
|
||||
|
// Fetch conversation command if it exists and execute it.
|
||||
|
if ($conversation->exists() && $command = $conversation->getCommand()) { |
||||
|
return $this->telegram->executeCommand($command); |
||||
|
} |
||||
|
|
||||
|
return Request::emptyResponse(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,9 @@ |
|||||
|
# Conversation |
||||
|
|
||||
|
Conversations can be used to create dialogues with users, to collect information in a "conversational" style. |
||||
|
|
||||
|
Look at the [`SurveyCommand`](SurveyCommand.php) to see how a conversation can be made. |
||||
|
|
||||
|
For conversations to work, you must add the code provided in [`GenericmessageCommand.php`](GenericmessageCommand.php) at the beginning of your custom `GenericmessageCommand::execute()` method. |
||||
|
|
||||
|
The [`CancelCommand`](CancelCommand.php) allows users to cancel any active conversation. |
@ -0,0 +1,258 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/survey" command |
||||
|
* |
||||
|
* Example of the Conversation functionality in form of a simple survey. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Conversation; |
||||
|
use Longman\TelegramBot\Entities\Keyboard; |
||||
|
use Longman\TelegramBot\Entities\KeyboardButton; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class SurveyCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'survey'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Survey for bot users'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/survey'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.4.0'; |
||||
|
|
||||
|
/** |
||||
|
* @var bool |
||||
|
*/ |
||||
|
protected $need_mysql = true; |
||||
|
|
||||
|
/** |
||||
|
* @var bool |
||||
|
*/ |
||||
|
protected $private_only = true; |
||||
|
|
||||
|
/** |
||||
|
* Conversation Object |
||||
|
* |
||||
|
* @var Conversation |
||||
|
*/ |
||||
|
protected $conversation; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
$chat = $message->getChat(); |
||||
|
$user = $message->getFrom(); |
||||
|
$text = trim($message->getText(true)); |
||||
|
$chat_id = $chat->getId(); |
||||
|
$user_id = $user->getId(); |
||||
|
|
||||
|
// Preparing response
|
||||
|
$data = [ |
||||
|
'chat_id' => $chat_id, |
||||
|
// Remove any keyboard by default
|
||||
|
'reply_markup' => Keyboard::remove(['selective' => true]), |
||||
|
]; |
||||
|
|
||||
|
if ($chat->isGroupChat() || $chat->isSuperGroup()) { |
||||
|
// Force reply is applied by default so it can work with privacy on
|
||||
|
$data['reply_markup'] = Keyboard::forceReply(['selective' => true]); |
||||
|
} |
||||
|
|
||||
|
// Conversation start
|
||||
|
$this->conversation = new Conversation($user_id, $chat_id, $this->getName()); |
||||
|
|
||||
|
// Load any existing notes from this conversation
|
||||
|
$notes = &$this->conversation->notes; |
||||
|
!is_array($notes) && $notes = []; |
||||
|
|
||||
|
// Load the current state of the conversation
|
||||
|
$state = $notes['state'] ?? 0; |
||||
|
|
||||
|
$result = Request::emptyResponse(); |
||||
|
|
||||
|
// State machine
|
||||
|
// Every time a step is achieved the state is updated
|
||||
|
switch ($state) { |
||||
|
case 0: |
||||
|
if ($text === '') { |
||||
|
$notes['state'] = 0; |
||||
|
$this->conversation->update(); |
||||
|
|
||||
|
$data['text'] = 'Type your name:'; |
||||
|
|
||||
|
$result = Request::sendMessage($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
$notes['name'] = $text; |
||||
|
$text = ''; |
||||
|
|
||||
|
// No break!
|
||||
|
case 1: |
||||
|
if ($text === '') { |
||||
|
$notes['state'] = 1; |
||||
|
$this->conversation->update(); |
||||
|
|
||||
|
$data['text'] = 'Type your surname:'; |
||||
|
|
||||
|
$result = Request::sendMessage($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
$notes['surname'] = $text; |
||||
|
$text = ''; |
||||
|
|
||||
|
// No break!
|
||||
|
case 2: |
||||
|
if ($text === '' || !is_numeric($text)) { |
||||
|
$notes['state'] = 2; |
||||
|
$this->conversation->update(); |
||||
|
|
||||
|
$data['text'] = 'Type your age:'; |
||||
|
if ($text !== '') { |
||||
|
$data['text'] = 'Age must be a number'; |
||||
|
} |
||||
|
|
||||
|
$result = Request::sendMessage($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
$notes['age'] = $text; |
||||
|
$text = ''; |
||||
|
|
||||
|
// No break!
|
||||
|
case 3: |
||||
|
if ($text === '' || !in_array($text, ['M', 'F'], true)) { |
||||
|
$notes['state'] = 3; |
||||
|
$this->conversation->update(); |
||||
|
|
||||
|
$data['reply_markup'] = (new Keyboard(['M', 'F'])) |
||||
|
->setResizeKeyboard(true) |
||||
|
->setOneTimeKeyboard(true) |
||||
|
->setSelective(true); |
||||
|
|
||||
|
$data['text'] = 'Select your gender:'; |
||||
|
if ($text !== '') { |
||||
|
$data['text'] = 'Choose a keyboard option to select your gender'; |
||||
|
} |
||||
|
|
||||
|
$result = Request::sendMessage($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
$notes['gender'] = $text; |
||||
|
|
||||
|
// No break!
|
||||
|
case 4: |
||||
|
if ($message->getLocation() === null) { |
||||
|
$notes['state'] = 4; |
||||
|
$this->conversation->update(); |
||||
|
|
||||
|
$data['reply_markup'] = (new Keyboard( |
||||
|
(new KeyboardButton('Share Location'))->setRequestLocation(true) |
||||
|
)) |
||||
|
->setOneTimeKeyboard(true) |
||||
|
->setResizeKeyboard(true) |
||||
|
->setSelective(true); |
||||
|
|
||||
|
$data['text'] = 'Share your location:'; |
||||
|
|
||||
|
$result = Request::sendMessage($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
$notes['longitude'] = $message->getLocation()->getLongitude(); |
||||
|
$notes['latitude'] = $message->getLocation()->getLatitude(); |
||||
|
|
||||
|
// No break!
|
||||
|
case 5: |
||||
|
if ($message->getPhoto() === null) { |
||||
|
$notes['state'] = 5; |
||||
|
$this->conversation->update(); |
||||
|
|
||||
|
$data['text'] = 'Insert your picture:'; |
||||
|
|
||||
|
$result = Request::sendMessage($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
$photo = $message->getPhoto()[0]; |
||||
|
$notes['photo_id'] = $photo->getFileId(); |
||||
|
|
||||
|
// No break!
|
||||
|
case 6: |
||||
|
if ($message->getContact() === null) { |
||||
|
$notes['state'] = 6; |
||||
|
$this->conversation->update(); |
||||
|
|
||||
|
$data['reply_markup'] = (new Keyboard( |
||||
|
(new KeyboardButton('Share Contact'))->setRequestContact(true) |
||||
|
)) |
||||
|
->setOneTimeKeyboard(true) |
||||
|
->setResizeKeyboard(true) |
||||
|
->setSelective(true); |
||||
|
|
||||
|
$data['text'] = 'Share your contact information:'; |
||||
|
|
||||
|
$result = Request::sendMessage($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
$notes['phone_number'] = $message->getContact()->getPhoneNumber(); |
||||
|
|
||||
|
// No break!
|
||||
|
case 7: |
||||
|
$this->conversation->update(); |
||||
|
$out_text = '/Survey result:' . PHP_EOL; |
||||
|
unset($notes['state']); |
||||
|
foreach ($notes as $k => $v) { |
||||
|
$out_text .= PHP_EOL . ucfirst($k) . ': ' . $v; |
||||
|
} |
||||
|
|
||||
|
$data['photo'] = $notes['photo_id']; |
||||
|
$data['caption'] = $out_text; |
||||
|
|
||||
|
$this->conversation->stop(); |
||||
|
|
||||
|
$result = Request::sendPhoto($data); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
return $result; |
||||
|
} |
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
/** |
||||
|
* Generic command |
||||
|
* |
||||
|
* Gets executed for generic commands, when no other appropriate one is found. |
||||
|
*/ |
||||
|
class GenericCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'generic'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handles generic commands or is executed by default when a command is not found'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$user_id = $message->getFrom()->getId(); |
||||
|
$command = $message->getCommand(); |
||||
|
|
||||
|
// To enable proper use of the /whois command.
|
||||
|
// If the user is an admin and the command is in the format "/whoisXYZ", call the /whois command
|
||||
|
if (stripos($command, 'whois') === 0 && $this->telegram->isAdmin($user_id)) { |
||||
|
return $this->telegram->executeCommand('whois'); |
||||
|
} |
||||
|
|
||||
|
return $this->replyToChat("Command /{$command} not found.. :("); |
||||
|
} |
||||
|
} |
@ -0,0 +1,82 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Generic message command |
||||
|
* |
||||
|
* Gets executed when any type of message is sent. |
||||
|
* |
||||
|
* In this group-related context, we can handle new and left group members. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class GenericmessageCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'genericmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle generic message'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.0.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
// Handle new chat members
|
||||
|
if ($message->getNewChatMembers()) { |
||||
|
return $this->getTelegram()->executeCommand('newchatmembers'); |
||||
|
} |
||||
|
|
||||
|
// Handle left chat members
|
||||
|
if ($message->getLeftChatMember()) { |
||||
|
return $this->getTelegram()->executeCommand('leftchatmember'); |
||||
|
} |
||||
|
|
||||
|
// The chat photo was changed
|
||||
|
if ($new_chat_photo = $message->getNewChatPhoto()) { |
||||
|
// Whatever...
|
||||
|
} |
||||
|
|
||||
|
// The chat title was changed
|
||||
|
if ($new_chat_title = $message->getNewChatTitle()) { |
||||
|
// Whatever...
|
||||
|
} |
||||
|
|
||||
|
// A message has been pinned
|
||||
|
if ($pinned_message = $message->getPinnedMessage()) { |
||||
|
// Whatever...
|
||||
|
} |
||||
|
|
||||
|
return Request::emptyResponse(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,58 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Left chat member command |
||||
|
* |
||||
|
* Gets executed when a member leaves the chat. |
||||
|
* |
||||
|
* NOTE: This command must be called from GenericmessageCommand.php! |
||||
|
* It is only in a separate command file for easier code maintenance. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class LeftchatmemberCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'leftchatmember'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Left Chat Member'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$member = $message->getLeftChatMember(); |
||||
|
|
||||
|
return $this->replyToChat('Sorry to see you go, ' . $member->getFirstName()); |
||||
|
} |
||||
|
} |
@ -0,0 +1,67 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* New chat members command |
||||
|
* |
||||
|
* Gets executed when a new member joins the chat. |
||||
|
* |
||||
|
* NOTE: This command must be called from GenericmessageCommand.php! |
||||
|
* It is only in a separate command file for easier code maintenance. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class NewchatmembersCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'newchatmembers'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'New Chat Members'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.3.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$members = $message->getNewChatMembers(); |
||||
|
|
||||
|
if ($message->botAddedInChat()) { |
||||
|
return $this->replyToChat('Hi there, you BOT!'); |
||||
|
} |
||||
|
|
||||
|
$member_names = []; |
||||
|
foreach ($members as $member) { |
||||
|
$member_names[] = $member->tryMention(); |
||||
|
} |
||||
|
|
||||
|
return $this->replyToChat('Hi ' . implode(', ', $member_names) . '!'); |
||||
|
} |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
# Group or Channel |
||||
|
|
||||
|
Requests specific to groups and channels all get handled in [`GenericmessageCommand.php`](GenericmessageCommand.php). |
||||
|
|
||||
|
The two extra commands [`NewchatmembersCommand`](NewchatmembersCommand.php) and [`LeftchatmemberCommand`](LeftchatmemberCommand.php) are simply files that can be called as commands from within a command, not by a user. |
||||
|
Have a look at [`GenericmessageCommand.php`](GenericmessageCommand.php) to understand what you can do. |
@ -0,0 +1,54 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Chosen inline result command |
||||
|
* |
||||
|
* Gets executed when an item from an inline query is selected. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
class ChoseninlineresultCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'choseninlineresult'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle the chosen inline result'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Information about the chosen result is returned.
|
||||
|
$inline_query = $this->getChosenInlineResult(); |
||||
|
$query = $inline_query->getQuery(); |
||||
|
|
||||
|
return parent::execute(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,100 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Inline query command |
||||
|
* |
||||
|
* Command that handles inline queries and returns a list of results. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\InlineQuery\InlineQueryResultArticle; |
||||
|
use Longman\TelegramBot\Entities\InlineQuery\InlineQueryResultContact; |
||||
|
use Longman\TelegramBot\Entities\InlineQuery\InlineQueryResultLocation; |
||||
|
use Longman\TelegramBot\Entities\InlineQuery\InlineQueryResultVenue; |
||||
|
use Longman\TelegramBot\Entities\InputMessageContent\InputTextMessageContent; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
class InlinequeryCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'inlinequery'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle inline query'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$inline_query = $this->getInlineQuery(); |
||||
|
$query = $inline_query->getQuery(); |
||||
|
|
||||
|
$results = []; |
||||
|
|
||||
|
if ($query !== '') { |
||||
|
// https://core.telegram.org/bots/api#inlinequeryresultarticle
|
||||
|
$results[] = new InlineQueryResultArticle([ |
||||
|
'id' => '001', |
||||
|
'title' => 'Simple text using InputTextMessageContent', |
||||
|
'description' => 'this will return Text', |
||||
|
|
||||
|
// Here you can put any other Input...MessageContent you like.
|
||||
|
// It will keep the style of an article, but post the specific message type back to the user.
|
||||
|
'input_message_content' => new InputTextMessageContent([ |
||||
|
'message_text' => 'The query that got you here: ' . $query, |
||||
|
]), |
||||
|
]); |
||||
|
|
||||
|
// https://core.telegram.org/bots/api#inlinequeryresultcontact
|
||||
|
$results[] = new InlineQueryResultContact([ |
||||
|
'id' => '002', |
||||
|
'phone_number' => '12345678', |
||||
|
'first_name' => 'Best', |
||||
|
'last_name' => 'Friend', |
||||
|
]); |
||||
|
|
||||
|
// https://core.telegram.org/bots/api#inlinequeryresultlocation
|
||||
|
$results[] = new InlineQueryResultLocation([ |
||||
|
'id' => '003', |
||||
|
'title' => 'The center of the world!', |
||||
|
'latitude' => 40.866667, |
||||
|
'longitude' => 34.566667, |
||||
|
]); |
||||
|
|
||||
|
// https://core.telegram.org/bots/api#inlinequeryresultvenue
|
||||
|
$results[] = new InlineQueryResultVenue([ |
||||
|
'id' => '004', |
||||
|
'title' => 'No-Mans-Land', |
||||
|
'address' => 'In the middle of Nowhere', |
||||
|
'latitude' => 33, |
||||
|
'longitude' => -33, |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
return $inline_query->answer($results); |
||||
|
} |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
# Inline Mode |
||||
|
|
||||
|
The files in this folder demonstrate how to use the [inline mode](https://core.telegram.org/bots/api#inline-mode) of your bot. |
||||
|
|
||||
|
The [`InlinequeryCommand.php`](InlinequeryCommand.php) catches any inline queries and answers with a set of results. |
||||
|
|
||||
|
When a result is selected, this selection is then handled by [`ChoseninlineresultCommand.php`](ChoseninlineresultCommand.php). |
@ -0,0 +1,61 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Callback query command |
||||
|
* |
||||
|
* This command handles all callback queries sent via inline keyboard buttons. |
||||
|
* |
||||
|
* @see InlinekeyboardCommand.php |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
class CallbackqueryCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'callbackquery'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle the callback query'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws \Exception |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Callback query data can be fetched and handled accordingly.
|
||||
|
$callback_query = $this->getCallbackQuery(); |
||||
|
$callback_data = $callback_query->getData(); |
||||
|
|
||||
|
return $callback_query->answer([ |
||||
|
'text' => 'Content of the callback data: ' . $callback_data, |
||||
|
'show_alert' => (bool) random_int(0, 1), // Randomly show (or not) as an alert.
|
||||
|
'cache_time' => 5, |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,60 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\Keyboard; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
/** |
||||
|
* User "/forcereply" command |
||||
|
* |
||||
|
* Force a reply to a message. |
||||
|
*/ |
||||
|
class ForcereplyCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'forcereply'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Force reply with reply markup'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/forcereply'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Force a reply to the sent message
|
||||
|
return $this->replyToChat('Write something in reply:', [ |
||||
|
'reply_markup' => Keyboard::forceReply(), |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
/** |
||||
|
* User "/hidekeyboard" command |
||||
|
* |
||||
|
* Command to hide the keyboard. |
||||
|
*/ |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\Keyboard; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class HidekeyboardCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'hidekeyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Hide the custom keyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/hidekeyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Remove the keyboard and send a message
|
||||
|
return $this->replyToChat('Keyboard Hidden', [ |
||||
|
'reply_markup' => Keyboard::remove(), |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
/** |
||||
|
* User "/inlinekeyboard" command |
||||
|
* |
||||
|
* Display an inline keyboard with a few buttons. |
||||
|
* |
||||
|
* This command requires CallbackqueryCommand to work! |
||||
|
* |
||||
|
* @see CallbackqueryCommand.php |
||||
|
*/ |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\InlineKeyboard; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class InlinekeyboardCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'inlinekeyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Show inline keyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/inlinekeyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$inline_keyboard = new InlineKeyboard([ |
||||
|
['text' => 'Inline Query (current chat)', 'switch_inline_query_current_chat' => 'inline query...'], |
||||
|
['text' => 'Inline Query (other chat)', 'switch_inline_query' => 'inline query...'], |
||||
|
], [ |
||||
|
['text' => 'Callback', 'callback_data' => 'identifier'], |
||||
|
['text' => 'Open URL', 'url' => 'https://github.com/php-telegram-bot/example-bot'], |
||||
|
]); |
||||
|
|
||||
|
return $this->replyToChat('Inline Keyboard', [ |
||||
|
'reply_markup' => $inline_keyboard, |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,102 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
/** |
||||
|
* User "/keyboard" command |
||||
|
* |
||||
|
* Display a keyboard with a few buttons. |
||||
|
*/ |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\Keyboard; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class KeyboardCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'keyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Show a custom keyboard with reply markup'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/keyboard'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.3.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
/** @var Keyboard[] $keyboards */ |
||||
|
$keyboards = []; |
||||
|
|
||||
|
// Simple digits
|
||||
|
$keyboards[] = new Keyboard( |
||||
|
['7', '8', '9'], |
||||
|
['4', '5', '6'], |
||||
|
['1', '2', '3'], |
||||
|
[' ', '0', ' '] |
||||
|
); |
||||
|
|
||||
|
// Digits with operations
|
||||
|
$keyboards[] = new Keyboard( |
||||
|
['7', '8', '9', '+'], |
||||
|
['4', '5', '6', '-'], |
||||
|
['1', '2', '3', '*'], |
||||
|
[' ', '0', ' ', '/'] |
||||
|
); |
||||
|
|
||||
|
// Short version with 1 button per row
|
||||
|
$keyboards[] = new Keyboard('A', 'B', 'C'); |
||||
|
|
||||
|
// Some different ways of creating rows and buttons
|
||||
|
$keyboards[] = new Keyboard( |
||||
|
['text' => 'A'], |
||||
|
'B', |
||||
|
['C', 'D'] |
||||
|
); |
||||
|
|
||||
|
// Buttons to perform Contact or Location sharing
|
||||
|
$keyboards[] = new Keyboard([ |
||||
|
['text' => 'Send my contact', 'request_contact' => true], |
||||
|
['text' => 'Send my location', 'request_location' => true], |
||||
|
]); |
||||
|
|
||||
|
// Shuffle our example keyboards and return a random one
|
||||
|
shuffle($keyboards); |
||||
|
$keyboard = end($keyboards) |
||||
|
->setResizeKeyboard(true) |
||||
|
->setOneTimeKeyboard(true) |
||||
|
->setSelective(false); |
||||
|
|
||||
|
return $this->replyToChat('Press a Button!', [ |
||||
|
'reply_markup' => $keyboard, |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
# Keyboards |
||||
|
|
||||
|
The files in this folder demonstrate how to create normal and inline keyboards. |
||||
|
|
||||
|
## Normal Keyboard |
||||
|
|
||||
|
Have a look at [`KeyboardCommand.php`](KeyboardCommand.php) for usage examples. |
||||
|
|
||||
|
## Inline Keyboard |
||||
|
|
||||
|
Have a look at [`InlinekeyboardCommand.php`](InlinekeyboardCommand.php) for usage examples. |
||||
|
|
||||
|
To handle inline keyboard buttons, you need to handle all callbacks inside [`CallbackqueryCommand.php`](CallbackqueryCommand.php). |
@ -0,0 +1,53 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Channel post command |
||||
|
* |
||||
|
* Gets executed when a new post is created in a channel. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
class ChannelpostCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'channelpost'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle channel post'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Get the channel post
|
||||
|
$channel_post = $this->getChannelPost(); |
||||
|
|
||||
|
return parent::execute(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,53 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Edited channel post command |
||||
|
* |
||||
|
* Gets executed when a post in a channel is edited. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
class EditedchannelpostCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'editedchannelpost'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle edited channel post'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Get the edited channel post
|
||||
|
$edited_channel_post = $this->getEditedChannelPost(); |
||||
|
|
||||
|
return parent::execute(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,52 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
/** |
||||
|
* Edited message command |
||||
|
* |
||||
|
* Gets executed when a user message is edited. |
||||
|
*/ |
||||
|
class EditedmessageCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'editedmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle edited message'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Get the edited message
|
||||
|
$edited_message = $this->getEditedMessage(); |
||||
|
|
||||
|
return parent::execute(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,82 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/editmessage" command |
||||
|
* |
||||
|
* Command to edit a message sent by the bot. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class EditmessageCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'editmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Edit a message sent by the bot'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/editmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$chat_id = $message->getChat()->getId(); |
||||
|
$reply_to_message = $message->getReplyToMessage(); |
||||
|
$text = $message->getText(true); |
||||
|
|
||||
|
if ($reply_to_message && $message_to_edit = $reply_to_message->getMessageId()) { |
||||
|
// Try to edit the selected message.
|
||||
|
$result = Request::editMessageText([ |
||||
|
'chat_id' => $chat_id, |
||||
|
'message_id' => $message_to_edit, |
||||
|
'text' => $text ?: 'Edited message', |
||||
|
]); |
||||
|
|
||||
|
// If successful, delete this editing reply message.
|
||||
|
if ($result->isOk()) { |
||||
|
Request::deleteMessage([ |
||||
|
'chat_id' => $chat_id, |
||||
|
'message_id' => $message->getMessageId(), |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
return $result; |
||||
|
} |
||||
|
|
||||
|
return $this->replyToChat(sprintf("Reply to any bots' message and use /%s <your text> to edit it.", $this->getName())); |
||||
|
} |
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Generic message command |
||||
|
* |
||||
|
* Gets executed when any type of message is sent. |
||||
|
* |
||||
|
* In this message-related context, we can handle any kind of message. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class GenericmessageCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'genericmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle generic message'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.0.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
/** |
||||
|
* Handle any kind of message here |
||||
|
*/ |
||||
|
|
||||
|
$message_text = $message->getText(true); |
||||
|
|
||||
|
return Request::emptyResponse(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
# Message |
||||
|
|
||||
|
You bot can handle all types of messages. |
||||
|
|
||||
|
## Private and Group chats |
||||
|
|
||||
|
Messages in private and group chats get handled by [`GenericmessageCommand.php`](GenericmessageCommand.php). |
||||
|
When a message gets edited, it gets handled by [`EditedmessageCommand.php`](EditedmessageCommand.php) |
||||
|
|
||||
|
(Have a look at [`EditmessageCommand.php`](EditmessageCommand.php) for an example of how to edit messages via your bot) |
||||
|
|
||||
|
## Channels |
||||
|
|
||||
|
For channels, the messages (or posts) get handled by [`ChannelpostCommand.php`](ChannelpostCommand.php). |
||||
|
When a channel post gets edited, it gets handled by [`EditedchannelpostCommand.php`](EditedchannelpostCommand.php) |
@ -0,0 +1,64 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/echo" command |
||||
|
* |
||||
|
* Simply echo the input back to the user. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class EchoCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'echo'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Show text'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/echo <text>'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$text = $message->getText(true); |
||||
|
|
||||
|
if ($text === '') { |
||||
|
return $this->replyToChat('Command usage: ' . $this->getUsage()); |
||||
|
} |
||||
|
|
||||
|
return $this->replyToChat($text); |
||||
|
} |
||||
|
} |
@ -0,0 +1,133 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/help" command |
||||
|
* |
||||
|
* Command that lists all available commands and displays them in User and Admin sections. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\Command; |
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class HelpCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'help'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Show bot commands help'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/help or /help <command>'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.4.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$command_str = trim($message->getText(true)); |
||||
|
|
||||
|
// Admin commands shouldn't be shown in group chats
|
||||
|
$safe_to_show = $message->getChat()->isPrivateChat(); |
||||
|
|
||||
|
[$all_commands, $user_commands, $admin_commands] = $this->getUserAndAdminCommands(); |
||||
|
|
||||
|
// If no command parameter is passed, show the list.
|
||||
|
if ($command_str === '') { |
||||
|
$text = '*Commands List*:' . PHP_EOL; |
||||
|
foreach ($user_commands as $user_command) { |
||||
|
$text .= '/' . $user_command->getName() . ' - ' . $user_command->getDescription() . PHP_EOL; |
||||
|
} |
||||
|
|
||||
|
if ($safe_to_show && count($admin_commands) > 0) { |
||||
|
$text .= PHP_EOL . '*Admin Commands List*:' . PHP_EOL; |
||||
|
foreach ($admin_commands as $admin_command) { |
||||
|
$text .= '/' . $admin_command->getName() . ' - ' . $admin_command->getDescription() . PHP_EOL; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
$text .= PHP_EOL . 'For exact command help type: /help <command>'; |
||||
|
|
||||
|
return $this->replyToChat($text, ['parse_mode' => 'markdown']); |
||||
|
} |
||||
|
|
||||
|
$command_str = str_replace('/', '', $command_str); |
||||
|
if (isset($all_commands[$command_str]) && ($safe_to_show || !$all_commands[$command_str]->isAdminCommand())) { |
||||
|
$command = $all_commands[$command_str]; |
||||
|
|
||||
|
return $this->replyToChat(sprintf( |
||||
|
'Command: %s (v%s)' . PHP_EOL . |
||||
|
'Description: %s' . PHP_EOL . |
||||
|
'Usage: %s', |
||||
|
$command->getName(), |
||||
|
$command->getVersion(), |
||||
|
$command->getDescription(), |
||||
|
$command->getUsage() |
||||
|
), ['parse_mode' => 'markdown']); |
||||
|
} |
||||
|
|
||||
|
return $this->replyToChat('No help available: Command `/' . $command_str . '` not found', ['parse_mode' => 'markdown']); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get all available User and Admin commands to display in the help list. |
||||
|
* |
||||
|
* @return Command[][] |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
protected function getUserAndAdminCommands(): array |
||||
|
{ |
||||
|
/** @var Command[] $all_commands */ |
||||
|
$all_commands = $this->telegram->getCommandsList(); |
||||
|
|
||||
|
// Only get enabled Admin and User commands that are allowed to be shown.
|
||||
|
$commands = array_filter($all_commands, function ($command): bool { |
||||
|
return !$command->isSystemCommand() && $command->showInHelp() && $command->isEnabled(); |
||||
|
}); |
||||
|
|
||||
|
// Filter out all User commands
|
||||
|
$user_commands = array_filter($commands, function ($command): bool { |
||||
|
return $command->isUserCommand(); |
||||
|
}); |
||||
|
|
||||
|
// Filter out all Admin commands
|
||||
|
$admin_commands = array_filter($commands, function ($command): bool { |
||||
|
return $command->isAdminCommand(); |
||||
|
}); |
||||
|
|
||||
|
ksort($commands); |
||||
|
ksort($user_commands); |
||||
|
ksort($admin_commands); |
||||
|
|
||||
|
return [$commands, $user_commands, $admin_commands]; |
||||
|
} |
||||
|
} |
@ -0,0 +1,110 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/image" command |
||||
|
* |
||||
|
* Randomly fetch any uploaded image from the Uploads path and send it to the user. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class ImageCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'image'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Randomly fetch any uploaded image'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/image'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
// Use any extra parameters as the caption text.
|
||||
|
$caption = trim($message->getText(true)); |
||||
|
|
||||
|
// Make sure the Upload path has been defined and exists.
|
||||
|
$upload_path = $this->telegram->getUploadPath(); |
||||
|
if (!is_dir($upload_path)) { |
||||
|
return $this->replyToChat('Upload path has not been defined or does not exist.'); |
||||
|
} |
||||
|
|
||||
|
// Get a random picture from the Upload path.
|
||||
|
$random_image = $this->getRandomImagePath($upload_path); |
||||
|
if ('' === $random_image) { |
||||
|
return $this->replyToChat('No image found!'); |
||||
|
} |
||||
|
|
||||
|
// If no caption is set, use the filename.
|
||||
|
if ('' === $caption) { |
||||
|
$caption = basename($random_image); |
||||
|
} |
||||
|
|
||||
|
return Request::sendPhoto([ |
||||
|
'chat_id' => $message->getFrom()->getId(), |
||||
|
'caption' => $caption, |
||||
|
'photo' => $random_image, |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Return the path to a random image in the passed directory. |
||||
|
* |
||||
|
* @param string $dir |
||||
|
* |
||||
|
* @return string |
||||
|
*/ |
||||
|
private function getRandomImagePath($dir): string |
||||
|
{ |
||||
|
if (!is_dir($dir)) { |
||||
|
return ''; |
||||
|
} |
||||
|
|
||||
|
// Filter the file list to only return images.
|
||||
|
$image_list = array_filter(scandir($dir), function ($file) { |
||||
|
$extension = pathinfo($file, PATHINFO_EXTENSION); |
||||
|
return in_array($extension, ['png', 'jpg', 'jpeg', 'gif']); |
||||
|
}); |
||||
|
if (!empty($image_list)) { |
||||
|
shuffle($image_list); |
||||
|
return $dir . '/' . $image_list[0]; |
||||
|
} |
||||
|
|
||||
|
return ''; |
||||
|
} |
||||
|
} |
@ -0,0 +1,68 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/markdown" command |
||||
|
* |
||||
|
* Print some text formatted with markdown. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ReplyKeyboardMarkup; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class MarkdownCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'markdown'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Print Markdown Text'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/markdown'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
return $this->replyToChat(' |
||||
|
*bold* _italic_ `inline fixed width code` |
||||
|
|
||||
|
``` |
||||
|
preformatted code block |
||||
|
code block |
||||
|
``` |
||||
|
|
||||
|
[Best Telegram bot api!!](https://github.com/php-telegram-bot/core)', [ |
||||
|
'parse_mode' => 'markdown', |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
# Other Commands |
||||
|
|
||||
|
In this folder you can find a few example commands, that demonstrate how to use different features of the library. |
||||
|
|
||||
|
Best just take a look at them and see what they do! |
@ -0,0 +1,67 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/slap" command |
||||
|
* |
||||
|
* Slap a user around with a big trout! |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class SlapCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'slap'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Slap someone with their username'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/slap <@user>'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$text = $message->getText(true); |
||||
|
|
||||
|
$sender = '@' . $message->getFrom()->getUsername(); |
||||
|
|
||||
|
// Username validation (simply checking for `@something` in the text)
|
||||
|
if (0 === preg_match('/@[\w_]{5,}/', $text)) { |
||||
|
return $this->replyToChat('Sorry, no one to slap around...'); |
||||
|
} |
||||
|
|
||||
|
return $this->replyToChat($sender . ' slaps ' . $text . ' around a bit with a large trout'); |
||||
|
} |
||||
|
} |
@ -0,0 +1,115 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/upload" command |
||||
|
* |
||||
|
* A command that allows users to upload files to your bot, saving them to the bot's "Download" folder. |
||||
|
* |
||||
|
* IMPORTANT NOTICE |
||||
|
* This is a "demo", do NOT use this as-is in your bot! |
||||
|
* Know the security implications of allowing users to upload arbitrary files to your server! |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Conversation; |
||||
|
use Longman\TelegramBot\Entities\Keyboard; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class UploadCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'upload'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Upload and save files'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/upload'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* @var bool |
||||
|
*/ |
||||
|
protected $need_mysql = true; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$chat = $message->getChat(); |
||||
|
$chat_id = $chat->getId(); |
||||
|
$user_id = $message->getFrom()->getId(); |
||||
|
|
||||
|
// Make sure the Download path has been defined and exists
|
||||
|
$download_path = $this->telegram->getDownloadPath(); |
||||
|
if (!is_dir($download_path)) { |
||||
|
return $this->replyToChat('Download path has not been defined or does not exist.'); |
||||
|
} |
||||
|
|
||||
|
// Initialise the data array for the response
|
||||
|
$data = ['chat_id' => $chat_id]; |
||||
|
|
||||
|
if ($chat->isGroupChat() || $chat->isSuperGroup()) { |
||||
|
// Reply to message id is applied by default
|
||||
|
$data['reply_to_message_id'] = $message->getMessageId(); |
||||
|
// Force reply is applied by default to work with privacy on
|
||||
|
$data['reply_markup'] = Keyboard::forceReply(['selective' => true]); |
||||
|
} |
||||
|
|
||||
|
// Start conversation
|
||||
|
$conversation = new Conversation($user_id, $chat_id, $this->getName()); |
||||
|
$message_type = $message->getType(); |
||||
|
|
||||
|
if (in_array($message_type, ['audio', 'document', 'photo', 'video', 'voice'], true)) { |
||||
|
$doc = $message->{'get' . ucfirst($message_type)}(); |
||||
|
|
||||
|
// For photos, get the best quality!
|
||||
|
($message_type === 'photo') && $doc = end($doc); |
||||
|
|
||||
|
$file_id = $doc->getFileId(); |
||||
|
$file = Request::getFile(['file_id' => $file_id]); |
||||
|
if ($file->isOk() && Request::downloadFile($file->getResult())) { |
||||
|
$data['text'] = $message_type . ' file is located at: ' . $download_path . '/' . $file->getResult()->getFilePath(); |
||||
|
} else { |
||||
|
$data['text'] = 'Failed to download.'; |
||||
|
} |
||||
|
|
||||
|
$conversation->notes['file_id'] = $file_id; |
||||
|
$conversation->update(); |
||||
|
$conversation->stop(); |
||||
|
} else { |
||||
|
$data['text'] = 'Please upload the file now'; |
||||
|
} |
||||
|
|
||||
|
return Request::sendMessage($data); |
||||
|
} |
||||
|
} |
@ -0,0 +1,124 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/whoami" command |
||||
|
* |
||||
|
* Simple command that returns info about the current user. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\ChatAction; |
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Entities\UserProfilePhotos; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class WhoamiCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'whoami'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Show your id, name and username'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/whoami'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* @var bool |
||||
|
*/ |
||||
|
protected $private_only = true; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
$from = $message->getFrom(); |
||||
|
$user_id = $from->getId(); |
||||
|
$chat_id = $message->getChat()->getId(); |
||||
|
$message_id = $message->getMessageId(); |
||||
|
|
||||
|
$data = [ |
||||
|
'chat_id' => $chat_id, |
||||
|
'reply_to_message_id' => $message_id, |
||||
|
]; |
||||
|
|
||||
|
// Send chat action "typing..."
|
||||
|
Request::sendChatAction([ |
||||
|
'chat_id' => $chat_id, |
||||
|
'action' => ChatAction::TYPING, |
||||
|
]); |
||||
|
|
||||
|
$caption = sprintf( |
||||
|
'Your Id: %d' . PHP_EOL . |
||||
|
'Name: %s %s' . PHP_EOL . |
||||
|
'Username: %s', |
||||
|
$user_id, |
||||
|
$from->getFirstName(), |
||||
|
$from->getLastName(), |
||||
|
$from->getUsername() |
||||
|
); |
||||
|
|
||||
|
// Fetch the most recent user profile photo
|
||||
|
$limit = 1; |
||||
|
$offset = null; |
||||
|
|
||||
|
$user_profile_photos_response = Request::getUserProfilePhotos([ |
||||
|
'user_id' => $user_id, |
||||
|
'limit' => $limit, |
||||
|
'offset' => $offset, |
||||
|
]); |
||||
|
|
||||
|
if ($user_profile_photos_response->isOk()) { |
||||
|
/** @var UserProfilePhotos $user_profile_photos */ |
||||
|
$user_profile_photos = $user_profile_photos_response->getResult(); |
||||
|
|
||||
|
if ($user_profile_photos->getTotalCount() > 0) { |
||||
|
$photos = $user_profile_photos->getPhotos(); |
||||
|
|
||||
|
// Get the best quality of the profile photo
|
||||
|
$photo = end($photos[0]); |
||||
|
$file_id = $photo->getFileId(); |
||||
|
|
||||
|
$data['photo'] = $file_id; |
||||
|
$data['caption'] = $caption; |
||||
|
|
||||
|
return Request::sendPhoto($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// No Photo just send text
|
||||
|
$data['text'] = $caption; |
||||
|
|
||||
|
return Request::sendMessage($data); |
||||
|
} |
||||
|
} |
@ -0,0 +1,60 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Generic message command |
||||
|
* |
||||
|
* Gets executed when any type of message is sent. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Commands\UserCommands\PaymentCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class GenericmessageCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'genericmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle generic message'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
$user_id = $message->getFrom()->getId(); |
||||
|
|
||||
|
// Handle successful payment
|
||||
|
if ($payment = $message->getSuccessfulPayment()) { |
||||
|
return PaymentCommand::handleSuccessfulPayment($payment, $user_id); |
||||
|
} |
||||
|
|
||||
|
return Request::emptyResponse(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,125 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* User "/payment" command |
||||
|
* |
||||
|
* This command creates an invoice for the user using the Telegram Payments. |
||||
|
* |
||||
|
* You will have to set up a payment provider with @BotFather |
||||
|
* Select your bot and then "Payments". Then choose the provider of your choice. |
||||
|
* |
||||
|
* @BotFather will then present you with a payment provider token. |
||||
|
* |
||||
|
* Copy this token and set it in your config.php file: |
||||
|
* ['commands']['configs']['payment'] => ['payment_provider_token' => 'your_payment_provider_token_here'] |
||||
|
* |
||||
|
* You will also need to copy the `Precheckoutquerycommand.php` file. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\UserCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\UserCommand; |
||||
|
use Longman\TelegramBot\Entities\Payments\LabeledPrice; |
||||
|
use Longman\TelegramBot\Entities\Payments\SuccessfulPayment; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class PaymentCommand extends UserCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'payment'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Create an invoice for the user using Telegram Payments'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/payment'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Who to send this invoice to. (Use the current user.)
|
||||
|
$chat_id = $this->getMessage()->getFrom()->getId(); |
||||
|
|
||||
|
// The currency of this invoice.
|
||||
|
// Supported currencies: https://core.telegram.org/bots/payments#supported-currencies
|
||||
|
$currency = 'EUR'; |
||||
|
|
||||
|
// List all items that will be shown on your invoice.
|
||||
|
// Amounts are in cents. So 1 Euro would be put as 100.
|
||||
|
$prices = [ |
||||
|
new LabeledPrice(['label' => 'Small thing', 'amount' => 100]), // 1€
|
||||
|
new LabeledPrice(['label' => 'Bigger thing', 'amount' => 2000]), // 20€
|
||||
|
new LabeledPrice(['label' => 'Huge thing', 'amount' => 50000]), // 500€
|
||||
|
]; |
||||
|
|
||||
|
// Request a shipping address if necessary.
|
||||
|
$need_shipping_address = false; |
||||
|
|
||||
|
// If you have flexible pricing, depending on the shipping method chosen, set this to true.
|
||||
|
// You will also need to copy and adapt the `ShippingqueryCommand.php` file.
|
||||
|
$is_flexible = false; |
||||
|
|
||||
|
// Send the actual invoice!
|
||||
|
// Adjust any parameters to your needs.
|
||||
|
return Request::sendInvoice([ |
||||
|
'chat_id' => $chat_id, |
||||
|
'title' => 'Payment with PHP Telegram Bot', |
||||
|
'description' => 'A simple invoice to test Telegram Payments', |
||||
|
'payload' => 'payment_demo', |
||||
|
'start_parameter' => 'payment_demo', |
||||
|
'provider_token' => $this->getConfig('payment_provider_token'), |
||||
|
'currency' => $currency, |
||||
|
'prices' => $prices, |
||||
|
'need_shipping_address' => $need_shipping_address, |
||||
|
'is_flexible' => $is_flexible, |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Send "Thank you" message to user who paid |
||||
|
* |
||||
|
* You will need to add some code to your custom `GenericmessageCommand::execute()` method. |
||||
|
* Check the `GenericmessageCommand.php` file included in this folder. |
||||
|
* |
||||
|
* @param SuccessfulPayment $payment |
||||
|
* @param int $user_id |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public static function handleSuccessfulPayment($payment, $user_id): ServerResponse |
||||
|
{ |
||||
|
// Send a message to the user after they have completed the payment.
|
||||
|
return Request::sendMessage([ |
||||
|
'chat_id' => $user_id, |
||||
|
'text' => 'Thank you for your order!', |
||||
|
]); |
||||
|
} |
||||
|
} |
@ -0,0 +1,57 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Pre-checkout query required for "/payment" command |
||||
|
* |
||||
|
* In this command you can perform any necessary verifications and checks |
||||
|
* to allow or disallow the final checkout and payment of the invoice. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
class PrecheckoutqueryCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'precheckoutquery'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Pre-Checkout Query Handler'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Simply approve, no need for any checks at this point.
|
||||
|
return $this->getPreCheckoutQuery()->answer(true); |
||||
|
|
||||
|
// If we do make certain checks, you can define the error message displayed to the user like this.
|
||||
|
// return $this->getPreCheckoutQuery()->answer(false, [
|
||||
|
// 'error_message' => 'Registration (or whatever) required...',
|
||||
|
// ]);
|
||||
|
} |
||||
|
} |
@ -0,0 +1,39 @@ |
|||||
|
# Telegram Payments |
||||
|
|
||||
|
With the files in this folder, you can create and send invoices to your users, require their shipping details, define custom / flexible shipping methods and send a confirmation message after payment. |
||||
|
|
||||
|
## Enable payments for your bot |
||||
|
|
||||
|
Read all about Telegram Payments and follow the setup guide here: |
||||
|
https://core.telegram.org/bots/payments |
||||
|
|
||||
|
## Configuring the `/payment` command |
||||
|
|
||||
|
First of all, as a bare minimum, you need to copy the [`PaymentCommand.php`](PaymentCommand.php) and [`PrecheckoutqueryCommand.php`](PrecheckoutqueryCommand.php) files in this folder to your custom commands folder. |
||||
|
|
||||
|
If you want to allow flexible shipping options, you will also need to copy [`ShippingqueryCommand.php`](ShippingqueryCommand.php) to your custom commands folder. |
||||
|
|
||||
|
Should you want to send a message on a successful payment, you will need to copy the [`GenericmessageCommand.php`](GenericmessageCommand.php) file as well. |
||||
|
If you already have a `GenericmessageCommand.php` file, you'll need to copy the code from the `execute` method into your file. |
||||
|
|
||||
|
Next, you will need to add the Payment Provider Token (that you received in the previous step when linking your bot), to your `hook.php` or `manager.php` config. |
||||
|
|
||||
|
For `hook.php`: |
||||
|
```php |
||||
|
$telegram->setCommandConfig('payment', ['payment_provider_token' => 'your_payment_provider_token_here']); |
||||
|
``` |
||||
|
|
||||
|
For `manager.php` or using a general `config.php`, in the config array add: |
||||
|
```php |
||||
|
... |
||||
|
'commands' => [ |
||||
|
'configs' => [ |
||||
|
'payment' => ['payment_provider_token' => 'your_payment_provider_token_here'], |
||||
|
], |
||||
|
], |
||||
|
... |
||||
|
``` |
||||
|
|
||||
|
Now, when sending the `/payment` command to your bot, you should receive an invoice. |
||||
|
|
||||
|
Have fun with Telegram Payments! |
@ -0,0 +1,80 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Shipping query required for "/payment" command with flexible shipping method. |
||||
|
* |
||||
|
* In this command, you can perform any necessary verifications and checks |
||||
|
* to adjust the available shipping options of the payment. |
||||
|
* |
||||
|
* For example, if the user has a "Free Delivery" subscription or something like that. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\Payments\LabeledPrice; |
||||
|
use Longman\TelegramBot\Entities\Payments\ShippingOption; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
|
||||
|
class ShippingqueryCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'shippingquery'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Shipping Query Handler'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '0.1.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// Here you can check the shipping details and adjust the Shipping Options accordingly.
|
||||
|
// For this demo, let's simply define some fixed shipping options, a "Basic" and "Premium" shipping method.
|
||||
|
return $this->getShippingQuery()->answer(true, [ |
||||
|
'shipping_options' => [ |
||||
|
new ShippingOption([ |
||||
|
'id' => 'basic', |
||||
|
'title' => 'Basic Shipping', |
||||
|
'prices' => [ |
||||
|
new LabeledPrice(['label' => 'Basic Shipping', 'amount' => 800]), |
||||
|
], |
||||
|
]), |
||||
|
new ShippingOption([ |
||||
|
'id' => 'premium', |
||||
|
'title' => 'Premium Shipping', |
||||
|
'prices' => [ |
||||
|
new LabeledPrice(['label' => 'Premium Shipping', 'amount' => 1500]), |
||||
|
new LabeledPrice(['label' => 'Extra speedy', 'amount' => 300]), |
||||
|
], |
||||
|
]), |
||||
|
], |
||||
|
]); |
||||
|
|
||||
|
// If we do make certain checks, you can define the error message displayed to the user like this.
|
||||
|
// return $this->getShippingQuery()->answer(false, [
|
||||
|
// 'error_message' => 'We do not ship to your location :-(',
|
||||
|
// ]);
|
||||
|
} |
||||
|
} |
@ -0,0 +1,25 @@ |
|||||
|
This Folder contains some examples how to use the Telegram Bot API with the Telegram PHP Bot library |
||||
|
|
||||
|
|
||||
|
**:exclamation: DO NOT USE THE COMMANDS FOLDER** |
||||
|
|
||||
|
As the title says, do not include the Commands folder into your config to use it as it is. |
||||
|
|
||||
|
Why? This folder contains some files multiple times which is an issue for the bot software, since every file can only exist once! |
||||
|
|
||||
|
For example: GenericmessageCommand.php |
||||
|
This file exist in the following folder: |
||||
|
- Conversation |
||||
|
- Group |
||||
|
- Message |
||||
|
- Payments |
||||
|
|
||||
|
Having any Command file more than once will cause conflicts between those file, causing only one file to be executed and the others ignored. |
||||
|
|
||||
|
Please copy each file and/or folder that you need into the CustomCommans folder. |
||||
|
|
||||
|
If you want to create your own Command file, please do it so in the CustomCommands folder as well. |
||||
|
|
||||
|
If you need for example the GenericmessageCommand.php from the Conversation and Group folder, you will need to compara and merge those files. |
||||
|
|
||||
|
|
@ -0,0 +1,74 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Generic message command |
||||
|
* |
||||
|
* Gets executed when any type of message is sent. |
||||
|
* |
||||
|
* In this service-message-related context, we can handle any incoming service-messages. |
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Request; |
||||
|
|
||||
|
class GenericmessageCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'genericmessage'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Handle generic message'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.0.0'; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
$message = $this->getMessage(); |
||||
|
|
||||
|
/** |
||||
|
* Catch and handle any service messages here. |
||||
|
*/ |
||||
|
|
||||
|
// The chat photo was deleted
|
||||
|
$delete_chat_photo = $message->getDeleteChatPhoto(); |
||||
|
|
||||
|
// The group has been created
|
||||
|
$group_chat_created = $message->getGroupChatCreated(); |
||||
|
|
||||
|
// The supergroup has been created
|
||||
|
$supergroup_chat_created = $message->getSupergroupChatCreated(); |
||||
|
|
||||
|
// The channel has been created
|
||||
|
$channel_chat_created = $message->getChannelChatCreated(); |
||||
|
|
||||
|
// Information about the payment
|
||||
|
$successful_payment = $message->getSuccessfulPayment(); |
||||
|
|
||||
|
return Request::emptyResponse(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Start command |
||||
|
* |
||||
|
* Gets executed when a user first starts using the bot. |
||||
|
* |
||||
|
* When using deep-linking, the parameter can be accessed by getting the command text. |
||||
|
* |
||||
|
* @see https://core.telegram.org/bots#deep-linking
|
||||
|
*/ |
||||
|
|
||||
|
namespace Longman\TelegramBot\Commands\SystemCommands; |
||||
|
|
||||
|
use Longman\TelegramBot\Commands\SystemCommand; |
||||
|
use Longman\TelegramBot\Entities\ServerResponse; |
||||
|
use Longman\TelegramBot\Exception\TelegramException; |
||||
|
|
||||
|
class StartCommand extends SystemCommand |
||||
|
{ |
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'start'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $description = 'Start command'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $usage = '/start'; |
||||
|
|
||||
|
/** |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $version = '1.2.0'; |
||||
|
|
||||
|
/** |
||||
|
* @var bool |
||||
|
*/ |
||||
|
protected $private_only = true; |
||||
|
|
||||
|
/** |
||||
|
* Main command execution |
||||
|
* |
||||
|
* @return ServerResponse |
||||
|
* @throws TelegramException |
||||
|
*/ |
||||
|
public function execute(): ServerResponse |
||||
|
{ |
||||
|
// If you use deep-linking, get the parameter like this:
|
||||
|
// $deep_linking_parameter = $this->getMessage()->getText(true);
|
||||
|
|
||||
|
return $this->replyToChat( |
||||
|
'Hi there!' . PHP_EOL . |
||||
|
'Type /help to see all commands!' |
||||
|
); |
||||
|
} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
# CustomCommands |
||||
|
Uncomment line 47 in your config.php from |
||||
|
`// __DIR__ . '/CustomCommands',` |
||||
|
to |
||||
|
`__DIR__ . '/CustomCommands',` |
||||
|
to enable this Folder. |
||||
|
You then can copy example Commands from the Command folder. |
||||
|
|
||||
|
**:exclamation: Important!** |
||||
|
|
||||
|
DO NOT COPY THE ENTIRE COMMAND FOLDER CONTENT!! |
||||
|
|
||||
|
Some Command Files are Duplicated and may interfere with each other. |
@ -0,0 +1,13 @@ |
|||||
|
# telegram-bot |
||||
|
|
||||
|
### 创建 Bot |
||||
|
|
||||
|
发送 `/newbot`到`@BotFather`,根据提示完成创建机器人。 |
||||
|
|
||||
|
### 开发环境 |
||||
|
|
||||
|
- PHP >= 7.3 |
||||
|
- composer |
||||
|
- 境外服务器 (https) |
||||
|
- MySQL(非必要) |
||||
|
- 依赖:longman/telegram-bot |
@ -0,0 +1,31 @@ |
|||||
|
{ |
||||
|
"name": "telegram-bot/example-bot", |
||||
|
"type": "project", |
||||
|
"description": "PHP Telegram Bot Example", |
||||
|
"keywords": ["telegram", "bot", "example"], |
||||
|
"license": "MIT", |
||||
|
"homepage": "https://github.com/php-telegram-bot/example-bot", |
||||
|
"support": { |
||||
|
"issues": "https://github.com/php-telegram-bot/example-bot/issues", |
||||
|
"source": "https://github.com/php-telegram-bot/example-bot" |
||||
|
}, |
||||
|
"authors": [ |
||||
|
{ |
||||
|
"name": "PHP Telegram Bot Team", |
||||
|
"homepage": "https://github.com/php-telegram-bot/example-bot/graphs/contributors", |
||||
|
"role": "Developer" |
||||
|
} |
||||
|
], |
||||
|
"require": { |
||||
|
"longman/telegram-bot": "*" |
||||
|
}, |
||||
|
"require-dev": { |
||||
|
"php-parallel-lint/php-parallel-lint": "^1.2", |
||||
|
"squizlabs/php_codesniffer": "^3.5" |
||||
|
}, |
||||
|
"scripts": { |
||||
|
"check-code": [ |
||||
|
"\"vendor/bin/phpcs\"" |
||||
|
] |
||||
|
} |
||||
|
} |
@ -0,0 +1,92 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* This file contains all the configuration options for the PHP Telegram Bot. |
||||
|
* |
||||
|
* It is based on the configuration array of the PHP Telegram Bot Manager project. |
||||
|
* |
||||
|
* Simply adjust all the values that you need and extend where necessary. |
||||
|
* |
||||
|
* Options marked as [Manager Only] are only required if you use `manager.php`. |
||||
|
* |
||||
|
* For a full list of all options, check the Manager Readme: |
||||
|
* https://github.com/php-telegram-bot/telegram-bot-manager#set-extra-bot-parameters
|
||||
|
*/ |
||||
|
|
||||
|
return [ |
||||
|
// Add you bot's API key and name
|
||||
|
'api_key' => 'your:bot_api_key', |
||||
|
'bot_username' => 'username_bot', // Without "@"
|
||||
|
|
||||
|
// [Manager Only] Secret key required to access the webhook
|
||||
|
'secret' => 'super_secret', |
||||
|
|
||||
|
// When using the getUpdates method, this can be commented out
|
||||
|
'webhook' => [ |
||||
|
'url' => 'https://your-domain/path/to/hook-or-manager.php', |
||||
|
// Use self-signed certificate
|
||||
|
// 'certificate' => __DIR__ . '/path/to/your/certificate.crt',
|
||||
|
// Limit maximum number of connections
|
||||
|
// 'max_connections' => 5,
|
||||
|
], |
||||
|
|
||||
|
// All command related configs go here
|
||||
|
'commands' => [ |
||||
|
// Define all paths for your custom commands
|
||||
|
// DO NOT PUT THE COMMAND FOLDER THERE. IT WILL NOT WORK.
|
||||
|
// Copy each needed Commandfile into the CustomCommand folder and uncommend the Line 49 below
|
||||
|
'paths' => [ |
||||
|
// __DIR__ . '/CustomCommands',
|
||||
|
], |
||||
|
// Here you can set any command-specific parameters
|
||||
|
'configs' => [ |
||||
|
// - Google geocode/timezone API key for /date command (see DateCommand.php)
|
||||
|
// 'date' => ['google_api_key' => 'your_google_api_key_here'],
|
||||
|
// - OpenWeatherMap.org API key for /weather command (see WeatherCommand.php)
|
||||
|
// 'weather' => ['owm_api_key' => 'your_owm_api_key_here'],
|
||||
|
// - Payment Provider Token for /payment command (see Payments/PaymentCommand.php)
|
||||
|
// 'payment' => ['payment_provider_token' => 'your_payment_provider_token_here'],
|
||||
|
], |
||||
|
], |
||||
|
|
||||
|
// Define all IDs of admin users
|
||||
|
'admins' => [ |
||||
|
// 123,
|
||||
|
], |
||||
|
|
||||
|
// Enter your MySQL database credentials
|
||||
|
// 'mysql' => [
|
||||
|
// 'host' => '127.0.0.1',
|
||||
|
// 'user' => 'root',
|
||||
|
// 'password' => 'root',
|
||||
|
// 'database' => 'telegram_bot',
|
||||
|
// ],
|
||||
|
|
||||
|
// Logging (Debug, Error and Raw Updates)
|
||||
|
// 'logging' => [
|
||||
|
// 'debug' => __DIR__ . '/php-telegram-bot-debug.log',
|
||||
|
// 'error' => __DIR__ . '/php-telegram-bot-error.log',
|
||||
|
// 'update' => __DIR__ . '/php-telegram-bot-update.log',
|
||||
|
// ],
|
||||
|
|
||||
|
// Set custom Upload and Download paths
|
||||
|
'paths' => [ |
||||
|
'download' => __DIR__ . '/Download', |
||||
|
'upload' => __DIR__ . '/Upload', |
||||
|
], |
||||
|
|
||||
|
// Requests Limiter (tries to prevent reaching Telegram API limits)
|
||||
|
'limiter' => [ |
||||
|
'enabled' => true, |
||||
|
], |
||||
|
]; |
@ -0,0 +1,50 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* This file is used to run a list of commands with crontab. |
||||
|
*/ |
||||
|
|
||||
|
// Your command(s) to run, pass them just like in a message (arguments supported)
|
||||
|
$commands = [ |
||||
|
'/whoami', |
||||
|
"/echo I'm a bot!", |
||||
|
]; |
||||
|
|
||||
|
// Load composer
|
||||
|
require_once __DIR__ . '/vendor/autoload.php'; |
||||
|
|
||||
|
// Load all configuration options
|
||||
|
/** @var array $config */ |
||||
|
$config = require __DIR__ . '/config.php'; |
||||
|
|
||||
|
try { |
||||
|
// Create Telegram API object
|
||||
|
$telegram = new Longman\TelegramBot\Telegram($config['api_key'], $config['bot_username']); |
||||
|
|
||||
|
/** |
||||
|
* Check `hook.php` for configuration code to be added here. |
||||
|
*/ |
||||
|
|
||||
|
// Run user selected commands
|
||||
|
$telegram->runCommands($commands); |
||||
|
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramException $e) { |
||||
|
// Log telegram errors
|
||||
|
Longman\TelegramBot\TelegramLog::error($e); |
||||
|
|
||||
|
// Uncomment this to output any errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramLogException $e) { |
||||
|
// Uncomment this to output log initialisation errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} |
@ -0,0 +1,53 @@ |
|||||
|
#!/usr/bin/env php
|
||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* This file is used to run the bot with the getUpdates method. |
||||
|
*/ |
||||
|
|
||||
|
// Load composer
|
||||
|
require_once __DIR__ . '/vendor/autoload.php'; |
||||
|
|
||||
|
// Load all configuration options
|
||||
|
/** @var array $config */ |
||||
|
$config = require __DIR__ . '/config.php'; |
||||
|
|
||||
|
try { |
||||
|
// Create Telegram API object
|
||||
|
$telegram = new Longman\TelegramBot\Telegram($config['api_key'], $config['bot_username']); |
||||
|
|
||||
|
/** |
||||
|
* Check `hook.php` for configuration code to be added here. |
||||
|
*/ |
||||
|
|
||||
|
// Handle telegram getUpdates request
|
||||
|
$server_response = $telegram->handleGetUpdates(); |
||||
|
|
||||
|
if ($server_response->isOk()) { |
||||
|
$update_count = count($server_response->getResult()); |
||||
|
echo date('Y-m-d H:i:s') . ' - Processed ' . $update_count . ' updates'; |
||||
|
} else { |
||||
|
echo date('Y-m-d H:i:s') . ' - Failed to fetch updates' . PHP_EOL; |
||||
|
echo $server_response->printError(); |
||||
|
} |
||||
|
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramException $e) { |
||||
|
// Log telegram errors
|
||||
|
Longman\TelegramBot\TelegramLog::error($e); |
||||
|
|
||||
|
// Uncomment this to output any errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramLogException $e) { |
||||
|
// Uncomment this to output log initialisation errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} |
@ -0,0 +1,78 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* This configuration file is used to run the bot with the webhook method. |
||||
|
* |
||||
|
* Please note that if you open this file with your browser you'll get the "Input is empty!" Exception. |
||||
|
* This is perfectly normal and expected, because the hook URL has to be reached only by the Telegram servers. |
||||
|
*/ |
||||
|
|
||||
|
// Load composer
|
||||
|
require_once __DIR__ . '/vendor/autoload.php'; |
||||
|
|
||||
|
// Load all configuration options
|
||||
|
/** @var array $config */ |
||||
|
$config = require __DIR__ . '/config.php'; |
||||
|
|
||||
|
try { |
||||
|
// Create Telegram API object
|
||||
|
$telegram = new Longman\TelegramBot\Telegram($config['api_key'], $config['bot_username']); |
||||
|
|
||||
|
// Enable admin users
|
||||
|
$telegram->enableAdmins($config['admins']); |
||||
|
|
||||
|
// Add commands paths containing your custom commands
|
||||
|
$telegram->addCommandsPaths($config['commands']['paths']); |
||||
|
|
||||
|
// Enable MySQL if required
|
||||
|
// $telegram->enableMySql($config['mysql']);
|
||||
|
|
||||
|
// Logging (Error, Debug and Raw Updates)
|
||||
|
// https://github.com/php-telegram-bot/core/blob/master/doc/01-utils.md#logging
|
||||
|
//
|
||||
|
// (this example requires Monolog: composer require monolog/monolog)
|
||||
|
// Longman\TelegramBot\TelegramLog::initialize(
|
||||
|
// new Monolog\Logger('telegram_bot', [
|
||||
|
// (new Monolog\Handler\StreamHandler($config['logging']['debug'], Monolog\Logger::DEBUG))->setFormatter(new Monolog\Formatter\LineFormatter(null, null, true)),
|
||||
|
// (new Monolog\Handler\StreamHandler($config['logging']['error'], Monolog\Logger::ERROR))->setFormatter(new Monolog\Formatter\LineFormatter(null, null, true)),
|
||||
|
// ]),
|
||||
|
// new Monolog\Logger('telegram_bot_updates', [
|
||||
|
// (new Monolog\Handler\StreamHandler($config['logging']['update'], Monolog\Logger::INFO))->setFormatter(new Monolog\Formatter\LineFormatter('%message%' . PHP_EOL)),
|
||||
|
// ])
|
||||
|
// );
|
||||
|
|
||||
|
// Set custom Download and Upload paths
|
||||
|
// $telegram->setDownloadPath($config['paths']['download']);
|
||||
|
// $telegram->setUploadPath($config['paths']['upload']);
|
||||
|
|
||||
|
// Load all command-specific configurations
|
||||
|
// foreach ($config['commands']['configs'] as $command_name => $command_config) {
|
||||
|
// $telegram->setCommandConfig($command_name, $command_config);
|
||||
|
// }
|
||||
|
|
||||
|
// Requests Limiter (tries to prevent reaching Telegram API limits)
|
||||
|
$telegram->enableLimiter($config['limiter']); |
||||
|
|
||||
|
// Handle telegram webhook request
|
||||
|
$telegram->handle(); |
||||
|
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramException $e) { |
||||
|
// Log telegram errors
|
||||
|
Longman\TelegramBot\TelegramLog::error($e); |
||||
|
|
||||
|
// Uncomment this to output any errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramLogException $e) { |
||||
|
// Uncomment this to output log initialisation errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} |
@ -0,0 +1,42 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* This configuration file is used as the main script for the PHP Telegram Bot Manager. |
||||
|
* |
||||
|
* For the full list of options, go to: |
||||
|
* https://github.com/php-telegram-bot/telegram-bot-manager#set-extra-bot-parameters
|
||||
|
*/ |
||||
|
|
||||
|
// Load composer
|
||||
|
require_once __DIR__ . '/vendor/autoload.php'; |
||||
|
|
||||
|
// Load all configuration options
|
||||
|
/** @var array $config */ |
||||
|
$config = require __DIR__ . '/config.php'; |
||||
|
|
||||
|
try { |
||||
|
$bot = new TelegramBot\TelegramBotManager\BotManager($config); |
||||
|
|
||||
|
// Run the bot!
|
||||
|
$bot->run(); |
||||
|
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramException $e) { |
||||
|
// Log telegram errors
|
||||
|
Longman\TelegramBot\TelegramLog::error($e); |
||||
|
|
||||
|
// Uncomment this to output any errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} catch (Longman\TelegramBot\Exception\TelegramLogException $e) { |
||||
|
// Uncomment this to output log initialisation errors (ONLY FOR DEVELOPMENT!)
|
||||
|
// echo $e;
|
||||
|
} |
@ -0,0 +1,26 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<ruleset name="php-telegram-bot-example-bot-ruleset"> |
||||
|
<description>PHP Code Sniffer</description> |
||||
|
|
||||
|
<arg value="snp"/> |
||||
|
<arg name="colors"/> |
||||
|
<arg name="parallel" value="8"/> |
||||
|
<arg name="encoding" value="utf-8"/> |
||||
|
<arg name="report-width" value="150"/> |
||||
|
<arg name="extensions" value="php"/> |
||||
|
|
||||
|
<file>.</file> |
||||
|
<exclude-pattern>*/vendor/*</exclude-pattern> |
||||
|
|
||||
|
<rule ref="PSR12"/> |
||||
|
|
||||
|
<rule ref="Generic.CodeAnalysis.EmptyStatement"> |
||||
|
<!-- Allow empty statements for explanation comments --> |
||||
|
<exclude name="Generic.CodeAnalysis.EmptyStatement"/> |
||||
|
</rule> |
||||
|
|
||||
|
<rule ref="Squiz.WhiteSpace.ControlStructureSpacing"> |
||||
|
<!-- Allow the empty line to improve readability --> |
||||
|
<exclude name="Squiz.WhiteSpace.ControlStructureSpacing.SpacingBeforeClose"/> |
||||
|
</rule> |
||||
|
</ruleset> |
@ -0,0 +1,42 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* This file is used to set the webhook. |
||||
|
*/ |
||||
|
|
||||
|
// Load composer
|
||||
|
require_once __DIR__ . '/vendor/autoload.php'; |
||||
|
|
||||
|
// Load all configuration options
|
||||
|
/** @var array $config */ |
||||
|
$config = require __DIR__ . '/config.php'; |
||||
|
|
||||
|
try { |
||||
|
// Create Telegram API object
|
||||
|
$telegram = new Longman\TelegramBot\Telegram($config['api_key'], $config['bot_username']); |
||||
|
|
||||
|
/** |
||||
|
* REMEMBER to define the URL to your hook.php file in: |
||||
|
* config.php: ['webhook']['url'] => 'https://your-domain/path/to/hook.php' |
||||
|
*/ |
||||
|
|
||||
|
// Set the webhook
|
||||
|
$result = $telegram->setWebhook($config['webhook']['url']); |
||||
|
|
||||
|
// To use a self-signed certificate, use this line instead
|
||||
|
// $result = $telegram->setWebhook($config['webhook']['url'], ['certificate' => $config['webhook']['certificate']]);
|
||||
|
|
||||
|
echo $result->getDescription(); |
||||
|
} catch (Longman\TelegramBot\Exception\TelegramException $e) { |
||||
|
echo $e->getMessage(); |
||||
|
} |
@ -0,0 +1,34 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of the PHP Telegram Bot example-bot package. |
||||
|
* https://github.com/php-telegram-bot/example-bot/ |
||||
|
* |
||||
|
* (c) PHP Telegram Bot Team |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* This file is used to unset / delete the webhook. |
||||
|
*/ |
||||
|
|
||||
|
// Load composer
|
||||
|
require_once __DIR__ . '/vendor/autoload.php'; |
||||
|
|
||||
|
// Load all configuration options
|
||||
|
/** @var array $config */ |
||||
|
$config = require __DIR__ . '/config.php'; |
||||
|
|
||||
|
try { |
||||
|
// Create Telegram API object
|
||||
|
$telegram = new Longman\TelegramBot\Telegram($config['api_key'], $config['bot_username']); |
||||
|
|
||||
|
// Unset / delete the webhook
|
||||
|
$result = $telegram->deleteWebhook(); |
||||
|
|
||||
|
echo $result->getDescription(); |
||||
|
} catch (Longman\TelegramBot\Exception\TelegramException $e) { |
||||
|
echo $e->getMessage(); |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue