Задать вопрос
@prishelec

Как реализовать алгоритм вопрос-ответ?

Добрый день!
Может кто реализовывал подобное при разработке бота.
Интересует момент реализации ввода данных на некоторые: вопрос или команду.
Т.е. выводим к примеру текст: «как вас зовут»
Далее вводим имя.
Как после ввода имени узнать что это был ответ на наш вопрос (сессий то нет)?
Пока вижу решение в использовании БД. Пока еще продумываю структуру.
Пример из ввода имени от BotFather:
63f4adf70cc11833378994.jpeg
  • Вопрос задан
  • 73 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Dimanokum
Я хранил текущее меню пользователя (id: 1, name: user, currentMenu: "getUserName")
И когда приходило сообщение от пользователя, сначала проверял его текст на основные команды /stop, /menu и тп. А после, по текущему меню пользователя определял к какому вопросу относится его сообщение.
Ответ написан
nki
@nki
bezkart.ru готовая система лояльности
Если вы используете библиотеку telebot, то там есть функция register_next_handler, в которую вы передаете обработчик следующего ввода от пользователя. Таким образом, в обработчике вы однозначно понимаете, то получили ответ на вопрос.
Ответ написан
@prishelec Автор вопроса
Разбор кода в telebot не помог
дошел до кода и тупик :
class HandlerBackend(object):
    """
    Class for saving (next step|reply) handlers.

    :meta private:
    """
    def __init__(self, handlers=None):
        if handlers is None:
            handlers = {}
        self.handlers = handlers

    def register_handler(self, handler_group_id, handler):
        raise NotImplementedError()

    def clear_handlers(self, handler_group_id):
        raise NotImplementedError()

    def get_handlers(self, handler_group_id):
        raise NotImplementedError()


В итоге вопрос удалось решить.
Может кому-то будет полезно

-- Структура таблицы в БД mysql

CREATE TABLE handlers (
  chat_id int(11) NOT NULL,
  callback_func varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (chat_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


/* Код */
$chat_id = 10; /* условный id чата */

function addHandler($chat_id, $callback){
	$db->query("INSERT INTO handlers (chat_id, callback_func) VALUE ('$chat_id', '$callback') ON DUPLICATE KEY UPDATE handlers.callback_func = '$callback'");
	
	return $db->get_affected_rows();
}

function removeHandler($chat_id){
	$db->query("DELETE FROM handlers WHERE chat_id = '$chat_id'");
		
	return $db->get_affected_rows();
}

function getHandler($chat_id){
	$row = $db->query_ex("SELECT callback_func FROM handlers WHERE chat_id = '$chat_id'");
	
	return ($row)? $row['callback_func']: null;
}

function executeHandler($callback, $params = null){
	/*
	Используем
	call_user_func или call_user_func_array
	*/
	
	if (function_exists($callback))
		return call_user_func($callback, $params);
	
	return false;
}

/* Использование */
$bot->sendMessage($chat_id, "Введите дату в формате: 01.03.2023");
/* Инициируем  обработчик для получения ввода данных */
addHandler($chat_id, 'getReport');

/* В начале модуля проверяем наличие обработчика */
if ($callback_func = getHandler($chat_id)) {
	executeHandler($callback_func, $bot->getText());
}

function getReport($date){
	/* Наш код */
	
	/* Удаляем обработчик */
	removeHandler($chat_id);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы