Как с message хендлера перейти в query?
Возник вопрос - как реализовать переход с message хендлера на квери? Концепт следующий - пользователь вводит ФИО, далее message хендлер это обрабатывает, и должен дать сигнал другому хендлеру, что пользователь правильно ввел свое фио, и функция в этом хендлере заносит человека в бд. Если неправильное ФИО - то код возвращается в начало
Код:
@dp.callback_query_handler(text="vipcount")
async def checkname(query: CallbackQuery):
keyboard = InlineKeyboardMarkup(row_width=1).add(
InlineKeyboardButton(text="Назад", callback_data="Купить билет")
)
await query.message.answer("Введите свое ФИО")
await InputData.input_fio.set()
@dp.message_handler(state=InputData.input_fio)
async def process_name(message: types.Message, state: FSMContext):
print("od")
keyboard = InlineKeyboardMarkup(row_width=1).add(
InlineKeyboardButton(text="Продолжить оплату", callback_data="vipfinally"),
InlineKeyboardButton(text="Назад", callback_data="vipcount")
)
global teleid
global xd
teleid = message.from_user.id
xd = message.text
if xd == "/start":
return
print("od")
await bot.send_message(
message.chat.id,
md.text(
md.text("Проверьте данные"),
md.text("Ваше имя -", md.bold(xd))
),
parse_mode = ParseMode.MARKDOWN, reply_markup=keyboard
)
await InputData.next()
@dp.callback_query_handler(text="Продолжить оплату")
async def vipfin(query: CallbackQuery):
print("okkkk")
conn = await aiomysql.connect(host='localhost', port=3306, user='root', password='',
db='aiodb',
loop=loop)
cur = await conn.cursor()
sql = "SELECT name FROM users WHERE teleid=(%s)"
await cur.execute(sql, (teleid))
row = await cur.fetchone()
name = xd
print(row)
row = row[0]
print("olk")
teled = teleid
start_sql = "UPDATE users set name = (%s) where teleid=(%s)"
conn = await aiomysql.connect(host='localhost', port=3306, user='root', password='',
db='aiodb',
loop=loop)
cur = await conn.cursor()
await cur.execute(start_sql, (name, teled))
await conn.commit()
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Собственно вам кажись не нужно возвращаться в колбек (кстати это невозможно).
Просто оставьте юзера в том же стейте в котором он вводил фио и в зависимости от введенных данных либо пишите что всё ок и закрываете стейт, либо не трогаете стейт и сообщаете юзеру что он неверно ввел фио.
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
from data import config
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
class InputFio(StatesGroup):
FIO = State()
@dp.message_handler(commands=["start"])
async def start(message: types.Message):
await message.answer("Введите ФИО")
await InputFio.FIO.set()
@dp.message_handler(state=InputFio.FIO)
async def get_FIO(message: types.Message, state: FSMContext):
if message.text == "lalala":
await state.finish()
# заносим в бд
...
else:
await message.answer("неверно! Введите ФИО правильно!")
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)