@Gajlk

Как правильно использовать FSM в aiogram для обработчика следующего сообщения?

Я хочу создать аналог register_next_step_handler из telebot для alogram. Как я уже понял, для этого я должен использовать FSM. Однако я не могу понять, что мне следует делать на этом примере:

@bot.message_handler(func=lambda message: message.text == " Prohibit publication for a while")
def prohibit_sending_messages_button(message):
    msg = bot.send_message(message.chat.id, "Enter the blocking time in minutes (0 for cancellation; multiply by 60/1440 to indicate hours/days):")
    bot.register_next_step_handler(msg, block_sending_for_minutes)

def block_sending_for_minutes(message):
    global acceptable_time
    # Change acceptable_time value to actual time + chosen time (can be mathematical expression)
    acceptable_time = message.date + eval(message.text) * 60
    bot.send_message(message.chat.id, f"The ban on sending messages will be in effect until {datetime.fromtimestamp(acceptable_time).strftime("%H:%M:%S %d/%m/%Y")}")


Я пробовал написать это:

@router.message(is_admin & F.text == " Prohibit publication for a while")
async def prohibit_sending_messages_button(message: Message, state: FSMContext) -> None:
    await state.set_state(Form.blocking_time)
    await message.answer("Enter the blocking time in minutes (0 for cancellation; multiply by 60/1440 to indicate hours/days):")


@router.message(Form.blocking_time)
async def block_sending_for_minutes(message: Message) -> None:
    global acceptable_time
    # Change acceptable_time value to actual time + chosen time (can be mathematical expression)
    acceptable_time = message.date + eval(await message.text) * 60
    await message.answer(f"The ban on sending messages will be in effect until {datetime.fromtimestamp(acceptable_time).strftime("%H:%M:%S %d/%m/%Y")}")


Мои вопросы:

1. Нужно ли мне создавать для этого отдельный класс, если да, то должен ли я поместить все классы FSM в отдельный файл и как правильно назвать класс и переменную?
2. Нужно ли мне использовать state.clear(), если да, то как мне получить state, если нет, то получается, что я просто больше не использую этот класс?
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
Wispik
@Wispik
1. Нужно ли мне создавать для этого отдельный класс

Да, для стейтов задается отдельный класс
2. Нужно ли мне использовать state.clear()

Конечно нужно, если хочешь сбросить стейты.
если да, то как мне получить state

Также, как ты его получил в первой функции, когда устанавливал значение.
state: FSMContext

Вот почитай, все вопросы должны отпасть

global acceptable_time
глобальные переменные зло. Ты же понимаешь, что значение этой переменной одно для всех юзеров?
eval(await message.text)
а это вообще кошмар)) тут надо просто message.text к инту привести, но не евалом же это делать xD
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы