Как сделать остановку команды телеграм бота?
Как сделать так чтобы команду которую ты написал ты мог остановить другой командой? Например есть команда которая включает у бота "Режим Калькулятора"
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 шт):
Использование 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.