diff --git a/handlers/users.py b/handlers/users.py index 92844e7..79304c2 100644 --- a/handlers/users.py +++ b/handlers/users.py @@ -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 @@ -84,48 +85,48 @@ async def cmd_start(message: Message): user.username = message.from_user.username 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) + + 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 - # Проверяем статус - 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 is_superadmin: - level = 'superadmin' - header = '🟣 УПРАВЛЕНИЕ СИСТЕМОЙ' - elif is_admin: - level = 'admin' - header = '🟡 АДМИН-ПАНЕЛЬ' - elif is_ig: - level = 'ig' - header = '🔵 ИНИЦИАТИВНАЯ ГРУППА' - else: - level = 'verified' - header = '🟢 ДОСТУП РАЗРЕШЁН' - - 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 = '🟣 УПРАВЛЕНИЕ СИСТЕМОЙ' + elif is_admin: + level = 'admin' + header = '🟡 АДМИН-ПАНЕЛЬ' + elif is_ig: + level = 'ig' + header = '🔵 ИНИЦИАТИВНАЯ ГРУППА' else: - # Неверифицированный — подробная инструкция (БЕЗ !) - verify_text = f'''🔴 ТРЕБУЕТСЯ ВЕРИФИКАЦИЯ + level = 'verified' + header = '🟢 ДОСТУП РАЗРЕШЁН' + + 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'''🔴 ТРЕБУЕТСЯ ВЕРИФИКАЦИЯ 👋 Здравствуйте, {message.from_user.first_name}! @@ -152,14 +153,14 @@ async def cmd_start(message: Message): 💡 Нужна помощь? Напишите администратору чата.''' - - await message.answer( - verify_text, - reply_markup=get_unverified_menu(), - parse_mode='HTML' - ) - await session.commit() + await message.answer( + verify_text, + reply_markup=get_unverified_menu(), + parse_mode='HTML' + ) + + await session.commit() @router.message(Command('помощь')) @@ -1114,7 +1115,67 @@ async def cmd_edit_user(message: Message): f'✅ Профиль обновлён!\n\n' f'👤 {name}\n' f'🔖 ID: {user_id}\n\n' - f'Обновлено:\n' + + f'Обновлено:\n' + '\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'''🏠 Добро пожаловать в чат ЖК "Ленком 37"! + +👋 Привет, {user.first_name}! + +Я — домовой бот нашего дома. + +📋 Что здесь происходит: +• Общение соседей +• Объявления и новости +• Вопросы по ЖКХ +• Взаимопомощь + +✅ Чтобы получить полный доступ: +1. Напиши мне в личку: @{bot_username} +2. Отправь номер квартиры (например: 45) +3. Дождись подтверждения админа + +📞 Полезные команды: +/телефон — Экстренные службы +/мастера — Сантехники, электрики +/участковый — Контакты полиции +/график — Отключения воды/света +/правила — Правила чата + +💡 Нужна помощь? +Напишите администратору чата. + +🎉 Рады видеть вас в нашем сообществе!''' + + 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}')