@HabrUser12233

Как убрать дублирование ввода для пользователя при создании телеграм бота на питоне?

Всем привет. Пишу обычного бота для некоторых вычислений. Проблема в том, что при вводе пользователем данных ему нужно ввести два раза или первый раз нужное число, а второй раз всё что угодно(скриншот 1 и скриншот 2). Нужна помощь. Прошу прощения, если код выглядит не очень. Я готов к критике!
import telebot
from telebot import types

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start'])
def start(message):
    bot.clear_step_handler(message)
    bot.send_message(message.chat.id, 'Привет, я Final Exam Score Bot!')
    bot.send_message(message.chat.id, '1️⃣ Пожалуйста, введите свою оценку за Register Midterm:')
    bot.register_next_step_handler(message, get_midterm)

@bot.message_handler()
def get_midterm(message):
        global midterm
        try:
            midterm =int(message.text)
            if not message.text.isdigit() or midterm < 25 or midterm > 100:
                raise ValueError()
            bot.register_next_step_handler(message, get_endterm)
            bot.send_message(message.chat.id, '2️⃣ Пожалуйста, введите свою оценку за Register Endterm: Нужно ввести два раза, пока что)')
        except ValueError:
            bot.send_message(message.chat.id, "Вы неправильно ввели оценку!")
            bot.register_next_step_handler(message, get_midterm)

@bot.message_handler()
def get_endterm(message):
        global endterm
        try:
            endterm = int(message.text)
            if not message.text.isdigit() or endterm < 25 or endterm > 100:
                raise ValueError()
            bot.register_next_step_handler(message, get_total)
        except ValueError:
            bot.send_message(message.chat.id, "Вы неправильно ввели оценку!")
            bot.register_next_step_handler(message, get_endterm)

@bot.message_handler()
def get_total(message):
    if midterm * 0.3 + endterm * 0.3 >= 50:
        vishkagrade = (90 - (midterm * 0.3 + endterm * 0.3))/0.4
        vishka = f' Для получения повышенной стипендии (>90) {vishkagrade} % на файнале!'
    elif midterm * 0.3 + endterm * 0.3 < 50:
        vishka = ' Для получения повышенной стипендии (>90) Heвозможно получить!'

    if midterm * 0.3 + endterm * 0.3 >= 30 and midterm * 0.3 + endterm * 0.3 <= 50:
        stepuhagrade = (70 - (midterm * 0.3 + endterm * 0.3))/0.4
        stepuha = f' Для сохранения стипендии (>70) {stepuhagrade} % на файнале!'
    elif midterm * 0.3 + endterm * 0.3 >= 50:
        stepuha = ' Для сохранения стипендии (>70) 50 % на файнале!'
    elif midterm * 0.3 + endterm * 0.3 < 30:
        stepuha = ' Для сохранения стипендии (>70) Heвозможно получить!'

    if midterm * 0.3 + endterm * 0.3 >= 15 and midterm * 0.3 + endterm * 0.3 <= 30:
        letnikgrade = (50 - (midterm * 0.3 + endterm * 0.3)) / 0.4
        letnik = f'⚫ Чтобы не получить ретейк или пересдачу (>50) {letnikgrade} % на файнале!'
    elif midterm * 0.3 + endterm * 0.3 >= 30:
        letnik = '⚫ Чтобы не получить ретейк или пересдачу (>50) 50 % на файнале!'
    elif midterm * 0.3 + endterm * 0.3 < 15:
        letnik = '⚫ Чтобы не получить ретейк или пересдачу (>50) Ой, у вас летник!'

    totalscore = f'⚪ Если вы получите 100% на файнале, ваш тотал будет {midterm * 0.3 + endterm * 0.3 + 40} %!'

    bot.send_message(message.chat.id, letnik)
    bot.send_message(message.chat.id, stepuha)
    bot.send_message(message.chat.id, vishka)
    bot.send_message(message.chat.id, totalscore)

    kb = types.InlineKeyboardMarkup()
    btn = types.InlineKeyboardButton(text='Попробовать еще раз✅', callback_data='btn1')
    kb.add(btn)
    bot.send_message(message.chat.id, 'Нажмите сюда для еще одного подсчета', reply_markup=kb)

@bot.callback_query_handler(func=lambda call: True)
def inline_handler(call):
    if call.data == 'btn1':
        bot.delete_message(call.message.chat.id, call.message.message_id)
        start(call.message)

while True:
    try:
        bot.polling()
    except:
        continue

63e9330ce7824631489145.png
63e93315799f3376146507.png
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
@juiwas_morori
У вас 3 хендлера, реагирующие на любые сообщения от пользователя.
Вам надо или хендлерах сделать установку, на что именно он реагирует, или оставить 1 хендлер, реагирующий на событие получения сообщения ( как у вас сделано) и сделать обычные функции.

Что-то типо (ниже псевдокод. я просто для примера)

функция ответа для ответа яблока():
    код, который отравляет пользователю картинку яблока

if message.text == 'яблоко':
    функция ответа для ответа яблока()
else:
    функция ответа для ответа не яблока()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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