← Вернуться к списку тем

В case задаю вопрос, как остановить код и ждать пока пользователь что то напишет.

В case задаю вопрос, как остановить код и ждать пока пользователь что то напишет.

Пробовал таким образом, но ничего не вышло.

switch ($command) {
    case '/category':
        $force_reply = ['force_reply' => true];
        $replyMarkup = json_encode($force_reply);
        sendMessage($callback_chat_id, "Введите название", $replyMarkup);
        $message = null;
        // то ничего не делаем
        if ($message == null) { 

        } // в противном случае выполняем этот код
        else { 
            sendMessage($callback_chat_id, "Получилось", $replyMarkup);
        }
        break;
}

Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.

  • iMakeBots [1 год назад]

    с PHP это не прокатит, он не может зависать в ожидании продолжения кроме, как спать - sleep(), но после этого он просто пойдет дальше по коду - без новых данных извне.

    PHP выполняется в одном потоке, что означает, что в любой момент времени может выполняться только один фрагмент PHP-кода.

    На сколько я понял вы имеете в виду промисы, их по умолчанию в PHP нет (библиотека ReactPHP). И если честно для таких задач как ваша они и не нужны. В своей практике не разу не требовалось их наличие в PHP.

    Ваша задача состоит в том, чтобы на тот момент когда вы задаете пользователю задачу: "Укажите название категории:". Нужно поставить ему метку, что следующее сообщение от пользователя это будет "название категории". 

    У вас этой меткой служит ответ на сообщение (reply_to_message). Поэтому вам надо отловить тот момент, что это ответ на сообщение и отработать, спарсив текстовое значение этого ответ-сообщения.

    В данном случае вам надо найти в тексте значение "Введите название" и направить на нужный вам фрагмент кода, который обработает сообщение от пользователя.

    Алгоритм будет такой:

    1. вы понимаете, что это ответ на какое-то сообщение: reply_to_message
    2. вы понимаете, что сообщение на которое идет ответ это сообщение вашего бота: reply_to_message - from - is_bot
    3. Вы парсите текст из сообщения на предмет поиска в нем нужного значение: reply_to_message - message - text
    4. вы определяете, что это нужный вам тип сообщения (text, photo, document ...)
    5. вы направляете данные в точку обработки 

  • Vlad [1 год назад]
    $bot_state = ''; // состояние бота, по-умолчанию пустое
    // получим текущее состояние бота, если оно есть
    $bot_state = get_bot_state ($chat_id);
    
    switch($bot_state) {
    	
        case '/name_ads': 
    
    	$text_return = "
    	Название объявления:
    	$message
    	";
            sendMessage($chat_id, $text_return, $replyMarkup);
            set_bot_state ($chat_id, ''); // не забудем почистить состояние на пустоту, после отправки заявки    	
    	$message = '/text';
        break; 
    }
    switch($command){
    
        case '/category':
        sendMessage($callback_chat_id, "Введите название объявления", $replyMarkup);
    	set_bot_state ($callback_chat_id, '/name_ads');
        break;
    }
    // сохранить состояние бота для пользователя
    function set_bot_state ($chat_id, $data){
        file_put_contents(__DIR__ . '/users/'.$chat_id.'.txt', $data);
    }
    
    // получить текущее состояние бота для пользователя
    function get_bot_state ($chat_id){
        if (file_exists(__DIR__ . '/users/'.$chat_id.'.txt')) {
            $data = file_get_contents(__DIR__ . '/users/'.$chat_id.'.txt');
            return $data;
        }
        else {
            return '';
        }
    }
  • Vlad [1 год назад → Vlad]

    Решил вопрос таким образом ! Подсмотрел здесь https://www.novelsite.ru/dobavlyaem-punkty-menyu-telegram-bota-na-php.html

  • iMakeBots [1 год назад → Vlad]

    Да, можно и так.

    Но можно и не захламлять ненужными файлами свой проект, а использовать force_reply, пример есть в статье