84 lines
2.9 KiB
Python
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)
|