Как назначить команду на кнопку меню Telegram бота?

Пишу бота.
Использую PHP / Laravel / telegram-bot-sdk
При команде /start бот выдаёт сообщение и меню для выбора языка.
$languages = config('app.locales_assoc');

        $keyboard = [];
        $keyboardArray = [];
        foreach ($languages as $language) {
            array_push($keyboardArray, $language);
        }
        $keyboard[] = $keyboardArray;

        $reply_markup = $this->telegram->replyKeyboardMarkup([
          'keyboard' => $keyboard,
          'resize_keyboard' => true,
          'one_time_keyboard' => true,
          'selective' => false
        ]);

        $this->replyWithMessage(
          [
            'text' => trans('bot.greeting_lang'),
            'reply_markup' => $reply_markup
          ]
        );

В итоге пользователь получает простое меню из 3-х кнопок "Русский", "Украинский" и "Английский".
При нажатии на кнопку в чат уходит сообщение с той же строкой, например "Русский".
Возможно ли сделать так, что бы при нажатии на кнопку меню от пользователя уходило в чат сообщение по типу
/setLanguage Русский
Реально ли назначать команды кнопкам меню?
  • Вопрос задан
  • 2345 просмотров
Решения вопроса 1
glebovgin
@glebovgin
Full Stack Web Developer
Нужно использовать inline-клавиатуру
$button_en = array('text' => 'English', 'callback_data' => '/lang_english');
$button_ru = array('text' => 'Русский', 'callback_data' => '/lang_russian');
				
$keyboard = array('inline_keyboard' => array(array($button_en, $button_ru)));
$params['reply_markup'] = json_encode($keyboard, TRUE);


После нажатия кнопки нужно будет принимать callback_query. Я для удобства значение callback_data пишу через "_", то есть при отправке /lang_russian я разбиваю это значение на сегменты, после чего становится понятно, что в метод, связанный с установкой языка set_lang(), мне надо отправить один параметр "russian".
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@nllm
Так можно сделать с помощью inline-кнопок
Или оставить как есть, но сделать работу с состояниями.
Например, после нажатия на /start бот попадает в состояние "выбор языка". После нажатия на одну из кнопок "Русский", "Украинский" и "Английский" проверяете, что указали (нажали) одну из кнопок, а не ввели произвольный текст и если все хорошо, то меняете состояние на ожидание следующей команды, выводите соответственный текст.

Про работу с состояниями было много вопросов, они все есть на toster.ru
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы