v1.25 Приветствие новых участников

🎉 ПРИВЕТСТВИЕ:
• Бот встречает новых участников
• Отправляет привет в личку
• Рассказывает про ЖК Ленком 37
• Инструкция по верификации
• Полезные команды

📁 ФАЙЛЫ:
• handlers/users.py: welcome_new_member
• router.chat_member: LEFT → MEMBER

🚀 АКТИВАЦИЯ:
• QR код на объявлениях
• Новые жильцы в чате
• Автоматическое приветствие

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
Admin 2026-03-13 15:34:46 +04:00
parent 377b061ac9
commit b7d9508e56

View file

@ -5,8 +5,9 @@
import logging
import json
from aiogram import Router, F
from aiogram.types import Message, CallbackQuery
from aiogram.filters import Command, CommandStart
from aiogram.types import Message, CallbackQuery, ChatMemberUpdated, BotCommand
from aiogram.filters import Command, CommandStart, ChatMemberFilter, MEMBER
from aiogram.enums import ChatMemberStatus
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from database.db import AsyncSessionLocal
@ -85,47 +86,47 @@ async def cmd_start(message: Message):
user.first_name = message.from_user.first_name
user.last_name = message.from_user.last_name
# Проверяем статус
is_admin = user.is_admin or (user_id == config.ADMIN_USER_ID)
is_superadmin = (user_id == config.ADMIN_USER_ID)
# Проверяем статус
is_admin = user.is_admin or (user_id == config.ADMIN_USER_ID)
is_superadmin = (user_id == config.ADMIN_USER_ID)
if user.verified:
# Проверяем членство в инициативной группе
from database.models import InitiativeGroup
ig_stmt = select(InitiativeGroup).where(
InitiativeGroup.user_id == user_id,
InitiativeGroup.is_active == True
)
ig_result = await session.execute(ig_stmt)
ig_member = ig_result.scalar_one_or_none()
is_ig = ig_member is not None
if user.verified:
# Проверяем членство в инициативной группе
from database.models import InitiativeGroup
ig_stmt = select(InitiativeGroup).where(
InitiativeGroup.user_id == user_id,
InitiativeGroup.is_active == True
)
ig_result = await session.execute(ig_stmt)
ig_member = ig_result.scalar_one_or_none()
is_ig = ig_member is not None
# Определяем уровень
if is_superadmin:
level = 'superadmin'
header = '🟣 <b>УПРАВЛЕНИЕ СИСТЕМОЙ</b>'
elif is_admin:
level = 'admin'
header = '🟡 <b>АДМИН-ПАНЕЛЬ</b>'
elif is_ig:
level = 'ig'
header = '🔵 <b>ИНИЦИАТИВНАЯ ГРУППА</b>'
else:
level = 'verified'
header = '🟢 <b>ДОСТУП РАЗРЕШЁН</b>'
await message.answer(
f'{header}\n\n'
f'👋 Здравствуйте, {message.from_user.first_name}!\n\n'
f'{get_level_badge(level)}\n\n'
f'✅ Вы верифицированы (кв. {user.apartment}).\n'
f'Выберите действие:',
reply_markup=get_main_menu(verified=True, is_ig=is_ig, is_admin=is_admin, is_superadmin=is_superadmin),
parse_mode='HTML'
)
# Определяем уровень
if is_superadmin:
level = 'superadmin'
header = '🟣 <b>УПРАВЛЕНИЕ СИСТЕМОЙ</b>'
elif is_admin:
level = 'admin'
header = '🟡 <b>АДМИН-ПАНЕЛЬ</b>'
elif is_ig:
level = 'ig'
header = '🔵 <b>ИНИЦИАТИВНАЯ ГРУППА</b>'
else:
# Неверифицированный — подробная инструкция (БЕЗ <font>!)
verify_text = f'''🔴 <b>ТРЕБУЕТСЯ ВЕРИФИКАЦИЯ</b>
level = 'verified'
header = '🟢 <b>ДОСТУП РАЗРЕШЁН</b>'
await message.answer(
f'{header}\n\n'
f'👋 Здравствуйте, {message.from_user.first_name}!\n\n'
f'{get_level_badge(level)}\n\n'
f'✅ Вы верифицированы (кв. {user.apartment}).\n'
f'Выберите действие:',
reply_markup=get_main_menu(verified=True, is_ig=is_ig, is_admin=is_admin, is_superadmin=is_superadmin),
parse_mode='HTML'
)
else:
# Неверифицированный — подробная инструкция
verify_text = f'''🔴 <b>ТРЕБУЕТСЯ ВЕРИФИКАЦИЯ</b>
👋 Здравствуйте, {message.from_user.first_name}!
@ -153,13 +154,13 @@ async def cmd_start(message: Message):
💡 <b>Нужна помощь?</b>
Напишите администратору чата.'''
await message.answer(
verify_text,
reply_markup=get_unverified_menu(),
parse_mode='HTML'
)
await message.answer(
verify_text,
reply_markup=get_unverified_menu(),
parse_mode='HTML'
)
await session.commit()
await session.commit()
@router.message(Command('помощь'))
@ -1118,3 +1119,63 @@ async def cmd_edit_user(message: Message):
'\n'.join(f'{item}' for item in updated),
parse_mode='HTML'
)
# =============================================================================
# ПРИВЕТСТВИЕ НОВЫХ УЧАСТНИКОВ
# =============================================================================
@router.chat_member(ChatMemberFilter(ChatMemberStatus.LEFT, ChatMemberStatus.MEMBER))
async def welcome_new_member(event: ChatMemberUpdated, bot: Bot):
"""Приветствие нового участника группы"""
from aiogram.exceptions import TelegramForbiddenError
user = event.from_user
chat = event.chat
logger.info(f'Новый участник в чате {chat.title}: {user.first_name} (@{user.username})')
# Отправляем привет в личку
try:
bot_username = (await bot.get_me()).username
welcome_text = f'''🏠 <b>Добро пожаловать в чат ЖК "Ленком 37"!</b>
👋 Привет, {user.first_name}!
Я домовой бот нашего дома.
📋 <b>Что здесь происходит:</b>
Общение соседей
Объявления и новости
Вопросы по ЖКХ
Взаимопомощь
<b>Чтобы получить полный доступ:</b>
1. Напиши мне в личку: @{bot_username}
2. Отправь номер квартиры (например: <code>45</code>)
3. Дождись подтверждения админа
📞 <b>Полезные команды:</b>
/телефон Экстренные службы
/мастера Сантехники, электрики
/участковый Контакты полиции
/график Отключения воды/света
/правила Правила чата
💡 <b>Нужна помощь?</b>
Напишите администратору чата.
🎉 <b>Рады видеть вас в нашем сообществе!</b>'''
await bot.send_message(
chat_id=user.id,
text=welcome_text,
parse_mode='HTML'
)
logger.info(f'Приветствие отправлено {user.id}')
except TelegramForbiddenError:
logger.warning(f'Не удалось отправить приветствие {user.id} (закрыт от ботов)')
except Exception as e:
logger.error(f'Ошибка при отправке приветствия: {e}')