Сейчас изучаю фреймворк для Telegram Bot Telegraph от defstudio и возник вопрос как обрабатывать кнопки клавиатуры. Для inline кнопок у них есть решение из коробки, но вот на клавиатуру только одно решение: ловите текст проверяйте на нужное значение и запускайте нужный метод.
Решил прикрутить логику своего решения.
Так как Telegraph является пакетом для Laravel, то решение удалось сделать более элегантным, инструменты Laravel это позволяют.
Использую для этого Локализацию, это удобно использовать даже если в вашем боте будет только один язык интерфейса
..
resources
|__lang
|__ru/
|__buttons.php
|__start.php
|__en/
|__buttons.php
|__start.php
..
В файле resources/lang/{ru|en}/buttons.php
например следующая структура:
<?php
return [
"reply" => [
"structure" => "🗂 Структура"
]
];
Саму клавиатуру выводим при помощи функции __()
например в методе команды /start
в файле CustomWebhookHandler.php
, который обрабатывает все основные ваши хуки бота
<?php
/**
* @return void
*/
public function start(): void
{
$replyKeyboard = ReplyKeyboard::make()
->row([
ReplyButton::make(__("buttons.reply.structure")),
]);
$this
->chat
->html(__("start.run.hello", ["name" => $this->chat->getFullName()]))
->replyKeyboard($replyKeyboard)
->send();
}
Теперь при старте бота будет выведен текст из файла resources/lang/{ru|en}/start.php
и кнопка клавиатуры со значением 🗂 Структура
, при нажатии на кнопку в чат с ботом будет направлено текстовое сообщение 🗂 Структура
, нам необходимо его перехватить и обработать.
Лучше всего это сделать во встроенном методе handleChatMessage($text)
в нем мы будем получать текстовое значение сообщения в переменной $text
Для проверки и обработки значения $text
создадим еще одним метод и вызовем его, в случае если хук определит это как команду кнопки клавиатуры, то будем вызывать специально созданный метод для обработки команды.
Я для себя определил название метода как actionReply + ключ в массиве
, в данном примере он = structure
, поэтому полное название будет actionReplyStructure
, этот метод также сразу создадим.
<?php
/**
* @param $text
* @return void
*/
public function handleChatMessageText($text): void
{
// проверим на команды клавиатуры
$this->handleReplyCommand($text);
$this->reply($text);
}
<?php
/** Метод обработки команды клавиатуры 🗂 Структура
* @return void
*/
public function replyActionStructure(): void
{
$this->reply("It`s work!!!");
}
<?php
/** Проверка на команды клавиатуры
* @param $text
* @return void
*/
private function handleReplyCommand($text): void
{
$replyCommands = __("buttons.reply");
$replyCommands = is_array($replyCommands)
? $replyCommands
: [];
$command = collect($replyCommands)
->where(fn ($replyCommand) => trim($replyCommand) === trim($text))
->keys()
->first();
if (!is_null($command) && $this->canHandle("replyAction" . ucfirst($command))) {
$this->{"replyAction" . ucfirst($command)}();
exit;
}
}
Это решение будет работать только если в название кнопки не будут передаваться динамические значения, по типу:
<?php
// файл локализации
return [
"reply" => [
"structure" => "🗂 Структура :name"
]
];
// подстановка значения
__("buttons.reply.structure", ["name" => "Андрея"])
так как значение :name
является динамическим, то сложно будет угадать, и соответственно не поймать соответствия в этой проверке:
trim($replyCommand) === trim($text)
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.