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)