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}')