90 lines
3.2 KiB
Python
90 lines
3.2 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 alerts
|
|
from bot.services import users as users_service
|
|
from common.analytics import EventType, record
|
|
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)
|
|
await alerts.notify_join(
|
|
event.bot,
|
|
username=user.username,
|
|
user_id=user.id,
|
|
chat_title=event.chat.title or "",
|
|
)
|
|
|
|
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:
|
|
"""Пользователь вышел из чата — удалить запись."""
|
|
user = event.from_user
|
|
if user is None or user.is_bot:
|
|
return
|
|
|
|
record(
|
|
EventType.LEAVE,
|
|
user_id=user.id,
|
|
username=user.username,
|
|
chat_id=event.chat.id,
|
|
payload={"chat_title": event.chat.title or ""},
|
|
)
|
|
await users_service.delete_user(user.id)
|
|
logger.info("Удалён пользователь %s после выхода из чата", user.id)
|
|
|
|
await alerts.notify_leave(
|
|
event.bot,
|
|
username=user.username,
|
|
user_id=user.id,
|
|
chat_title=event.chat.title or "",
|
|
)
|