79 lines
3.0 KiB
Python
79 lines
3.0 KiB
Python
"""События участников: добавление бота, вход и выход пользователей."""
|
||
|
||
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("Не удалось отправить уведомление о выходе пользователя")
|