subscription.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  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. class UserSubscriptionMiddleware(BaseMiddleware):
  8. def __init__(
  9. self, responses_port: UserResponsesPort, channel_ids: Iterable[ChatIdUnion]
  10. ):
  11. super().__init__()
  12. self._responses_port = responses_port
  13. self._channel_ids = channel_ids
  14. async def __call__(self, handler, event, data):
  15. message = getattr(event, "message", None)
  16. if (
  17. isinstance(message, Message)
  18. and message.chat.type == ChatType.PRIVATE
  19. and message.from_user
  20. and message.bot
  21. ):
  22. user_id = message.from_user.id
  23. for channel_id in self._channel_ids:
  24. member = await message.bot.get_chat_member(channel_id, user_id)
  25. if member.status in (ChatMemberStatus.KICKED, ChatMemberStatus.LEFT):
  26. await self._responses_port.user_subscription_required(
  27. RequestContext(message.chat.id, data["user_language"])
  28. )
  29. return
  30. return await handler(event, data)