Возможно ли получить активное состояние из FSMcontext в Middleware Aiogram
Задача получить в Middleware доступ к запущенным состояниям через класс FSMContext, для того что бы определять есть ли активные состояния, или нет. Вообще то что я хочу сделать осуществимо, или нет?
import asyncio
import logging
import sys
from aiogram import Bot, Dispatcher
from aiogram.types import Message, FSInputFile
from aiogram.filters import CommandStart
from aiogram.client.default import DefaultBotProperties
from aiogram.fsm.context import FSMContext
from tokens import token_bot
from keyboards import categories_button
from Routers.main_category import main_category
from Routers.category_participant import category_participant
from Routers.category_beginner import category_beginner
from Routers.category_society import category_society
from Routers.feed_back import feed_back_router
from DataBase.create_database import create_table
from middleware import CounterMiddleware
from aiogram import BaseMiddleware
from aiogram.types import Message
from aiogram.fsm.context import FSMContext
from typing import Callable, Dict, Awaitable, Any
class CounterMiddleware(BaseMiddleware):
def __init__(self, state: FSMContext) -> None:
self.state = state.get_state()
async def __call__(
self,
handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]],
event: Message,
data: Dict[str, Any]
) -> Any:
print(self.state)
return await handler(event, data)
bot = Bot(token=token_bot, default=DefaultBotProperties(parse_mode='HTML'))
dp = Dispatcher()
dp.include_routers(main_category, category_participant, category_beginner,
feed_back_router, category_society)
state = FSMContext
dp.message.outer_middleware(CounterMiddleware(FSMContext))
@dp.message(CommandStart())
async def get_category(message: Message):
await message.answer(text='Hello')
async def main():
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
if __name__ == '__main__':
logging.basicConfig(
level=logging.INFO,
stream=sys.stdout,
format="%(asctime)s - [%(levelname)s] - %(name)s - "
"(%(filename)s).%(funcName)s(%(lineno)d) - %(message)s"
)
asyncio.run(main())
Ответы (1 шт):
Автор решения: ali
→ Ссылка
Такую идею смог реализовать только через фильтр, но вот через Middleware пока не получается. В этом фильтре я получаю данные из FSMContext, после чего проверяю есть ли какие-либо данные под ключом "message_id", или нет и дальше удаляю сообщение, но меня интересует возможно ли получить доступ к классу FSMContext, через Middleware.
from aiogram import Bot
from aiogram.fsm.context import FSMContext
from aiogram.filters import Filter
from aiogram.types import Message
class CheckState(Filter):
async def __call__(
self,
message: Message,
bot: Bot,
state: FSMContext) -> bool:
self.message_id = await state.get_data()
if not self.message_id.get('message_id') is None:
await bot.delete_message(
chat_id=message.chat.id,
message_id=self.message_id['message_id']
)
state.get_state().close()
await message.delete()
return True