Аналог сцен из telegraf (js) в python
Потрогал NodeJS с разработкой ботов под телеграм.
Очень сильно понравились сцены. Они невероятно удобные.
Есть ли их аналог в python?
Вообще, ориентируюсь под aiogram, но если они есть в других либрах, то тоже буду рад узнать о них.
UPD 1:
Пример кода сцены:
on_welcome(){
const _scene = new Scene('welcome')
_scene.enter(async (ctx) => {
await ctx.reply(core.msg['ru']['on_welcome'].format(name=ctx.from.username))
})
_scene.on('text', async (ctx) => {
if (ctx.message.text) {
//...
_scene.leave();
}else{
//...
_scene.reenter()
}
})
//...
}
То-есть, посылаем enter message, потом ставим listener на text и уже в хандлере мы можем либо запустить сцену заново из-за, допустим, некорректных данных, либо выйти со сцены.
Я очень долго бьюсь с этой проблемой в python и так и не нашел объективно простого и правильного решения.
В python у меня реализовано через events:
@dp.message_handler()
async def on_any(message: Message):
user = get_user(message.from_user.id) # Получаем юзера из БД
event: Event = get_user_event(message.from_user.id) # Получаем возможный event юзера
if event:
if event.type == 'get_access':
if VK.is_token_valid(message.text):
if user:
update_user_token(message.text, user)
else:
add_user(User(token=message.text, tg_id=message.from_user.id))
del_event(id=message.from_user.id) # Аналог _scene.leave()
await message.answer(text=msg['on_good_token'], reply_markup=collect_new_pack())
else:
await message.answer(text=msg['on_bad_token'])
elif event.type == 'await_sticker':
# ...
То-есть, юзер нажал на кнопку регистрации и должен отправить токен, допустим.
Моя реализация говорит о том, что на юзера вешается event get_access.
И в общем хандлеере всех сообщений я прохожусь по всем возможным event'am.