✅ Регистрация и верификация жильцов ✅ Рейтинг активности (уровни) ✅ Детект шпионов (Score 0-100) ✅ Анти-мат система (3 предупреждения → бан) ✅ Админ-панель с рассылкой ✅ Учёт квартир (несколько жильцов) ✅ Телефоны экстренных служб и мастеров ✅ Еженедельный экспорт JSON ✅ Прокси (socks5) для обхода РКН Бекап: backups/versions/v1.0_mvp_2026-02-26/ Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
"""
|
|
Декораторы для хендлеров
|
|
"""
|
|
from functools import wraps
|
|
from aiogram.types import Message, CallbackQuery
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select
|
|
from database.models import User
|
|
import config
|
|
|
|
|
|
async def get_user_from_db(session: AsyncSession, user_id: int) -> User | None:
|
|
"""Получить пользователя из БД"""
|
|
result = await session.execute(select(User).where(User.user_id == user_id))
|
|
return result.scalar_one_or_none()
|
|
|
|
|
|
def admin_only(func):
|
|
"""Только для администраторов"""
|
|
@wraps(func)
|
|
async def wrapper(message: Message, *args, **kwargs):
|
|
if not config.is_admin(message.from_user.id):
|
|
await message.answer('❌ Эта команда доступна только администраторам')
|
|
return
|
|
return await func(message, *args, **kwargs)
|
|
return wrapper
|
|
|
|
|
|
def verified_only(func):
|
|
"""Только для верифицированных жильцов"""
|
|
@wraps(func)
|
|
async def wrapper(message: Message, *args, **kwargs):
|
|
# Проверяем в БД
|
|
from database.db import AsyncSessionLocal
|
|
from sqlalchemy import select
|
|
from database.models import User
|
|
|
|
async with AsyncSessionLocal() as session:
|
|
user = await get_user_from_db(session, message.from_user.id)
|
|
if not user or not user.verified:
|
|
await message.answer(
|
|
'❗ Для использования этой команды пройдите верификацию\n'
|
|
'Отправьте номер квартиры фото квитанции'
|
|
)
|
|
return
|
|
return await func(message, *args, **kwargs)
|
|
return wrapper
|
|
|
|
|
|
def admin_callback_only(func):
|
|
"""Только для администраторов (callback queries)"""
|
|
@wraps(func)
|
|
async def wrapper(callback: CallbackQuery, *args, **kwargs):
|
|
if not config.is_admin(callback.from_user.id):
|
|
await callback.answer('❌ Только для администраторов', show_alert=True)
|
|
return
|
|
return await func(callback, *args, **kwargs)
|
|
return wrapper
|