Cat

AIOgram3 8.1 Команда отправки файла

В этом посте начнём писать функцию для отправки файла пользователю через Telegram. В этой функции будет использоваться машина состояний.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Telegram-бот на AIOgram3 proDream 15 Август 2023 Просмотров: 2134

Работы много, по этому без лишних слов, приступим!

В пакете 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, являющийся фильтром.

 

Что тут происходит? 

При вызове команды, запускается машина состояний, тем самым все вводимые команды будут проигнорированы, а сообщения будут обработаны так, как этого требует логика.
После того как запустилась машина, пользователю отправляется сообщение, о необходимости ввести код и до тех пор, пока пользователь не отправит сообщение, перехода на следующий шаг не будет. 

Когда пользователь отправит сообщение, машина сменит состояние на следующую функцию.

Автор

    Нет комментариев

    Реклама