Files
tgex-backend/src/controller/telegram_callback/my_chat_member.py
2025-11-10 15:14:19 +03:00

84 lines
2.9 KiB
Python

import logging
from aiogram.types import ChatMemberAdministrator, ChatMemberUpdated
from fastapi import HTTPException
from src import dependencies, dto
from src.controller.telegram_callback import telegram_callback_router
log = logging.getLogger(__name__)
@telegram_callback_router.my_chat_member()
async def on_bot_added_to_chat(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
usecase = dependencies.get_usecase()
old_status = event.old_chat_member.status
new_status = event.new_chat_member.status
# Проверяем что бот был удален
was_member = old_status in ('administrator', 'member')
is_now_not_member = new_status in ('left', 'kicked')
bot_removed = was_member and is_now_not_member
if bot_removed:
disconnect_input = dto.DisconnectTargetChanByTgIdInput(
telegram_id=event.chat.id,
)
try:
await usecase.disconnect_target_chan_by_tg_id(input=disconnect_input)
except HTTPException as e:
log.error(e)
return
# Проверяем изменение прав администратора
permissions_changed = old_status == 'administrator' and new_status == 'administrator'
# Извлекаем права бота из события
new_member = event.new_chat_member
bot_permissions = dto.ChannelBotPermissions(
is_admin=isinstance(new_member, ChatMemberAdministrator),
can_invite_users=getattr(new_member, 'can_invite_users', False),
can_restrict_members=getattr(new_member, 'can_restrict_members', False),
)
if permissions_changed:
permissions_input = dto.UpdateTargetChanPermissionsInput(
telegram_id=event.chat.id,
permissions=bot_permissions,
chat_title=event.chat.title or f'Channel {event.chat.id}',
user_telegram_id=event.from_user.id,
)
try:
await usecase.update_target_chan_permissions(input=permissions_input)
except HTTPException as e:
log.error(e)
return
# Проверяем что бот был добавлен
was_not_member = old_status in ('left', 'kicked')
is_now_member = new_status in ('administrator', 'member')
bot_added = was_not_member and is_now_member
if bot_added:
connect_input = dto.ConnectTargetChanInput(
telegram_id=event.chat.id,
title=event.chat.title or f'Channel {event.chat.id}',
username=event.chat.username,
user_telegram_id=event.from_user.id,
bot_permissions=bot_permissions,
)
try:
await usecase.connect_target_chan(input=connect_input)
except HTTPException as e:
log.error(e)