Как после callback_query_hendler вызвать обычный message_hendler. Telebot
Когда программа доходит до callback_query_hendler программа перестает перехватывать обычные сообщения. Кроме того продолжает работать callback_query_hendler игнорируя ограничение по state.
import datetime
from datetime import timedelta
import telebot
import markup as m
from telebot import custom_filters
from telebot.handler_backends import State, StatesGroup # States
# States storage
from telebot.storage import StateMemoryStorage
state_storage = StateMemoryStorage()
bot = telebot.TeleBot("5516259761:AAEqpGpfsnLahD6YUtzzHgaLnGwo9VCT6oQ", state_storage=state_storage)
def timeout(message):
timestamp = datetime.datetime.now() # Таймер. 15 минут на ответ
cur_state = bot.get_state(message.from_user.id, message.chat.id)
while datetime.datetime.now() - timedelta(seconds=5) < timestamp:
state = bot.get_state(message.from_user.id, message.chat.id)
if state == cur_state:
continue
else:
return
bot.delete_state(message.from_user.id, message.chat.id)
session.pop(message.chat.id)
bot.send_message(message.chat.id, "timeout")
class MyStates(StatesGroup):
# Just name variables differently
location = State() # creating instances of State class is enough from now
emp_name = State()
rate = State()
comment = State()
contacts = State()
session = {}
@bot.message_handler(commands=['start'])
def welcome(message):
session[message.chat.id] = {}
timestamp = datetime.datetime.now().strftime("%m%d%y%H%M")
session[message.chat.id]['timestamp'] = timestamp
bot.set_state(message.from_user.id, MyStates.location, message.chat.id)
bot.send_message(message.chat.id, 'Здравствуйте, О какой локации хотите оставить отзыв?',
reply_markup=m.location_markup)
timeout(message)
@bot.message_handler(state=MyStates.location)
def form_name(message):
session[message.chat.id]['location'] = message.text + '",'
bot.set_state(message.from_user.id, MyStates.emp_name, message.chat.id)
bot.send_message(message.chat.id, "Как звали сотрудника которые вас обслуживал", reply_markup=m.hide_board)
timeout(message)
@bot.message_handler(state=MyStates.emp_name)
def form_rate(message):
if message.content_type != "text":
bot.send_message(message.chat.id, "Введите корректное имя сотрудника")
bot.set_state(message.from_user.id, MyStates.location, message.chat.id)
else:
session[message.chat.id]['emp_name'] = message.text + '",'
bot.set_state(message.from_user.id, MyStates.rate, message.chat.id)
bot.send_message(message.chat.id, "Как вы оценивайте обслуживание", reply_markup=m.rate_markup)
timeout(message)
@bot.callback_query_handler(func=lambda call: True, state=MyStates.rate, )
def callback(call):
bot.set_state(call.message.from_user.id, MyStates.comment, call.message.chat.id)
session[call.message.chat.id]['rate'] = call.data + '",'
bot.answer_callback_query(call.id)
bot.send_message(call.message.chat.id,
"Пожалуйста, оставьте ваши комментарии по обслуживанию, а также пожелания и предложения")
@bot.message_handler(state=MyStates.comment)
def form_comment(message):
session[message.chat.id]['comment'] = message.text + '",'
bot.set_state(message.from_user.id, MyStates.contacts, message.chat.id)
bot.send_message(message.chat.id, "И последнее, укажите ваши контакты, чтобы мы могли с вами связаться")
timeout(message)
@bot.message_handler(state=MyStates.contacts)
def end(message):
session[message.chat.id]['contact'] = message.text + '",'
hash_res = str(message.chat.id) + str(session.get('timestamp'))
name = abs(hash(hash_res) % (10 ** 10))
with open(str(name) + ".json", "a+") as file:
file.write('{' + '\n')
for key in session[message.chat.id]:
file.write('"' + key + '":' + '"' + session[message.chat.id][key] + '\n')
file.write('}')
bot.delete_state(message.from_user.id, message.chat.id)
session.pop(message.chat.id)
bot.send_message(message.chat.id, "Спасибо")
bot.add_custom_filter(custom_filters.StateFilter(bot))
bot.infinity_polling()