@ar2rsoft
PHP-developer

Как сделать пошагового телеграм бота на PHP?

Приветствую.

Пишу телеграм бота используя библиотеку https://github.com/TelegramBot/Api и Yii2

Задача: сделать пошаговое заполнение профиля.

У бота написал такой код:
$bot->command('start', function ($message) use ($bot) {
	$user = new User();
	$user->setAttributes(['t_id' => $message->getFrom()->getId()]);
	$user->save();
	$bot->sendMessage($update->getMessage()->getChat()->getId(), "Введите имя: ");
});

// Шаг 1, вводим имя
$bot->on(function (Update $update) use ($bot) {
	$user = User::find()->where(['t_id' => $update->getMessage()->getFrom()->getId())->one();
	$user->setAttribute('name', $update->getMessage()->getText());
	$user->save();
	$bot->sendMessage($update->getMessage()->getChat()->getId(), "Введите фамилию: ");
}, function (Update $update) {
	if (!$update->getMessage()) {
		return false;
	}

	$user = User::find()->where(['t_id' => $update->getMessage()->getFrom()->getId())->one();
	if (!$user) {
		return false;
	}
	
	return empty($user->name);
});

// Шаг 2, вводим фамилию
$bot->on(function (Update $update) use ($bot) {
	$user = User::find()->where(['t_id' => $update->getMessage()->getFrom()->getId())->one();
	$user->setAttribute('lastname', $update->getMessage()->getText());
	$user->save();
	$bot->sendMessage($update->getMessage()->getChat()->getId(), "Имя и фамилия введены! Спасибо");
}, function (Update $update) {
	if (!$update->getMessage()) {
		return false;
	}

	$user = User::find()->where(['t_id' => $update->getMessage()->getFrom()->getId())->one();
	if (!$user) {
		return false;
	}
	
	return empty($user->lastname);
});


В on() первая функция выполняется, если результат второй функции true.

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

И очень сложно поддерживать такой код, когда шагов уже не 2 а 5-6 уже становится сложно в этом разобраться.

Подскажите, как можно такой алгоритм упростить, сделать более легко поддерживаемым? Чтобы легче было менять местами шаги и дополнять их.

Буду благодарен за ссылки на литературу, ключевики которые надо гуглить, гитхаб ссылкам с хорошими примерами, и любым другим советам/критике :)
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
myks92
@myks92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
Если правильно понял вас, то Используйте Listeners и весь функционал обработчиках производите там. То есть бот посылает команду и event вы вешаете на это событие на свой listener. В итоге получается такая схема событие -> обработчик. Когда событие возникает тогда и работает обработчик.

В обработчике уже помещаете логику в зависимости от переданных данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽