47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
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)
|