Сокращение и упрощение кода Telegram bot

При написании бота на библиотеке Telebot столкнулся с неприятной особенностью. Функция Bot.register_next_step_handler() Вынуждает передать в неё другую функцию, которая будет исполнена при получении ответа от пользователя. В итоге код вытягивается в цепочку функций. А так как я человек крайне не сведующий в программировании, то мне почему-то кажется, что есть способ, позволяющий написать этот код компактнее и удобнее для рефакторинга (потому что рефакторить длинные цепочки функций очень неудобно).


import telebot
from django.conf import settings
from telebot import types

from ...data_check import (birth_date_check, correct_entry, phone_check,
                           word_lang_check)
from ...dates_times import (age_calculate, day_time_city, day_time_no_city,
                            time_convert, what_time, what_time_general)
from ...encodeID import encode_id
from ...models import (ProfileAgency, ProfilePromo, Project, PromoRequest,
                       RateAgency, RatePromo, ReviewAgency, ReviewPromo, bot)


def promo_last_reg_step(message, phone_number, name_promo, surname_promo,
                        second_name_promo, birth_date_promo, promo_city, promo_description):
    end_reg = telebot.types.ReplyKeyboardMarkup()
    end_reg.row('Завершить регистрацию', 'Start')
    promo_user_id = message.from_user.id
    phone_number = phone_number
    promo_id = encode_id(phone_number)
    name_promo = name_promo
    surname_promo = surname_promo
    second_name_promo = second_name_promo
    birth_date_promo = birth_date_promo
    age = age_calculate(birth_date_promo)
    promo_city = promo_city
    promo_description = promo_description
    bot.send_message(message.chat.id, f'ID пользователя в Telegram: {promo_user_id}\n'
                                      f'Введенный номер телефона: {phone_number}\n'
                                      f'Уникальный ID сотрудника для проекта: {promo_id}\n'
                                      f'Имя: {name_promo}\n'
                                      f'Фамилия: {surname_promo}\n'
                                      f'Отчество: {second_name_promo}\n'
                                      f'Дата рождения: {birth_date_promo}\n'
                                      f'Возраст: {age}\n'
                                      f'Город: {promo_city}\n'
                                      f'О себе: {promo_description}')
    bot.send_message(message.chat.id, 'Если данные введены вверно нажмите -Завершить регистрацию-.\n\n'
                                      'Если данные введены неверно, то нажмите -Start-, чтобы начать процесс'
                                      ' регистрации заново', reply_markup=end_reg)
    bot.register_next_step_handler(message, promo_save_after_reg, phone_number, name_promo, surname_promo,
                                   second_name_promo, birth_date_promo, promo_city, promo_description)


def enter_promo_description(message, phone_number, name_promo, surname_promo,
                            second_name_promo, birth_date_promo, promo_city):
    promo_description = message.text
    bot.send_message(message.chat.id, 'Все данные введены корректно\n\n'
                                      'Давайте все еще раз проверим')
    promo_last_reg_step(message, phone_number, name_promo, surname_promo, second_name_promo, birth_date_promo,
                        promo_city, promo_description)


def enter_promo_city(message, phone_number, name_promo, surname_promo, second_name_promo, birth_date_promo):
    check = word_lang_check(message.text)
    if check == 1:
        promo_city = correct_entry(message.text).capitalize()
        bot.send_message(message.chat.id, 'Город введён корректно\n\n'
                                          'Введите информацию о себе в произвольном формате')
        bot.register_next_step_handler(message, enter_promo_description, phone_number, name_promo, surname_promo,
                                       second_name_promo, birth_date_promo, promo_city)
    elif check == 2:
        bot.send_message(message.chat.id, 'Введите текст повторно на русском языке')
        bot.register_next_step_handler(message, enter_promo_city, phone_number, name_promo, surname_promo,
                                       second_name_promo, birth_date_promo)


def enter_birth_date_promo(message, phone_number, name_promo, surname_promo, second_name_promo):
    check = birth_date_check(message.text)
    if check == 1:
        birth_date_promo = message.text
        bot.send_message(message.chat.id, 'Дата рождения введена корректно\n\n'
                                          'Введите город, в котором планируете работать')
        bot.register_next_step_handler(message, enter_promo_city, phone_number, name_promo, surname_promo,
                                       second_name_promo, birth_date_promo)
    elif check == 0:
        bot.send_message(message.chat.id, 'Введите дату рождения в формате ДЕНЬ.МЕСЯЦ.ГОД')
        bot.register_next_step_handler(message, enter_birth_date_promo, phone_number, name_promo, surname_promo,
                                       second_name_promo)


def enter_second_name_promo(message, phone_number, name_promo, surname_promo):
    check = word_lang_check(message.text)
    if check == 1:
        second_name_promo = correct_entry(message.text).capitalize()
        bot.send_message(message.chat.id, 'Отчество введено корректно\n\n'
                                          'Введите вашу дату рождения в формате 4.11.1994')
        bot.register_next_step_handler(message, enter_birth_date_promo, phone_number, name_promo, surname_promo,
                                       second_name_promo)
    elif check == 2:
        bot.send_message(message.chat.id, 'Введите текст повторно на русском языке')
        bot.register_next_step_handler(message, enter_second_name_promo, phone_number, name_promo, surname_promo)


def enter_surname_promo(message, phone_number, name_promo):
    check = word_lang_check(message.text)
    if check == 1:
        surname_promo = correct_entry(message.text).capitalize()
        bot.send_message(message.chat.id, 'Фамилия введена корректно\n\n'
                                          'Введите ваше отчество на русском языке')
        bot.register_next_step_handler(message, enter_second_name_promo, phone_number, name_promo, surname_promo)
    elif check == 2:
        bot.send_message(message.chat.id, 'Введите текст повторно на русском языке')
        bot.register_next_step_handler(message, enter_surname_promo, phone_number, name_promo)


def enter_name_promo(message, phone_number):
    check = word_lang_check(message.text)
    if check == 1:
        name_promo = correct_entry(message.text).capitalize()
        bot.send_message(message.chat.id, 'Имя введено корректно\n\n'
                                          'Введите вашу фамилию на русском языке')
        bot.register_next_step_handler(message, enter_surname_promo, phone_number, name_promo)
    elif check == 2:
        bot.send_message(message.chat.id, 'Введите текст повторно на русском языке')
        bot.register_next_step_handler(message, enter_name_promo, phone_number)


def enter_number_promo(message):
    check = phone_check(message.text)
    if check == 1:
        phone_number = correct_entry(message.text)
        bot.send_message(message.chat.id, 'Номер телефона введен корректно\n\n'
                                          'Введите ваше полное имя на русском языке')
        bot.register_next_step_handler(message, enter_name_promo, phone_number)
    elif check == 2:
        bot.send_message(message.chat.id, f'Вы ввели меньше цифр, чем нужно\n\nПовторите ввод')
        bot.register_next_step_handler(message, enter_number_promo)
    elif check == 3:
        bot.send_message(message.chat.id, f'Неверный формат номера телефона\nНеоходимо ввести номер в формате'
                                          f' +79991112233\n\nПовторите ввод')
        bot.register_next_step_handler(message, enter_number_promo)


def promo_save_after_reg(message, phone_number, name_promo, surname_promo,
                         second_name_promo, birth_date_promo, promo_city, promo_description):
    if message.text == 'Завершить регистрацию':
        new_commands = telebot.types.ReplyKeyboardMarkup()
        new_commands.row('Публикация вакансии', 'Запросить список активных проектов',
                         'Заполнить дополнительную информацию о себе')
        promo = ProfilePromo(
            phone_number=phone_number,
            real_name=name_promo,
            real_surname=surname_promo,
            real_secondName=second_name_promo,
            birth_date=birth_date_promo,
            city=promo_city,
            description=promo_description,
            promo_unique_id=encode_id(phone_number),
            promo_telegram_id=message.from_user.id,
            promo_telegram_username=message.from_user.username,
        )
        promo.save()
        bot.send_message(message.chat.id, 'Вы только что закончили регистрацию, новые команды к вашим услугам',
                         reply_markup=new_commands)
    else:
        promo_first_step_reg(message)


def promo_first_step_reg(message):
    hideBoard = types.ReplyKeyboardRemove()
    bot.send_message(message.chat.id, 'Введите ваш номер телефона', reply_markup=hideBoard)
    bot.register_next_step_handler(message, enter_number_promo)



Ответы (0 шт):