feat: handle unsubscribe

This commit is contained in:
Artem Tsyrulnikov
2025-12-01 10:30:31 +03:00
parent c32635839a
commit ca3805eec3
14 changed files with 447 additions and 164 deletions

View File

@@ -10,11 +10,6 @@ log = logging.getLogger(__name__)
@telegram_callback_router.chat_member()
async def on_chat_member_updated(event: ChatMemberUpdated) -> None:
"""
Обрабатывает события подписки пользователей в канал через открытую invite_link.
Событие приходит когда пользователь вступает в канал напрямую (без запроса на вступление).
"""
if event.chat.type not in {'channel', 'supergroup'}:
return
@@ -30,19 +25,22 @@ async def on_chat_member_updated(event: ChatMemberUpdated) -> None:
is_now_member = new_status in ('member', 'administrator', 'creator')
user_joined = was_not_member and is_now_member
if not user_joined:
return
# Получаем invite_link, по которой пользователь присоединился
invite_link = event.invite_link
if not invite_link or not invite_link.invite_link:
log.debug('No invite_link in chat member update event')
return
# Проверяем что пользователь покинул канал
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()
await usecase.handle_subscription(
user_telegram_id=event.from_user.id,
username=event.from_user.username,
invite_link=invite_link.invite_link,
)
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)