Как сделать остановку команды телеграм бота?

Как сделать так чтобы команду которую ты написал ты мог остановить другой командой? Например есть команда которая включает у бота "Режим Калькулятора"

    import telebot
    from telebot import types, TeleBot


    bot: TeleBot = telebot.TeleBot('BOT TOKEN')

    @bot.message_handler(commands=['calculator'])
    def calculator_start(message):
       bot.send_message(message.chat.id, eval((message.text)), parse_mode="html")



    bot.polling(none_stop=True)

Но в вышеуказанном коде есть проблема после написание команды calculator бот начнёт считать всё возможные выражения(которые напишет пользователь) и не остановится пока не выключить бота. Мне же нужно что бы команда calculator считала только 1 выражение(то есть считала только 1 сообщение пользователя которое поступит после команды) или же что бы команда calculator считала до тех пор пока не прозвучит команда допустим calculator_off. Заранее спасибо за ответ)


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

Автор решения: ufo_driver

Использование eval() для создания калькулятора - не очень хорошая идея. И особенно плохо такое решение смотрится, когда в eval() попадают выражения, вводимые пользователями через бота. Это крайне небезопасно и я бы рекомендовал вам пересмотреть логику работы.

Но раз уж на то пошло. Если вам нужно обработать только одно выражение пользователя, используйте register_next_step_handler. Он ожидает следующего за вызовом команды сообщения и передаёт управление в другую функцию для его обработки.

@bot.message_handler(commands=['calculator'])
def calculator_start(message):
   
    #записываем сообщение в переменную
    msg = bot.send_message(message.chat.id, 'введите выражение', parse_mode="html")
   
    #создаём next_step_handler, передавая ему переменную с сообщением и функцию, которую будем вызывать
    bot.register_next_step_handler(msg, calculate)

def calculate(message):
    result = eval(message.text)
    bot.send_message(message.chat.id, result)


Работает следующим образом: пользователь вызывает команду calculator -> бот просит ввести выражение -> пользователь вводит выражение -> бот с помощью next_step_handler передаёт выражение в функцию calculate(), где происходит вычисление и отправка сообщения с результатом.

Если вам надо, чтобы бот обрабатывал несколько выражений подряд и останавливался по команде, то видоизмените функцию calculate() следующим образом:

def calculate(message):
    
    if message.text == 'stop':
        return
        
    result = eval(message.text)
    bot.send_message(message.chat.id, result)
    calculator_start(message)


В таком виде калькулятор остановится, если написать ему stop.

→ Ссылка