feat: subs and views
This commit is contained in:
48
src/controller/telegram_callback/chat_member_updated.py
Normal file
48
src/controller/telegram_callback/chat_member_updated.py
Normal file
@@ -0,0 +1,48 @@
|
||||
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:
|
||||
"""
|
||||
Обрабатывает события подписки пользователей в канал через открытую invite_link.
|
||||
|
||||
Событие приходит когда пользователь вступает в канал напрямую (без запроса на вступление).
|
||||
"""
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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,
|
||||
)
|
||||
Reference in New Issue
Block a user