DispelEvilBot/bot/handlers/member_events.py

82 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""События участников: добавление бота, вход и выход пользователей."""
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.prod_chat_id, settings.test_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
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
if event.chat.id == settings.test_chat_id:
return
await users_service.delete_user(user.id)
logger.info("Удалён пользователь %s после выхода из чата", user.id)
try:
await event.bot.send_message(
chat_id=settings.test_chat_id,
text=f"[goodbye_handler]\nУдалил {user.username or user.id}!",
)
if settings.alert_chat_id:
await event.bot.send_message(
chat_id=settings.alert_chat_id,
text=f"Пользователь {user.username or user.id} покинул чат {event.chat.title}",
)
except Exception:
logger.exception("Не удалось отправить уведомление о выходе пользователя")