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:
parent
377b061ac9
commit
b7d9508e56
1 changed files with 111 additions and 50 deletions
|
|
@ -5,8 +5,9 @@
|
||||||
import logging
|
import logging
|
||||||
import json
|
import json
|
||||||
from aiogram import Router, F
|
from aiogram import Router, F
|
||||||
from aiogram.types import Message, CallbackQuery
|
from aiogram.types import Message, CallbackQuery, ChatMemberUpdated, BotCommand
|
||||||
from aiogram.filters import Command, CommandStart
|
from aiogram.filters import Command, CommandStart, ChatMemberFilter, MEMBER
|
||||||
|
from aiogram.enums import ChatMemberStatus
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
from database.db import AsyncSessionLocal
|
from database.db import AsyncSessionLocal
|
||||||
|
|
@ -85,47 +86,47 @@ async def cmd_start(message: Message):
|
||||||
user.first_name = message.from_user.first_name
|
user.first_name = message.from_user.first_name
|
||||||
user.last_name = message.from_user.last_name
|
user.last_name = message.from_user.last_name
|
||||||
|
|
||||||
# Проверяем статус
|
# Проверяем статус
|
||||||
is_admin = user.is_admin or (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)
|
is_superadmin = (user_id == config.ADMIN_USER_ID)
|
||||||
|
|
||||||
if user.verified:
|
if user.verified:
|
||||||
# Проверяем членство в инициативной группе
|
# Проверяем членство в инициативной группе
|
||||||
from database.models import InitiativeGroup
|
from database.models import InitiativeGroup
|
||||||
ig_stmt = select(InitiativeGroup).where(
|
ig_stmt = select(InitiativeGroup).where(
|
||||||
InitiativeGroup.user_id == user_id,
|
InitiativeGroup.user_id == user_id,
|
||||||
InitiativeGroup.is_active == True
|
InitiativeGroup.is_active == True
|
||||||
)
|
)
|
||||||
ig_result = await session.execute(ig_stmt)
|
ig_result = await session.execute(ig_stmt)
|
||||||
ig_member = ig_result.scalar_one_or_none()
|
ig_member = ig_result.scalar_one_or_none()
|
||||||
is_ig = ig_member is not None
|
is_ig = ig_member is not None
|
||||||
|
|
||||||
# Определяем уровень
|
# Определяем уровень
|
||||||
if is_superadmin:
|
if is_superadmin:
|
||||||
level = 'superadmin'
|
level = 'superadmin'
|
||||||
header = '🟣 <b>УПРАВЛЕНИЕ СИСТЕМОЙ</b>'
|
header = '🟣 <b>УПРАВЛЕНИЕ СИСТЕМОЙ</b>'
|
||||||
elif is_admin:
|
elif is_admin:
|
||||||
level = 'admin'
|
level = 'admin'
|
||||||
header = '🟡 <b>АДМИН-ПАНЕЛЬ</b>'
|
header = '🟡 <b>АДМИН-ПАНЕЛЬ</b>'
|
||||||
elif is_ig:
|
elif is_ig:
|
||||||
level = 'ig'
|
level = 'ig'
|
||||||
header = '🔵 <b>ИНИЦИАТИВНАЯ ГРУППА</b>'
|
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'
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
# Неверифицированный — подробная инструкция (БЕЗ <font>!)
|
level = 'verified'
|
||||||
verify_text = f'''🔴 <b>ТРЕБУЕТСЯ ВЕРИФИКАЦИЯ</b>
|
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}!
|
👋 Здравствуйте, {message.from_user.first_name}!
|
||||||
|
|
||||||
|
|
@ -153,13 +154,13 @@ async def cmd_start(message: Message):
|
||||||
💡 <b>Нужна помощь?</b>
|
💡 <b>Нужна помощь?</b>
|
||||||
Напишите администратору чата.'''
|
Напишите администратору чата.'''
|
||||||
|
|
||||||
await message.answer(
|
await message.answer(
|
||||||
verify_text,
|
verify_text,
|
||||||
reply_markup=get_unverified_menu(),
|
reply_markup=get_unverified_menu(),
|
||||||
parse_mode='HTML'
|
parse_mode='HTML'
|
||||||
)
|
)
|
||||||
|
|
||||||
await session.commit()
|
await session.commit()
|
||||||
|
|
||||||
|
|
||||||
@router.message(Command('помощь'))
|
@router.message(Command('помощь'))
|
||||||
|
|
@ -1118,3 +1119,63 @@ async def cmd_edit_user(message: Message):
|
||||||
'\n'.join(f'• {item}' for item in updated),
|
'\n'.join(f'• {item}' for item in updated),
|
||||||
parse_mode='HTML'
|
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}')
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue