subscription.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from typing import Iterable
  2. from aiogram import BaseMiddleware
  3. from aiogram.enums import ChatMemberStatus, ChatType
  4. from aiogram.types import ChatIdUnion, Message
  5. from anonflow.bot.transport.types import RequestContext
  6. from anonflow.interfaces import UserResponsesPort
  7. from .utils import extract_message, extract_user
  8. class UserSubscriptionMiddleware(BaseMiddleware):
  9. def __init__(
  10. self, responses_port: UserResponsesPort, channel_ids: Iterable[ChatIdUnion]
  11. ):
  12. super().__init__()
  13. self._responses_port = responses_port
  14. self._channel_ids = channel_ids
  15. async def __call__(self, handler, event, data):
  16. message = extract_message(event)
  17. from_user = extract_user(event)
  18. if (
  19. isinstance(message, Message)
  20. and from_user is not None
  21. and message.bot is not None
  22. and message.chat.type == ChatType.PRIVATE
  23. ):
  24. for channel_id in self._channel_ids:
  25. member = await message.bot.get_chat_member(channel_id, from_user.id)
  26. if member.status in (ChatMemberStatus.KICKED, ChatMemberStatus.LEFT):
  27. await self._responses_port.user_subscription_required(
  28. RequestContext(message.chat.id, data["user_language"])
  29. )
  30. return
  31. return await handler(event, data)