Работы много, по этому без лишних слов, приступим!
В пакете handlers
создадим файл send_file.py
и откроем его. Так же сразу откроем файл main.py
, views.py
и statesform.py
. В основном работать будем в send_file.py
, но другие три тоже будут нужны.
Команда отправки файла.
В файле send_file.py
создадим асинхронную функцию send_file_start
, в качестве аргументов она будет получать объект типа Message
и FSMContext
.

FSMContext
- это асинхронный контекст, который хранит информацию о текущем состоянии пользователя во время работы Telegram-бота. Он предоставляет функции для переключения между состояниями, сохранения и извлечения данных, а также другие операции, связанные с управлением состояниями.
Сообщение пользователю.
Перейдём в views.py
и создадим функцию send_file_start_msg
, возвращающую строку с сообщением для пользователя.
def send_file_start_msg():
return """Для получения файла с дополнительными материалами к посту,
пожалуйста введите код из поста."""

Состояния.
Теперь перейдём в файл statesform.py
и создадим класс SendFileSteps
унаследованный от StatesGroup
.
Пропишем первое поле, он же шаг в машине состояний.
from aiogram.fsm.state import StatesGroup, State
class SendFileSteps(StatesGroup):
get_code_from_user = State()

Тело функции send_file_start
.
Вернёмся в send_file.py
и в теле функции напишем отправку сообщения пользователю и переход к следующему шагу.
from aiogram.fsm.context import FSMContext
from aiogram.types import Message
from botlogic import views
from botlogic.utils.statesform import SendFileSteps
async def send_file_start(message: Message, state: FSMContext):
await message.answer(views.send_file_start_msg())
await state.set_state(SendFileSteps.get_code_from_user)

Регистрация функции.
Перейдём в файл main.py
и после обработки событий запуска/остановки, зарегистрируем функцию на обработку команды get_file
:
from aiogram.filters import Command
from botlogic.handlers import send_file
dp.message.register(send_file.send_file_start, Command(commands='get_file'))

При регистрации функции echo
, мы не указывали второго параметра, поскольку нам надо было обрабатывать все входящие сообщения. Здесь мы указали вторым параметром объект класса Command
, являющийся фильтром.
Что тут происходит?
При вызове команды, запускается машина состояний, тем самым все вводимые команды будут проигнорированы, а сообщения будут обработаны так, как этого требует логика.
После того как запустилась машина, пользователю отправляется сообщение, о необходимости ввести код и до тех пор, пока пользователь не отправит сообщение, перехода на следующий шаг не будет.
Когда пользователь отправит сообщение, машина сменит состояние на следующую функцию.
Комментарии
Оставить комментарийВойдите, чтобы оставить комментарий.
Комментариев пока нет.