Перейти к контенту

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

Telegram-бот на AIOgram3 Иван Ашихмин 2778

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

AIOgram3 8.1 Команда отправки файла
Telegram-бот на AIOgram3 Иван Ашихмин 2778

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

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

 

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

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

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

Аватар автора

Автор

Иван Ашихмин

Программист, фрилансер и автор гайдов. Занимаюсь разработкой ботов, сайтов и не только.

Войдите, чтобы оставить комментарий.

Комментариев пока нет.