"""События участников: добавление бота, вход и выход пользователей.""" from __future__ import annotations import logging from aiogram import Router from aiogram.filters import JOIN_TRANSITION, LEAVE_TRANSITION, ChatMemberUpdatedFilter from aiogram.types import ChatMemberUpdated, FSInputFile from aiogram.utils.keyboard import InlineKeyboardBuilder from bot.services import users as users_service from common.config import get_settings from common.texts import system, welcome from common.texts.render import render logger = logging.getLogger(__name__) router = Router(name="member_events") @router.my_chat_member(ChatMemberUpdatedFilter(member_status_changed=JOIN_TRANSITION)) async def bot_added_handler(event: ChatMemberUpdated) -> None: """Бот добавлен в чат.""" settings = get_settings() if event.chat.id not in {settings.chat_id, settings.alert_chat_id}: await event.bot.send_message(chat_id=event.chat.id, text=system.MSG_BOT_FOREIGN_CHAT) await event.bot.leave_chat(event.chat.id) else: await event.bot.send_message(chat_id=event.chat.id, text=system.MSG_BOT_ADDED) @router.chat_member(ChatMemberUpdatedFilter(member_status_changed=JOIN_TRANSITION)) async def welcome_handler(event: ChatMemberUpdated) -> None: """Пользователь вошёл в чат — приветствие.""" user = event.new_chat_member.user if user.is_bot: return if event.chat.id != get_settings().chat_id: return await users_service.register_from_event(event) builder = InlineKeyboardBuilder() builder.button(text=welcome.MSG_WELCOME_BUTTON_CAPTION, url=welcome.MSG_WELCOME_BUTTON_URL) await event.bot.send_photo( chat_id=event.chat.id, photo=FSInputFile("images/welcome_image.jpg"), caption=render(welcome.MSG_WELCOME_TEXT, {"username": user.username}), ) await event.bot.send_message( chat_id=event.chat.id, text=welcome.MSG_WELCOME_TEXT2, reply_markup=builder.as_markup(), ) await event.bot.send_message(chat_id=event.chat.id, text=welcome.MSG_WELCOME_TEXT3) @router.chat_member(ChatMemberUpdatedFilter(member_status_changed=LEAVE_TRANSITION)) async def goodbye_handler(event: ChatMemberUpdated) -> None: """Пользователь вышел из чата — удалить запись.""" settings = get_settings() user = event.from_user if user is None or user.is_bot: return await users_service.delete_user(user.id) logger.info("Удалён пользователь %s после выхода из чата", user.id) if not settings.alert_chat_id: return try: await event.bot.send_message( chat_id=settings.alert_chat_id, text=f"[goodbye] {user.username or user.id} покинул чат {event.chat.title}", ) except Exception: logger.exception("Не удалось отправить уведомление о выходе пользователя")