import logging from aiogram.types import ChatMemberUpdated from src import dependencies from src.controller.telegram_callback import telegram_callback_router log = logging.getLogger(__name__) @telegram_callback_router.chat_member() async def on_chat_member_updated(event: ChatMemberUpdated) -> None: if event.chat.type not in {'channel', 'supergroup'}: return if not event.from_user: log.error('Failed to get user data from chat member update') return old_status = event.old_chat_member.status new_status = event.new_chat_member.status # Проверяем что пользователь присоединился к каналу was_not_member = old_status in ('left', 'kicked') is_now_member = new_status in ('member', 'administrator', 'creator') user_joined = was_not_member and is_now_member # Проверяем что пользователь покинул канал was_member = old_status in ('member', 'administrator', 'creator', 'restricted') is_now_not_member = new_status in ('left', 'kicked') user_left = was_member and is_now_not_member usecase = dependencies.get_usecase() if user_joined: invite_link = event.invite_link.invite_link if event.invite_link else None if not invite_link: log.debug('No invite_link in chat member update event') return await usecase.handle_subscription( user_telegram_id=event.from_user.id, username=event.from_user.username, invite_link=invite_link ) elif user_left: await usecase.handle_unsubscription(user_telegram_id=event.from_user.id, channel_telegram_id=event.chat.id)