Как принять несколько фотографий одним хендлером?
Мой код должен получить id канала из которого переслано сообщение. Но при пересылке ОДНОГО сообщения с НЕСКОЛЬКИМИ фотографиями, хендлер срабатывает несколько раз, а должен ОДИН.
Помогите с решением проблемы, если возможно при помощи middleware..
Вот код моего хендлера:
@CHANNEL_ROUTER.message(ChannelsAddStates.wait_mail)
async def new_channel_mail(
message: Message,
state: FSMContext,
language: str
):
try:
channel_id, name = str(message.forward_from_chat.id), message.forward_from_chat.full_name
print(await bot.BOT.get_chat_administrators(channel_id))
if channel_id is not None and not CHANNELS.get_one_by('id', channel_id):
if check_admin.check_admin((await bot.BOT.get_me()).id,
await bot.BOT.get_chat_administrators(channel_id)):
await message.answer(generate_messages.new_channel_connected_message(language))
CHANNELS.channel_register(channel_id, str(message.from_user.id), name)
await state.clear()
else:
await message.answer(generate_messages.new_channel_error_message(language))
else:
await message.answer(generate_messages.new_channel_error_message(language))
except Exception:
await message.answer(generate_messages.new_channel_error_message(language))
Ответы (1 шт):
Автор решения: Артём Кустов
→ Ссылка
Я нашел решение, если кому то надо будет, то вот:
import time
from aiogram.types import Message
from core.database.management.users import Users
from typing import Any, Awaitable, Callable, Dict
from aiogram import BaseMiddleware
from aiogram.dispatcher.middlewares.error import CancelHandler
USERS = Users()
lats_calls = {}
# Обработка всех сообщений
class AlbumMiddleware(BaseMiddleware):
def __init__(self) -> None:
pass
async def __call__(
self,
handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]],
event: Message,
data: Dict[str, Any]
) -> Any:
try:
last_call = lats_calls[event.from_user.id]
if (time.time() - last_call) > 0.3: # это разница времени между сообщениями
lats_calls[event.from_user.id] = time.time()
return await handler(event, data)
else:
CancelHandler()
except Exception:
lats_calls[event.from_user.id] = time.time()
return await handler(event, data)